344791576 344791576
关注数: 20 粉丝数: 79 发帖数: 625 关注贴吧数: 23
PageIndexChaned和PageIndexChanging的区别 using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Data.SqlClient; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindGrid(); } } void BindGrid() { string ConnectionString = "server=.\\sqlexpress;uid=sa;pwd=123;database=northwind"; string CommandText = "select * from customers "; SqlConnection con = new SqlConnection(ConnectionString); SqlDataAdapter adapter = new SqlDataAdapter(CommandText,con); DataSet ds = new DataSet(); adapter.Fill(ds); GridView1.DataSource = ds; GridView1.DataBind(); } protected void GridView1_PageIndexChanged(object sender, EventArgs e) { Response.Write("<script>alert('进入下一页了,这是事件PageIndexChanged的效果,在PageIndexChanging发生成功后发生')</script>"); } protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { Response.Write("<script>alert('要进入下一页啦,正在发生PageIndexChanging事件')</script>"); GridView1.PageIndex = e.NewPageIndex; BindGrid(); } } 点页面所以时会跳出对话框显示"要进入下一页啦,正在发生PageIndexChanging事件" 然后页面变为空白显示对话框“进入下一页了,这是事件PageIndexChanged的效果,在PageIndexChanging发生成功后发生” 呵呵通俗易懂吧 而假如把事件改成 protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { if (e.NewPageIndex==3)//当所选索引为3+1时生效,就是第四页啦 { e.Cancel = true; } else { GridView1.PageIndex = e.NewPageIndex; BindGrid(); } } 那么你点第四页的时候就不会进入下一页了,因为e.cancel生效了,这就是MSDN中说的“此事件通常用于取消排序操作或执行自定义操作”啦
ExecuteNonQuery ExecuteReader ExecuteScalar的初级错误 先看一段代码 int num = -1; SqlConnection con = new SqlConnection("server=.\\sqlexpress;database=electclass;uid=sa;pwd=123"); SqlCommand cmd = new SqlCommand(); cmd.CommandText = "select count(*) from student where stuname='zlg' and stupwd='123' "; cmd.Connection = con; con.Open(); num = cmd.ExecuteNonQuery(); Console.WriteLine(num); Console.ReadLine(); 假设 sql语句是正确的,用户名和密码也是正确的,即"select count(*) from student where stuname='zlg' and stupwd='123' "; 可以得出正确的结果是1 那么此时屏幕输出什么呢?没错,输出的就是-1 看MSDN中的解释 对连接执行 Transact-SQL 语句并返回受影响的行数。 您可以使用 ExecuteNonQuery 来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行 UPDATE、INSERT 或 DELETE 语句,在不使用 DataSet 的情况下更改数据库中的数据。 虽然 ExecuteNonQuery 不返回任何行,但映射到参数的任何输出参数或返回值都会用数据进行填充。 对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。如果正在执行插入或更新操作的表上存在触发器,则返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1。 注意粗体字,这里指明了是执行UPDATE、INSERT 和 DELETE 才返回受影响的行数 这里应该用ExecuteScalar,因为这里返回的只有一个东西,那就是个数,所以用返回首行首列再适合不过了
SQL中char,varchar 和nchar,nvarchar的区别 Varchar 对每个英文(ASCII)字符都占用2个字节,对一个汉字也只占用两个字节 char 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节 Varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian" 而char 不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian "(qian后共有96个空格, 就是把它填满为100个字节)。 由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉! 1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。 2、VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。 从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。 3、TEXT。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。 4、NCHAR、NVARCHAR、NTEXT。这三种从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较起来,nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。 所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar。 将所有的表中,数值类型由char,varchar改为nchar,nvarchar 的存储过程 /*--将所有的表中,数值类型由char,varchar改为nchar,nvarchar 的存储过程 --邹建 2004.02(引用请保留此信息)--*/ /*--调用示例: exec p_set --*/ if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_set]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[p_set] GO create procedure p_set as declare tb cursor for Select sql='alter table ['+d.name +'] alter column ['+a.name+'] n' +b.name+'('+cast(a.length*2 as varchar)+')' FROM syscolumns a left join systypes b on a.xtype=b.xusertype inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties' where b.name in('char','varchar') and not exists(Select 1 FROM sysobjects where xtype='PK' and name in ( Select name FROM sysindexes Where indid in( Select indid FROM sysindexkeys Where id = a.id AND colid=a.colid ))) --主键不能修改 order by d.name,a.name declare @sql varchar(1000) open tb fetch next from tb into @sql while @@fetch_status = 0 begin exec(@sql) fetch next from tb into @sql end close tb deallocate tb go
SQL命令简易查询 --语 句 功 能 --数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 --数据定义 CREATE TABLE --创建一个数据库表 DROP TABLE --从数据库中删除表 ALTER TABLE --修改数据库表结构 CREATE VIEW --创建一个视图 DROP VIEW --从数据库中删除视图 CREATE INDEX --为数据库表创建一个索引 DROP INDEX --从数据库中删除索引 CREATE PROCEDURE --创建一个存储过程 DROP PROCEDURE --从数据库中删除存储过程 CREATE TRIGGER --创建一个触发器 DROP TRIGGER --从数据库中删除触发器 CREATE SCHEMA --向数据库添加一个新模式 DROP SCHEMA --从数据库中删除一个模式 CREATE DOMAIN --创建一个数据值域 ALTER DOMAIN --改变域定义 DROP DOMAIN --从数据库中删除一个域 --数据控制 GRANT --授予用户访问权限 DENY --拒绝用户访问 REVOKE --解除用户访问权限 --事务控制 COMMIT --结束当前事务 ROLLBACK --中止当前事务 SET TRANSACTION --定义当前事务数据访问特征 --程序化SQL DECLARE --为查询设定游标 EXPLAN --为查询描述数据访问计划 OPEN --检索查询结果打开一个游标 FETCH --检索一行查询结果 CLOSE --关闭游标 PREPARE --为动态执行准备SQL 语句 EXECUTE --动态地执行SQL 语句 DESCRIBE --描述准备好的查询 ---局部变量 declare @id char(10) --set @id = '10010001' select @id = '10010001' ---全局变量 ---必须以@@开头 --IF ELSE declare @x int @y int @z int select @x = 1 @y = 2 @z=3 if @x > @y print 'x > y' --打印字符串'x > y' else if @y > @z print 'y > z' else print 'z > y' --CASE use pangu update employee set e_wage = case when job_level = '1' then e_wage*1.08 when job_level = '2' then e_wage*1.07 when job_level = '3' then e_wage*1.06 else e_wage*1.05 end --WHILE CONTINUE BREAK declare @x int @y int @c int select @x = 1 @y=1 while @x < 3 begin print @x --打印变量x 的值 while @y < 3 begin select @c = 100*@x + @y print @c --打印变量c 的值 select @y = @y + 1 end select @x = @x + 1 select @y = 1 end --WAITFOR --例 等待1 小时2 分零3 秒后才执行SELECT 语句 waitfor delay '01:02:03' select * from employee --例 等到晚上11 点零8 分后才执行SELECT 语句 waitfor time '23:08:00' select * from employee ***SELECT*** select *(列名) from table_name(表名) where column_name operator value ex:(宿主) select * from stock_information where stockid = str(nid) stockname = 'str_name' stockname like '% find this %' stockname like '[a-zA-Z]%' --------- ([]指定值的范围) stockname like '[^F-M]%' --------- (^排除指定范围)
ASP.NET页面生命周期描述 在以前写个一篇关于ASP.NET页面生命周期的草稿,最近又看了看ASP.NET,做个补充,看看页面初始过程到底是怎么样的 下面是ASP.NET页面初始的过程: 1. Page_Init(); 2. Load ViewState; 3. Load Postback data; 4. Page_Load(); 5. Handle control events; 6. Page_PreRender(); 7. Page_Render(); 8. Unload event; 9. Dispose method called; 下面对其中的一些过程作下描述: 1. Page_Init(); 这个过程主要是初始化控件,每次页面载入执行这个初始过程,包括第一次和以后的Postback(这里说下Postback,其实就可以简单理解成用户点击SUBMIT按钮之类的,把表单<Form>提交给服务器,这就是一次postback),在这里面可以访问控件,但是这里面的控件值不是我们期待的控件里面的值,他只是一个控件的初始值(默认值),举例: 比如一个TextBox1,我们填入了"哈哈",在点击SUBMIT提交了页面后,在Page_Init()里面,我们访问到的TextBox1.Text不是我们的"哈哈",而是开始的""空字符串,如果TextBox1在我们设计的时候提供了默认值,这里访问到的也就是提供的默认值,为什么呢,这就要看下一个过程了. 对应的事件Page.Init 2. Load ViewState 这个过程是载入VIEWSTATE和Postback数据,比如我们上面的TextBox1,这时就赋了"哈哈",所以,在Post_Init()对控件赋值是无意义的,它都会在这个过程里被改写,当然第一次页面载入例外,因为没有VIEWSTATE数据。 没有对应的事件 3.Load Postback data; 上面说了,Postback可以理解成用户提交表单数据,所以这里就是处理表单数据,当然这里要设计到控件的设计,一般情况不会要我们自己处理这个过程,我们暂且略过. (在以前那篇关于ASP.NET页面生命周期的简单描述中,把这个过程和Load ViewState放在了一起,其实那是微软提供的生命周期过程,这里单独提出来是为了让大家明白这是一个单独的过程) 没有对应的事件 4. Page_Load(); 这个过程也是每次页面载入时一定会执行的,但是注意和Page_Init的区别,上面已经涉及了,这里注意的是一般都会用到Page.IsPostBack,该值指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问。 private void Page_Load(object sender, System.EventArgs e) { if(!Page.IsPostBack) { //第一次执行的CODE HERE } else { //用户提交FORM(即Postback)CODE HERE } //每次这里的都回执行CODE HERE } 对应的事件Page.Load 5. Handle control events; 这个过程里,相应具体的控件事件,比如private void ListBox1_SelectedIndexChanged(object sender, System.EventArgs e)事件等等 没有对应的事件(我们自己的事件函数都包括在这个过程里比如上面的ListBox1_SelectedIndexChanged) 6. Page_ 预先呈递对象,这里是在向用户程序呈现数据的倒数第二步,我估计提供这个过程的意义,也就是在这里能对控件属性等等要呈现给用户的数据进行修改,这也是最后的修改,以前的修改(比如在Page_Init里面)都可能被覆盖.做完这了还会进行一个操作就是保存状态,即SaveViewState. 对应的事件时Page.PreRender 7. Page_Render(); 大家可以在浏缆器里View->Source查看到,每个页面都有一个隐藏的<input>,这里面的"__VIEWSTATE"就是我们服务器写回来的页面状态信息,在这个之前,服务器要呈现页面(也就是构造HTML格式的文件),就是从这个"__VIEWSTATE"里面获取的数据,当然大家也注意到了,这里有个Page.Render事件,我们可以添加自己的处理代码,也就是说我们又可以更改数据,不过这里推荐不要在这里修改,既然提供了PreRender,就应该在里面做最后的修改,当然这不是必须的,只是推荐! 对应的事件Page.Render 8. Unload event; 大家应该明白,当想服务器请求一个对象的时候,就会在内存里生成一个继承页面对象,也就是页面的类,它继承自System.Web.UI.Page. 当页面对象从内存中卸载时发生,将触发该事件. 对应的事件Page.Unload 9. Dispose method called; 销毁所有的对象.当从内存释放Page时发生,这是生存期的最后阶段。可能第8和9似乎有些模糊,不过我也没怎么搞清楚,待研究! 对应的事件Dispose 以上就是ASP.NET页面周期的描述。 注意上面灰色背景的文字,如果一个过程中有对应的事件,我们可以自己定义一个函数(当然先在MSDN中找到函数原型),然后在 InitializeComponent中向事件的链表上添加上去,像下面: private void InitializeComponent() { this.Unload += new System.EventHandler(this.MainWebForm_Unload); this.Load += new System.EventHandler(this.Page_Load); this.Init += new System.EventHandler(this.Page_Init); this.PreRender += new System.EventHandler(this.My_PreRender); } 对于几个没有对应事件的过程,比如2.Load ViewState,我们可以重载Page的虚函数protected override void LoadViewState(object savedState);来添加自己的控制代码,不过切忌掉用基类的对应方法,比如: protected override void LoadViewState(object savedState) { //自己处理VIEWSTATE base.LoadViewState (savedState); }
错误日志【最新】 using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.IO; /// <summary> ///【错误日志】 /// </summary> public class Logs {      public Logs()      {          //          //TODO: 在此处添加构造函数逻辑          //      }      /// <summary>      /// 【错误日志文件路径】      /// </summary>      public string logPath = ConfigurationManager.AppSettings["logPath"].ToString();      #region 【当程序出现异常的时候执行此方法】      /// <summary>      /// 【当程序出现异常的时候执行此方法】      /// </summary>      /// <param name="ex">【出现异常的对象】</param>      /// <param name="log">【出现异常的说明】</param>      public void Log_ex(Exception ex, string log)      {          string time = DateTime.Now.ToLongDateString();          string pathFile = logPath + "\\" + time;          if (!System.IO.Directory.Exists(pathFile))//判断新上传的文件类型是否有对应的文件夹          {              DirectoryInfo di = Directory.CreateDirectory(pathFile);//创建对应的文件夹          }          if (System.IO.Directory.Exists(pathFile))          {              WriteLog(log + ":" + ex.Message, pathFile);          }      }      #endregion      #region 【当程序出现错误的时候执行此方法】      /// <summary>      /// 【当程序出现错误的时候执行此方】      /// </summary>      /// <param name="log">【出现异常的说明】</param>      public void Log(string log)      {          string time = DateTime.Now.ToLongDateString();          string pathFile = logPath + "\\" + time;
【C#中几种获取路径方法】 string str1 =Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件名。 string str2=Environment.CurrentDirectory;//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。 //备注按照定义,如果该进程在本地或网络驱动器的根目录中启动,则此属性的值为驱动器名称后跟一个尾部反斜杠(如“C:\”)。如果该进程在子目录中启动,则此属性的值为不带尾部反斜杠的驱动器和子目录路径(如“C:\mySubDirectory”)。 string str3=Directory.GetCurrentDirectory();//获取应用程序的当前工作目录。 string str4=AppDomain.CurrentDomain.BaseDirectory;//获取基目录,它由程序集冲突解决程序用来探测程序集。 string str5=Application.StartupPath;//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。 string str6=Application.ExecutablePath;//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。 string str7=AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//获取或设置包含该应用程序的目录的名称。 //获取当前进程的完整路径,包含文件名(进程名)。 string str = this.GetType().Assembly.Location; result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名) //获取新的 Process 组件并将其与当前活动的进程关联的主模块的完整路径,包含文件名(进程名)。 string str = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名) //获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。 string str = System.Environment.CurrentDirectory; result: X:\xxx\xxx (.exe文件所在的目录) //获取当前 Thread 的当前应用程序域的基目录,它由程序集冲突解决程序用来探测程序集。 string str = System.AppDomain.CurrentDomain.BaseDirectory; result: X:\xxx\xxx\ (.exe文件所在的目录+"\") //获取和设置包含该应用程序的目录的名称。 string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase; result: X:\xxx\xxx\ (.exe文件所在的目录+"\") //获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。 string str = System.Windows.Forms.Application.StartupPath; result: X:\xxx\xxx (.exe文件所在的目录) //获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。 string str = System.Windows.Forms.Application.ExecutablePath; result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名) //获取应用程序的当前工作目录(不可靠)。 string str = System.IO.Directory.GetCurrentDirectory(); result: X:\xxx\xxx (.exe文件所在的目录)
数字字符串检查          #region 数字字符串检查                  public static bool IsPhone(string inputData)          {              Match m = RegPhone.Match(inputData);              return m.Success;          }          /// <summary>          /// 检查Request查询字符串的键值,是否是数字,最大长度限制          /// </summary>          /// <param name="req">Request</param>          /// <param name="inputKey">Request的键值</param>          /// <param name="maxLen">最大长度</param>          /// <returns>返回Request查询字符串</returns>          public static string FetchInputDigit(HttpRequest req, string inputKey, int maxLen)          {              string retVal = string.Empty;              if(inputKey != null && inputKey != string.Empty)              {                  retVal = req.QueryString[inputKey];                  if(null == retVal)                      retVal = req.Form[inputKey];                  if(null != retVal)                  {                      retVal = SqlText(retVal, maxLen);                      if(!IsNumber(retVal))                          retVal = string.Empty;                  }              }              if(retVal == null)
返回时间差          #region 返回时间差          public static string DateDiff(DateTime DateTime1, DateTime DateTime2)          {              string dateDiff = null;              try              {                  //TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);                  //TimeSpan ts2 = new TimeSpan(DateTime2.Ticks);                  //TimeSpan ts = ts1.Subtract(ts2).Duration();                  TimeSpan ts = DateTime2 - DateTime1;                  if (ts.Days >=1)                  {                      dateDiff = DateTime1.Month.ToString() + "月" + DateTime1.Day.ToString() + "日";                  }                  else                  {                      if (ts.Hours > 1)                      {                          dateDiff = ts.Hours.ToString() + "小时前";                      }                      else                      {                          dateDiff = ts.Minutes.ToString() + "分钟前";                      }                  }              }              catch              { }              return dateDiff;          }          #endregion
转换人民币大小金额         /// <summary>          /// 转换人民币大小金额          /// </summary>          /// <param name="num">金额</param>          /// <returns>返回大写形式</returns>          public static string CmycurD(decimal num)          {              string str1 = "零壹贰叁肆伍陆柒捌玖";             //0-9所对应的汉字              string str2 = "万仟佰拾亿仟佰拾万仟佰拾元角分"; //数字位所对应的汉字              string str3 = "";     //从原num值中取出的值              string str4 = "";     //数字的字符串形式              string str5 = "";   //人民币大写金额形式              int i;     //循环变量              int j;     //num的值乘以100的字符串长度              string ch1 = "";     //数字的汉语读法              string ch2 = "";     //数字位的汉字读法              int nzero = 0;   //用来计算连续的零值是几个              int temp;             //从原num值中取出的值              num = Math.Round(Math.Abs(num), 2);     //将num取绝对值并四舍五入取2位小数              str4 = ((long)(num * 100)).ToString();         //将num乘100并转换成字符串形式              j = str4.Length;       //找出最高位              if (j > 15) { return "溢出"; }              str2 = str2.Substring(15 - j);    //取出对应位数的str2的值。如:200.55,j为5所以str2=佰拾元角分              //循环取出每一位需要转换的值
Errors 日志类 using System; using System.Collections.Generic; using System.Text; using System.IO; namespace Errors {      public class Error      {          /// <summary>          /// 当程序出现异常          /// 的时候执行此方法;          /// 此方法是用来写错误日志的          /// </summary>          /// <param name="ex">出现异常的对象</param>          /// <param name="log">出现异常的地方</param>          public static void Log_ex(Exception ex, string log)          {              string Time = DateTime.Now.ToString();              string[] temp = Time.Split(':');              string FileName = temp[0] + temp[1] + temp[2];              FileStream fs = new FileStream(@"c:\log.txt",FileMode.OpenOrCreate);                          StreamWriter sw = new StreamWriter(fs, Encoding.Default);              sw.BaseStream.Seek(0, SeekOrigin.End);              sw.WriteLine("*****************************************************************yanliming***************************************************************************");              sw.WriteLine("");              sw.WriteLine("出现错误时间:"+Time);              sw.WriteLine("出现错误" + log + ":" + ex.Message);              sw.WriteLine("");              sw.WriteLine("**************************************************************yanliming******************************************************************************");              sw.WriteLine("");              sw.WriteLine("");              sw.Close();              fs.Close();          }
动态SQL简介 介绍的嵌入式SQL语句为编程提供了一定的灵活性,使用户可以在程序运行过程中根据实际需要输入WHERE子句或HAVING子句中某些变量的值。这些SQL语句的共同特点是,语句中主变量的个数与数据类型在预编译时都是确定的,只有主变量的值是程序运行过程中动态输入的,我们称这类嵌入式SQL语句为静态SQL语句。 静态SQL语句提供的编程灵活性在许多情况下仍显得不足,有时候我们需要编写更为通用的程序。例如,查询学生选课关系SC,任课教师想查选修某门课程的所有学生的学号及其成绩,班主任想查某个学生选修的所有课程的课程号及相应成绩,学生想查某个学生选修某门课程的成绩,也就是说查询条件是不确定的,要查询的属性列也是不确定的,这时就无法用一条静态SQL语句实现了。 实际上,如果在预编译时下列信息不能确定,我们就必须使用动态SQL技术:      ·SQL语句正文      ·主变量个数      ·主变量的数据类型      ·SQL语句中引用的数据库对象(例如列、索引、基本表、视图等) 动态SQL方法允许在程序运行过程中临时“组装”SQL语句,主要有三种形式:      (1) 语句可变。可接收完整的SQL语句。即允许用户在程序运行时临时输入完整的SQL语句。      (2) 条件可变。 对于非查询语句,条件子句有一定的可变性。例如删除学生选课记录,既可以是因某门课临时取消,需要删除有关该课程的所有选课记录,也可以是因为某个学生退学,需要删除该学生的所有选课记录。 对于查询语句,SELECT子句是确定的,即语句的输出是确定的,其他子句(如WHERE子句、HAVING短语)有一定的可变性。例如查询学生人数,可以是查某个系的学生总数,查某个性别的学生人数,查某个年龄段的学生人数,查某个系某个年龄段的学生人数等等,这时SELECT子句的目标列表达式是确定的(COUNT(*)),但WHERE子句的条件是不确定的。      (3) 数据库对象、查询条件均可变。对于查询语句,SELECT子句中的列名、FROM子句中的表名或视图名、WHERE子句和HAVING短语中的条件等等均可由用户临时构造,即语句的输入和输出可能都是不确定的。例如我们前面查询学生选课关系SC的例子。对于非查询语句,涉及的数据库对象及条件也是可变的。 这几种动态形式几乎可覆盖所有的可变要求。为了实现上述三种可变形式,SQL提供了相应的语句,例如EXECUTE IMMEDIATE、PREPARE、EXECUTE、DESCRIBE等。使用动态SQL技术更多的是涉及程序设计方面的知识,而不是SQL语言本身,所以这里就不详细介绍了,有兴趣的读者可以参阅有关书籍。
LINQ新特性简介及入门教程 LINQ新特性简介及入门教程 出处:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.msproject.cn%2Farticle%2FCs3LinqFeatures.aspx&urlrefer=b3d52d61ec1bd3a3c6794ebb1eaeded5 翻译 Amro Khasawneh 著 Understanding LINQ (C#) flanker译(还请指教啊) 简介 本文主要是关注于LINQ——我认为是VS2008(.NET3.5)中最令人兴奋的特性。LINQ使查询成为了.NET中头等的编程概念,被查询的数据可以是XML(LINQ to XML)、Databases(LINQ to SQL、LINQ to Dataset、LINQ to Entities)和对象(LINQ to Objects)。LINQ也是可扩展的,允许你建立自定义的LINQ数据提供者(比如:LINQ to Amazon、LINQ to NHibernate、LINQ to LDAP)。 在这里我会讨论C#3.0中的一些新的语言特性和改进,正是它们使得LINQ变得如此强大,让你可以写出这样的代码: var result = from c in Customers               where c.City == Boston"               orderby c.LastName descending               select new { c.FirstName, c.LastName, c.Address }; 记住,如果你想要使用LINQ,你需要安装Visual Studio 2008(.NET3.5)。 新的语言特性 I/ 自动属性 public class Point {      private int _x, _y;      public int X {          get { return _x; }          set { _x = value; }      }      public int Y {          get { return _y; }          set { _y = value; }      } } 上面的代码简单的定义了一个拥有两个属性的类。现在,使用VS2008中的C#编译器,我们就可以用自动属性写的更简单,它能自动的生成带有get/set操作的私有域。 public class Point {      public int X { get; set; }      public int Y { get; set; } } 上面的代码可读性更好并且简洁。 (这个特性和LINQ还没有关系) II/ 局部变量类型 使用这个特性,声明一个局部变量,它的具体类型是通过初始化表达式来推断。这点是通过var关键词完成的(这个使用脚本语言的人应该很熟悉,但它们实际上是有很大区别的)。我们可以写出如下的代码: var num = 50; var str = "simple string"; var obj = new myType(); var numbers = new int[] {1,2,3}; var dic = new Dictionary<int,myType>(); 编译器会生成IL中间代码,就如同我们编译了下面的代码: int num = 50; string str = "simple string"; myType obj = new myType(); int[] numbers = new int[] {1,2,3}; Dictionary<int,myType> dic = new Dictionary<int,myType>(); 注意,这里并不存在无类型的变量,也没有推迟类型的绑定。编译器是从右边的赋值语句来自动推断和声明变量的类型的,var关键词是一个强类型的变量引用。 III/ 对象初始化和集合初始化 我们继续使用上面的Point类。假设我们想要这个类的一个实例,我们会建立对象并设置它的属性,代码会是这样子的: Point p = new Point(); p.X = 0; p.Y = 0;
sealed(C# 参考) 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承。在下面的示例中,类 B 从类 A 继承,但是任何类都不能从类 B 继承。      class A {}          sealed class B : A {} 还可以在重写基类中的虚方法或虚属性的方法或属性上使用 sealed 修饰符。这将使您能够允许类从您的类继承,并防止它们重写特定的虚方法或虚属性。 示例 -------------------------------------------------------------------------------- 在下面的示例中,Z 从 Y 继承,但 Z 无法重写在 X 中声明并在 Y 中密封的虚函数 F。 class X      {          protected virtual void F() { Console.WriteLine("X.F"); }          protected virtual void F2() { Console.WriteLine("X.F2"); }      }      class Y : X      {          sealed protected override void F() { Console.WriteLine("Y.F"); }          protected override void F2() { Console.WriteLine("X.F3"); }      }      class Z : Y      {          // Attempting to override F causes compiler error CS0239.          // protected override void F() { Console.WriteLine("C.F"); }          // Overriding F2 is allowed.          protected override void F2() { Console.WriteLine("Z.F2"); }      } 当在类中定义新的方法或属性时,通过不将这些方法或属性声明为 virtual,可防止派生类重写这些方法或属性。 将 abstract 修饰符用于密封类是错误的做法,因为抽象类必须由提供抽象方法或属性的实现的类继承。 当应用于方法或属性时,sealed 修饰符必须始终与 override 一起使用。 由于结构是隐式密封的,因此它们不能被继承。 sealed class SealedClass      {          public int x;          public int y;      }      class SealedTest2      {          static void Main()          {              SealedClass sc = new SealedClass();              sc.x = 110;              sc.y = 150;              Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);          }      }      // Output: x = 110, y = 150 在上一个示例中,您可能尝试使用下面的语句从密封类继承: class MyDerivedC: SealedClass {} // Error 将产生一条错误消息: 'MyDerivedC' cannot inherit from sealed class 'SealedClass'.
下载大文件         /// <summary>          /// WriteFile分块下载          /// </summary>          /// <param name="AbsPath">文件绝对路径</param>          /// <param name="fileName">文件名称</param>          public static void DownLoadWriteFileBlock(string AbsPath, string fileName) {              FileInfo fileInfo = new FileInfo(AbsPath);              if (fileInfo.Exists == true) {                  const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力                  byte[] buffer = new byte[ChunkSize];                  HttpContext.Current.Response.Clear();                  FileStream iStream = File.OpenRead(AbsPath);                  long dataLengthToRead = iStream.Length;//获取下载的文件总大小                  HttpContext.Current.Response.ContentType = "application/octet-stream";                  //HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(System.Text.Encoding.UTF8.GetBytes(fileName)));                  HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + "" + fileInfo.Extension);                  while (dataLengthToRead > 0 && HttpContext.Current.Response.IsClientConnected) {                      int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小                      HttpContext.Current.Response.OutputStream.Write(buffer, 0, lengthRead);                      HttpContext.Current.Response.Flush();                      dataLengthToRead = dataLengthToRead - lengthRead;                  }                  HttpContext.Current.Response.Close();              }          } 本人测试过500M的文件,没有问题,再大了我没有试过。 如果有人用了,给说说啊
ASP.NET Session 存储到数据库中    然后,回到Web.config文件中上述的段落中,将mode的值改为StateServer。保存文件后的重新打开一个IE,打开SessionState.aspx页面,保存一些信息到Session中。这时,让我们重起IIS,再回到SessionState.aspx页面中查看刚才的Session信息,发现没有丢失。      实际上,这种将ASP.NET Session信息存储在进程外的方式不光指可以将信息存储在本机的进程外,还可以将Session信息存储在其他的服务器的进程中。这时,不光需要将mode的值改为StateServer,还需要在stateConnectionString中配置相应的参数。例如你的计算你是192.168.0.1,你想把Session存储在IP为192.168.0.2的计算机的进程中,就需要设置成这样:stateConnectionString=tcpip=192.168.0.2:42424。当然,不要忘记在192.168.0.2的计算机中装上.NET Framework,并且启动asp.net State Services服务。      将服务器Session信息存储在SQL Server中      首先,还是让我们来做一些准备工作。启动SQL Server和SQL Server代理服务。在SQL Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个用来专门存储Session信息的数据库,及一个维护Session信息数据库的SQL Server代理作业。我们可以在以下路径中找到那个文件: [system drive]\winnt\Microsoft.NET\Framework\[version]\      然后打开查询分析器,连接到SQL Server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫ASPState的数据库。但是这个数据库中只是些存储过程,没有用户表。实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中的,另外一个ASPStateTempApplications表存储了ASP中Application对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理-SQL Server代理-作业,发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息的。      接着,我们返回到Web.config文件,修改mode的值改为SQLServer。注意,还要同时修改sqlConnectionString的值,格式为: sqlConnectionString=data   source=localhost;   Integrated   Security=SSPI; 其中data source是指SQL Server服务器的IP地址,如果SQL Server与IIS是一台机子,写127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份验证,这样,访问数据库将以asp.net的身份进行,通过如此配置,能够获得比使用userid=sa;password=口令的SQL Server验证方式更好的安全性。当然,如果SQL Server运行于另一台计算机上,你可能会需要通过Active Directory域的方式来维护两边验证的一致性。      同样,让我们做个试验。向SessionState.aspx中添加Session信息,这时发现Session信息已经存在SQL Server中了,即使你重起计算机,刚才的Session信息也不会丢失。现在,你已经完全看见了Session信息到底是什么样子的了,而且又是存储在SQL Server中的,能干什么就看你的发挥了。      通过这篇文章,你可以看到在asp.net session的管理和维护上,asp.net比asp有了很大的进步,我们可以更加随意的挑选适合的方法了。
利用UrlRewrite,asp.net动态生成htm页面 前段时间做项目,一直都在寻找一种动态生成htm页面的方法,要求配置简单,和项目无关。 功夫不负有心人,终于被我找到了,只需要在 web.config中进行简单配置,就可以达到动态生成静态页面的效果,同时又不影响Url重定向。web.config中需要注意的配置节为< configuration>、<RewriteConfig>、<httpModules>、< httpHandlers>,在这些配置节里边都有注释,容易看懂。 <?xml version="1.0" encoding="utf-8"?> <!--     注意: 除了手动编辑此文件以外,您还可以使用     Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的     “网站”->“Asp.Net 配置”选项。     设置和注释的完整列表在     machine.config.comments 中,该文件通常位于     \Windows\Microsoft.Net\Framework\v2.x\Config 中 --> <configuration>     <!-- RUL重写开始 -->     <configSections>     <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter"/>     </configSections>     <RewriterConfig>     <Rules>     <!--地址重写规则-->     <!--首页,定位到静态页面-->     <RewriterRule>     <Type>Static</Type>     <LookFor>~/Default\.aspx</LookFor>     <SendTo>~/Default.htm</SendTo>     </RewriterRule>     <!--二级页面,定位到动态页面-->     <RewriterRule>     <Type>Dynamic</Type>     <LookFor>~/List\.aspx</LookFor>     <SendTo>~/Show.aspx</SendTo>     </RewriterRule>     </Rules>     </RewriterConfig>     <!-- RUL重写结束 -->     <appSettings/>     <connectionStrings/>     <system.web>     <!--     设置 compilation debug="true" 将调试符号插入     已编译的页面中。但由于这会     影响性能,因此只在开发过程中将此值     设置为 true。     -->     <httpModules>     <!--URL重写-->     <add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter" />     </httpModules>     <httpHandlers>     <!--生成静态页面-->     <add verb="*" path="*.aspx" validate="false" type="URLRewriter.RewriterFactoryHandler, URLRewriter"/>     </httpHandlers>     <compilation debug="false" />     <!--
在Repeater中的linkbutton传两个值的方法 收藏 前台代码: <asp:LinkButton ID="btn_Use" runat="server" CausesValidation="False" Text="引用" OnClick="btn_Use_Click" CommandArgument='<%# Eval("PDR_id")+"_"+(Convert.ToInt32(Container.ItemIndex+1) + pageIndex * pageSize) %>'></asp:LinkButton> 后台代码:      //引用      protected void btn_Use_Click(object sender, EventArgs e)      {          string strText = ((LinkButton)sender).CommandArgument.ToString();          string Sp = "_";          char[] Char = Sp.ToCharArray();          string[] strArray = strText.Split(Char);          string PDR_ID = strArray[0].ToString().Trim();          string num = strArray[1].ToString().Trim();          conn.Open();          SqlCommand cmd = new SqlCommand("select * from PDReply where PDR_ID='" + PDR_ID   + "'", conn);          SqlDataReader reader = cmd.ExecuteReader();          if (reader.Read())          {              string PDR_content = reader["PDR_content"].ToString().Trim();              string id = reader["PDR_user_id"].ToString();              reader.Close();              conn.Close();              //注:因为用到了BR_Name(id),所以这句一定要放在conn.Close();之后。              FCKeditor1.Value = "<fieldset><legend>引用 " + num + "楼&nbsp;" + BR_Name(id) + "&nbsp;的日志:</legend>" + PDR_content + "</fieldset>";          }          else          {              reader.Close();              conn.Close();          }      } 本文来自CSDN博客,转载请标明出处:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fblog.csdn.net%2Fzhangyj_315%2Farchive%2F2009%2F01%2F12%2F3760003.aspx&urlrefer=8c011ad5808944fdca408d63fb7bbdcc
VS2008调试端口不一致,vs无法显示该网页 调试Web程序的时候,突然页面不能显示出来,老是显示着“网页无法显示”的页面。云里雾里,鬼知道是怎么解决的,终于一个惊天大发现:IE地址栏 里面显示端口号和桌面任务栏右下角“ASP.NET Development Server”的端口压根就不一致,我把IE地址栏的端口号改成“ASP.NET Development Server”显示的端口号,结果网页就出来了,后面在Google上继续搜索,查询关键字“VS2005 调试 端口不一致”,终于找到了答案,原来是防火墙的缘故,我把高人的原话引用过来: 是否安装了NOD32 3.0以上版本?或者还有其它什么防火墙类软件? 如果你是安装NOD32 3.0的,按照以下方法做: 依次进入NOD32的高级设置(F5),Web访问保护,HTTP,Web浏览器, 会看到一个程序列表你的devenv.exe应该在其中,双击前面的勾(相当于去掉选中状态), 确定退出,停止一切运行的ASP.NET Development Server ,在VS中打开并重新编译运行你的Web程序 注:其实出现端口号不一致的问题,如果想要web程序跑起来还是没有问题的,那就是不采用随机端口的方式,在VS2005里面的“网站”–>“启动选项”–>“启动选项”,找到“服务器”,然后选中“使用自定义服务器”,在“基URL”中填上web程序的虚拟路径即可,一般就是::http://机器名(或你本机的IP地址)/web程序别名
Sql server STUFF的用法 一个整数值,指定删除和插入的开始位置。如果 start 或 length 为负,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。start 可以是 bigint 类型。      STUFF ( character_expression , start , length ,character_expression )      参数      character_expression      一个字符数据表达式。character_expression 可以是常量、变量,也可以是字符列或二进制数据列。      start      一个整数值,指定删除和插入的开始位置。如果 start 或 length 为负,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。start 可以是 bigint 类型。      length      一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。length 可以是 bigint 类型。      返回类型      如果 character_expression 是受支持的字符数据类型,则返回字符数据。如果 character_expression 是一个受支持的 binary 数据类型,则返回二进制数据。      备注      如果开始位置或长度值是负数,或者如果开始位置大于第一个字符串的长度,将返回空字符串。如果要删除的长度大于第一个字符串的长度,将删除到第一个字符串中的第一个字符。      如果结果值大于返回类型支持的最大值,则产生错误。      示例      以下示例在第一个字符串 abcdef 中删除从第 2 个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串。      1SELECT STUFF('abcdef', 2, 3, 'ijklmn');      2GO      下面是结果集:      aijklmnef
DOS命令大全(经典收藏) 见到网络上,觉得值得学习,特此收藏到这里,因为我几乎天天来这个网站 net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user:"用户名" 建立IPC非空链接 net use h: \\ip\c$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H: net use h: \\ip\c$ 登陆后映射对方C:到本地为H: net use \\ip\ipc$ /del 删除IPC链接 net use h: /del 删除映射对方到本地的为H:的映射 net user 用户名   密码   /add 建立用户 net user guest /active:yes 激活guest用户 net user 查看有哪些用户 net user 帐户名 查看帐户的属性 net localgroup administrators 用户名 /add 把"用户"添加到管理员中使其具有管理员权限,注意:administrator后加s用复数 net start 查看开启了哪些服务 net start 服务名    开启服务;(如:net start telnet, net start schedule) net stop 服务名 停止某服务 net time \\目标ip 查看对方时间 net time \\目标ip /set 设置本地计算机时间与"目标IP"主机的时间同步,加上参数/yes可取消确认信息 net view 查看本地局域网内开启了哪些共享 net view \\ip 查看对方局域网内开启了哪些共享 net config 显示系统网络设置 net logoff 断开连接的共享 net pause 服务名 暂停某服务 net send ip "文本信息" 向对方发信息 net ver 局域网内正在使用的网络连接类型和信息 net share 查看本地开启的共享 net share ipc$ 开启ipc$共享 net share ipc$ /del 删除ipc$共享 net share c$ /del 删除C:共享 net user guest 12345 用guest用户登陆后用将密码改为12345 net password 密码 更改系统登陆密码 netstat -a 查看开启了哪些端口,常用netstat -an netstat -n 查看端口的网络连接情况,常用netstat -an netstat -v 查看正在进行的工作 netstat -p 协议名 例:netstat -p tcq/ip 查看某协议使用情况(查看tcp/ip协议使用情况) netstat -s 查看正在使用的所有协议使用情况 nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写 tracert -参数 ip(或计算机名) 跟踪路由(数据包),参数:"-w数字"用于设置超时间隔。 ping ip(或域名) 向对方主机发送默认大小为32字节的数据,参数:"-l[空格]数据包大小";"-n发送数据次数";"-t"指一直ping。 ping -t -l 65550 ip 死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping) ipconfig (winipcfg) 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用参数"/all"显示全部配置信息 tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内) kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内) del -F 文件名 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如"DEL/AR *.*"表示删除当前目录下所有只读文件,"DEL/A-S *.*"表示删除当前目录下除系统文件以外的所有文件 #2 二: del /S /Q 目录 或用:rmdir /s /Q 目录 /S删除目录及目录下的所有子目录和文件。同时使用参数/Q 可取消删除操作时的系统确认就直接删除。(二个命令作用相同) move 盘符\路径\要移动的文件名   存放移动文件的路径\移动后文件名 移动文件,用参数/y将取消确认移动目录存在相同文件的提示就直接覆盖
首页 1 2 下一页