6月 29

2015.9.17更新BootStrap版本

调用方式

         <%=this.PaginationHTML(this.PageIndex,this.PAGESIZE,this.TotalRec,a=>"?pageindex="+a)   %>

函数

        /// <summary>
        /// 分页导航代码,基于Bootstrap
        /// </summary>
        /// <param name="PageIndex"></param>
        /// <param name="PageSize"></param>
        /// <param name="TotalRec"></param>
        /// <param name="func"></param>
        /// <returns></returns>
        public string PaginationHTML(int PageIndex, int PageSize, int TotalRec,Func<int,string> func)
        { 

            int totalPage = (TotalRec % PageSize == 0 ? TotalRec / PageSize : TotalRec / PageSize + 1);

            if (totalPage == 1) //如果只有1页则不显示
                return string.Empty;

            StringBuilder sb = new StringBuilder();
            sb.AppendLine("<ul class=\"pagination\">");  
            for (int i = 1; i <=  totalPage; i++)
            {

                if (i == PageIndex)
                    sb.AppendLine(string.Format("<li class=\"active\"><a href=\"{1}\">{0}</a></li>", i, func(i)));
                else
                    sb.AppendLine(string.Format("<li><a href=\"{1}\">{0}</a></li>", i, func(i))); 
            } 
            sb.AppendLine("</ul>");  
            return sb.ToString(); 
        }

在公司里开发一些页面经常要坐分页,做了一个通用点的,备份一下,以后只要copy了

.cs端

using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Web;  
 using System.Web.UI;  
 using System.Web.UI.WebControls;  
 using System.Text;  
 
 namespace WebFormTest
 
 {
 
    public partial class WebForm1 : System.Web.UI.Page
 
    {
 
      public int PageIndex = 1;  
      private int pageSize = 12;  
      private int totalCount = 0;  
      const int PageShowNum = 5;//导航条显示半数
 
      public string CurrentUrl = "WebForm1.aspx";  
 
      private int totalPage
 
      {
 
        get
 
        {
 
          return (totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1);  
        }
 
      }
 
 
      /// <summary>
 
      /// 检查参数
 
      /// </summary>
 
      private void CheckParam()  
      {
 
        if (!int.TryParse(Request.QueryString["pageIndex"], out PageIndex))  
          PageIndex = 1;  
      }
 
 
      protected void Page_Load(object sender, EventArgs e)  
      {
 
        this.CheckParam();  
 
        if (!Page.IsPostBack)  
        {
 
          this.BindData();  
        }
 
      }
 
 
      /// <summary>
 
      /// 绑定展示数据
 
      /// </summary>
 
      private void BindData()  
      {
 
        List<int> list = GetData();//获取数据
 
        this.totalCount = list.Count;  
        PagedDataSource datasource = new PagedDataSource();  
        datasource.AllowPaging = true;  
        datasource.DataSource = list;  
        datasource.PageSize = pageSize;  
        datasource.CurrentPageIndex = PageIndex 1;  
        rpt.DataSource = datasource;  
        rpt.DataBind();  
 
        this.SetPager(PageIndex, totalPage);  
      }
 
 
      /// <summary>
 
      /// 用来获取数据
 
      /// </summary>
 
      /// <returns></returns>
 
      private List<int> GetData()  
      {
 
        List<int> list = new List<int>();
 
        for (int index = 1; index < 1000; index++)
 
        {
 
          list.Add(index);  
        }
 
        return list;  
      }     
    
 
      /// <summary>
 
      /// 设置分页
 
      /// </summary>
 
      /// <param name="currentNum">当前页,也就是PageIndex</param>
 
      /// <param name="totalNum">总页数</param>
 
      private void SetPager(int currentNum, int totalNum)  
      {
 
        int _beginNum = 1, _endNum = 1;  
        _beginNum = PageShowNum < currentNum ? currentNum PageShowNum : 1;  
        if (PageShowNum + currentNum >= totalNum)  
        {
 
          _endNum = totalNum;  
        }
 
        else
 
        {
 
          if (int.Equals(_beginNum, 1))  
          {
 
            _endNum = 2 * PageShowNum + _beginNum;  
          }
 
          else
 
          {
 
            _endNum = PageShowNum + currentNum;  
          }
 
        }
 
        StringBuilder sb = new StringBuilder("&nbsp;&nbsp;");  
 
        if (currentNum > 1)  
        {
 
          sb.AppendFormat(" <a class='f_a' href='{0}'> {1} </a>&nbsp;", CurrentUrl, "首页");  
        }
 
        else if (currentNum == 1)  
        {
 
          sb.Append(" <a class='f_a' > 首页 </a>&nbsp;");  
        }
 
 
        string _className = string.Empty;  
        while (_beginNum <= _endNum)  
        {
 
          if (_beginNum == PageIndex)  
          {
 
            _className = "f_s";  
            sb.AppendFormat(" <a class='{0}' style='color:red' > {1} </a>&nbsp;", PageIndex, _beginNum);  
 
          }
 
          else
 
          {
 
            _className = "f_a";  
            sb.AppendFormat(" <a  href='{0}?pageIndex={1}'> {1} </a>&nbsp;", CurrentUrl, _beginNum);  
          }
 
          _beginNum++;
 
        }
 
 
        if (currentNum < totalNum)  
        {
 
          sb.AppendFormat(" <a href='{0}?pageIndex={1}'> {2} </a>&nbsp;",CurrentUrl,totalNum,"尾页");  
       
        }
 
        else if (currentNum == totalNum)  
        {
 
          sb.Append(" <a class='f_a' > 尾页 </a>&nbsp;");  
        }
 
        sb.Append("<input type='text' id='txtPageIndex' style='width:40px;font-size:12px'  onKeyPress='return Page.GoEnter(event)' /> 页 <input type='button' onclick='return Page.GoPage()' value='GO' />");  
        sb.AppendFormat("&nbsp;&nbsp;&nbsp;&nbsp;{0}/{1} 页  共 {2} 篇", currentNum, totalNum, totalCount);  
 
        ltrPage.Text = sb.ToString();  
 
        ClientScript.RegisterClientScriptBlock(Page.GetType(), "ChannelArray", "var totalPage=" + totalNum + ";\r\n", true);  
      }
 
 
    }
 
 }
 

.aspx页面代码

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebFormTest.WebForm1" %>
 
 
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
 <html xmlns="http://www.w3.org/1999/xhtml">
 
 <head runat="server">
 
    <title></title>
 
 </head>
 
 <body>
 
    <form id="form1" runat="server">
 
    <div>
 
      <asp:Repeater ID="rpt" runat="server">
 
        <ItemTemplate>
 
          <%# Container.DataItem.ToString() %>
 
          <br />
 
        </ItemTemplate>
 
      </asp:Repeater>
 
      <br />
 
      <asp:Literal ID="ltrPage" runat="server" />
 
    </div>
 
    <script type="text/javascript">
 
      (function (win) {
 
        if (!win.Page) {
 
          var Page = {
 
            GoPage: function () {
 
              var page = document.getElementById("txtPageIndex").value;  
              if (page.length === 0) {
 
                alert("请您输入页码");  
                return false;  
              };
 
              var IsNum = function () {
 
                var strNum = '1234567890';  
                var isNum = true;  
                for (var i = 0; i < page.length; i += 1) {
 
                  var c = page.charAt(i);  
                  if (strNum.indexOf(c) < 0) {
 
                    isNum = false;  
                    break;  
                  };
 
                };
 
                return isNum;  
              }
 
              if (IsNum()) {
 
                if (parseInt(page) > totalPage && parseInt(page) > 1) {
 
                  alert("您输入的页数超过总页数,请重新输入!");  
                  return false;  
                };
 
                var currentUrl = "<%=CurrentUrl %>" + "?pageIndex=" + page;  
                location.href = currentUrl;  
                return false;  
              } else {
 
                alert("您输入的信息有误,请重新输入!");  
              }
 
 
            },
 
            GoEnter: function (evt) {
 
              evt = evt || window.event;  
              if (evt && evt.keyCode == 13)  
                return Page.GoPage();  
            }
 
          }
 
          win.Page = Page;  
        }
 
        document.getElementById("txtPageIndex").value = "<%=PageIndex %>";  
      })(window);  
    </script>
 
    </form>
 
 </body>
 
 </html>
 

written by ocean

6月 28

 在IE6下,如果重复使用了一个图片作为背景,那么每用一次就会重新去服务器拉一次。。。
这样如果访问量很大的话,会给服务器带来巨大的压力。这该死的bug。微软也不出个补丁修改一下。
以下方法可解决(让IE6缓存背景图片):
document.execCommand("BackgroundImageCache", false, true);

written by ocean

6月 28

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title></title>
<script>
      function Show() {
          alert("Show");
      }
     
      function AddEvent(obj, eventType, fn, bool) {
          if (obj.addEventListener) obj.addEventListener(eventType, fn, bool); //FF
          else if (obj.attachEvent) obj.attachEvent("on" + eventType, fn, bool); //IE
          else obj["on" + eventType] = fn;                 //其他未知浏览器
      }
     
      function RemoveEvent(obj, eventType, fn,bool) {
          if (obj.removeEventListener) obj.removeEventListener(eventType, fn,bool); //FF
          else if (obj.detachEvent) obj.detachEvent("on" + eventType, fn); //IE
          else obj["on" + eventType] = null;         //其他未知浏览器
      }
     
      function Add() {
          var obj = document.getElementById("btn");
          AddEvent(obj, "click", Show,false);
      }

      function Remove() {
          var obj = document.getElementById("btn");
          RemoveEvent(obj, "click", Show,false);
      }
</script>

</head>
<body>
<input type="button" value="Test" id="btn" />
<input type="button" value="添加" onclick="Add()" />
   <input type="button" value="移除" onclick="Remove()" />
</body>
</html>

written by ocean

6月 28

SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。

用下面一句话就可以了解决了。

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;

关闭一样.只是将上面的后面的那个"1"改成"0"就可以了.

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;

在 服务器对象–>链接服务器
新建一个访问点

假设要将远程数据库上的数据导入到本地数据库
在本地执行SQL
   

INSERT into 本地表名 SELECT * FROM [远程名].远程库名.dbo.远程表名

将本地SQL Server 的数据导出到 Excel

EXEC master..xp_cmdshell 'bcp 本地库名.dbo.本地表明 out D:\Temp.xls -c -q -S"本地服务器名" -U"sa" -P"密码"'

将本地SQL Server 的数据导出到 Txt

EXEC master..xp_cmdshell 'bcp 本地库名.dbo.本地表明 out D:\Temp.txt -c -q -S"本地服务器名" -U"sa" -P"密码"'

 

帮同事写了一个存储过程版的,先导入到一个临时表里

DROP TABLE _TempTable;

CREATE TABLE _TempTable (
	Id INT,
	UserName nvarchar (100)
);

INSERT INTO _TempTable EXEC GetTestDataByAge "xxx";

EXEC master..xp_cmdshell 'bcp DB_Testing.dbo._TempTable out D:\test\Temp.txt -c -q -S"172.28.3.20" -Usa -Pabc123'

GetTestDataByAge的定义,随便写的一个

ALTER PROCEDURE [dbo].[GetTestDataByAge] 
(@Age VARCHAR(10)) 
AS 
SELECT
	Id,
	UserName
FROM
	tb_testingdata

written by ocean \\ tags: ,

6月 28

此方法需要使用SOS.dll的一些方法,我们可以通过安装微软的Debugging Tools for windows来得到此dll。
下载地址:http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx

先在工程的属性页,调试里面勾选启用非托管堆调试

在适当的地方设置断点
然后再即时窗口输入“.load sos”来加载SOS.dll

加载sos扩展之后,就可以享用sos的诸多命令了,sos的所有命令都已感叹号“!”开头,你可以使用!help获得sos所有命令的列表,然后你还可以通过!help 命令名的方法时获得每个命令的详细介绍,介绍中不仅仅有使用方法,还有示例。不需要弄明白所有命令的使用方法,常用的就这么几个:

!help
它用来查看每个命令的用法。如!help !threads,用来查看!threads 命令的具体用法。如果直接使用!help,它将列出sos的基本信息。

!threadpool
通过这个命令,我们可以很容易的看出在dump文件生成时的确切CPU使用率,同时,我们也可以看到队列中等待的work requests,timers以及completion port threads等信息。Timers,work requests以及completion port threads都是CLR的线程种类,在以后的文章中我会详细介绍。

!runaway
它是用来罗列所有正在运行的线程以及它们的CPU占用率。通过这个命令,我们可以很容易的去trouble shooting一些CPU占用率过高的问题。

!threads
它是用来罗列所有正在运行的托管(managed)线程的详细信息,如CLR线程所在的appdomain等等。如果线程的ID显示XXXX,说明这个线程已经结束,等待被回收。

~[id]s
此命令用来切换到某一特定线程。如 ~20s 代表切换到ID为20的线程。

!clrstack
此命令用来显示此线程的managed code 的callstack。我们可以加上-p参数来得到更加详细的信息。

!dumpobject(!do)
通过这个命令,我们可以查看某个特定address的object信息。如果这个address指向一个string,我们就可以看到这个string内存储了什么值。

!dumpstackobjects(!dso)
此命令用来查看被当前线程堆栈引用的所有托管对象。

!dumparray(!da)
当我们查看线程堆栈上的object时,我们可以使用!do命令。但是如果该object是一个array的话,!do只能得到array本身的信息,并非其存储的内容。此时!da就发挥了用场。

!objsize
如果我们想查看一个object的total size的时候,我们需要使用!objsize命令。比如当我们!da一个array时,它显示的size仅仅是包含的type的size,并非实际的size。我们可以使用!objsize address来查看这个array的实际size。

!dumpheap
它是用来查看堆上所有的object。通常我们加上 –stat参数来帮我们做个归类,否则它会罗列出许多繁杂的信息。同时,它还有几个比较常用的参数,如-type,-mt。-type用来列出某一特定类型的所有object,如!dumpheap –type System.String将列出堆上所有的string。-mt是用来列出某一特定MethodTable的所有object。大家知道,每一个引用类型都对应一个MethodTable,假设System.String类型的MethodTable是02c39310,那么我们还可以通过!dumpheap –mt 02c39310来找到堆上所有的string。

written by ocean

6月 07

WinXP操作系统下没有现成的Editbin命令。需要安装Visual Studio才能获得这个命令。可以在主Visual Studio目录的VC98BIN目录下找到它。当然,可以直接拷贝这个Editbin.exe文件到system32目录下。

此选项设置堆栈的大小(以字节计),并带使用十进制或 C 语言表示法的参数。/STACK 选项仅适用于可执行文件。

reserve 参数指定虚拟内存中总的堆栈分配。EDITBIN 将指定值四舍五入到最接近的 4 个字节。

可选 commit 参数取决于操作系统的解释。在 Windows NT、Windows 95 和 Windows 98 中,commit 指定一次分配的物理内存量。提交的虚拟内存导致空间被保留在页面文件中。更高的 commit 值在应用程序需要更多堆栈空间时可节省时间,但会增加内存需求并可能延长启动时间。

例如: editbin /stack:12000000 G:\modify\hjl-build.exe

关键字:

内存溢出  

stack overflow  

System.StackOverflowException

written by ocean

6月 07

自己做个网站,发现百度的蜘蛛和Google的蜘蛛对Url的编码解码方式不一致,给我造成了很大的困惑啊,

做了一个函数,统一由此解码,世界清静了

顺便宣传一下网站地址 接龙大全

         protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write(UrlDecode("xxx"));
        }

        /// <summary>
        /// Url通用解码
        /// 先尝试utf-8,再尝试gb2312
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string UrlDecode(string key)
        {
            string input = GetUrlParam(key).ToLower();
            if (input.Length == 0)
                return string.Empty;

            //首先用utf-8进行解码
            string result = HttpUtility.UrlDecode(input, Encoding.UTF8);

            // 将已经解码的字符再次进行编码.            
            string encode = HttpUtility.UrlEncode(result, Encoding.UTF8).ToLower();

            //与原来编码进行对比,如果不一致说明解码未正确,用gb2312进行解码
            if (input != encode)
                result = HttpUtility.UrlDecode(input, Encoding.GetEncoding("gb2312"));

            return result;
        }

        /// <summary>
        /// 获取Url的参数,不编码,只获取明码
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        private static string GetUrlParam(string key)
        {
            if (System.Web.HttpContext.Current != null)
            {
                string query = HttpContext.Current.Request.Url.Query;
                if (query != null && query.Length > 0)
                {
                    int index = 0;
                    index = query.IndexOf(key + "=");
                    if (index >= 0)
                    {
                        query = query.Substring(key.Length + 1 + index);
                        index = query.IndexOf(‘&’);
                        if (index >= 0)
                            query = query.Substring(0, index);
                        return query;
                    }
                }
            }
            return string.Empty;
        }

written by ocean