收集的.Net文章(十七)--.Net开发中的感受

.Net开发中的感受
1:在.net开发中通常文件都放在不同的文件夹中
  所以在开发的时候 就必须注意 在引用命名空间 类型的是时候一定要加上路径 否则就会访问不到
  example:blog.cs.Menu1  title = new blog.cs.Menu1();
   这是在blog命名空间 cs文件夹 下面的Menu1类 如果不加上cs文件夹就不可以

2:
  sing System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;


namespace blog.cs
{
 /// <summary>
 /// Menu 的摘要说明。
 /// </summary>
 public class Menu1
 {
  public Menu1()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

 
 
  public SqlDataReader getclass()
  { 

           
   SqlConnection Conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
   SqlCommand Comm = new SqlCommand("StoreMenu",Conn);
   Comm.CommandType = CommandType.StoredProcedure;
   Conn.Open();


   SqlDataReader result = Comm.ExecuteReader(CommandBehavior.CloseConnection);
   return result;


  }
 
 }
}
我在运行上面的类的程序的时候 出现ConnectionString没有初始化的提示 后来我才知道原来这是
可以有如下方法可以解决
a:在config文件中写上下面这个

   <appSettings>
   
    <add key="ConnectionString" value="server=Localhost;uid=sa;pwd=sa; dataBase= Global" />

    </appSettings>
b:可以改成下面这中形式:
  
  public SqlDataReader getclass()
  { 
            string cnnstr="server=localhost;uid=sa;pwd=sa;database=Global";
            SqlConnection Conn =new SqlConnection(cnnstr);
   //SqlConnection Conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
   SqlCommand Comm = new SqlCommand("StoreMenu",Conn);
   Comm.CommandType = CommandType.StoredProcedure;
   Conn.Open();

   


   SqlDataReader result = Comm.ExecuteReader(CommandBehavior.CloseConnection);
   return result;


  } 

3:对于组建开始不不知道 刚才找到了原来可以定义他的高度和宽度这样就可以 定义定义它的大小
  然后方便放置

4:一个页中只能够放一一个表单  如果把一个控件里面有表单 在把它放在另外一个页中如果也有表单
  这样就会产生冲突,所以就要删掉一个表单

5:Calendar的使用:
  它必须放在表单内像下面这样
  <form id="Form1" method="post" runat="server">
   <asp:Calendar id="Calendar1" style="Z-INDEX: 101; LEFT: 144px; POSITION: absolute; TOP: 128px"
    runat="server"></asp:Calendar>
  </form>
  如果没有表单就运行会出现如下提示
  类型“Calendar”的控件“Calendar1”必须放在具有 runat=server 的窗体标记内。
 

6: string strsql2 = "select * from Favorites";
   //OleDbCommand MyComm = new OleDbCommand(strsql,MyConn);
   OleDbDataAdapter da=new OleDbDataAdapter(strsql2,MyConn);
   DataSet ds=new DataSet(); 
   da.Fill(ds,(RsCount-1)*PageSize,PageSize,"Favorites");
   MyRepeater.DataSource=ds.Tables["Favorites"];
   MyRepeater.DataBind();
   对与上面的da.Fill和ds.Tables["Favorites"]; 
 

7:ALTER PROCEDURE Liuyan
/*
 (
  @parameter1 datatype = default value,
  @parameter2 datatype OUTPUT
 )
*/
AS
 select Count(*) From I_LiuYan
 RETURN

 这是一个存储过程语句 只想说名的是Count(*)返回I_LiuYan的条数


7:  我对三层结构的理解
    我觉得三层是彼此打交道 然后互不干涉,
    像写储蓄过程 如果你把表见得没有问题 然后你的语句没有写错 你完全可以只在里面
    单独的调试 如果没有问题的话  所以的输入 你可以在运行中输入
    而输出也是你看得到了  如果有问题 则运行会提示
    如果你看的输入输出没有问题 那就是ok了 所以对于这一层 你的不要去管了

    而对于类型 就是一个类下面的一个方法的操作
    在这个方法里面 我们可以想它传递参数 然后连接数据库,并把Command的执行的时候
    调用储蓄过程,通过这样去访问数据库(其实我觉得也可以在这里不调用 这就做成了二层结构了)
    这个时候 如果有参数的话 我们应该先向储蓄过程传递进参数 这个时候储蓄过程,会接收
    传递来的参数然后运行事先我们设定的语句 得到我们想要的值 然后在返回给这个方法里设定接收的参数
    然后在有次方法通过return语句送出去
    
    而对与第一层其实就是一个向第二层传递参数 同时把返回来的参数绑定的过程了
    一般先会新建一个要调用类的实例,然后由这个实例去调用这个类小下面的方法
    然后该方法返回的数据 和数据控键进行绑定

    我想把这三层的功能和作用理解了
    如果有问题的话 我们根据它们各自的功能和作用就很容易知道
    是那个环节出了问题
 
8: 对于表单提交的问题
   如果组件中有表单 并且在组键所放的文件夹中也有表单 这个时候就会产生冲突
   并且在实际中我发现 如果让把日历做成一个组键这个时候 如果在日组键中放上
   表单 把该组键所放文件的表单去掉 尽管能够执行但是会提示网页上有错误
   这个时候就是把  解决的办法就是把组键中的表单去掉 只留主文件中一个表单
   第一:这样方便了这个主页 可以放多个组键 都可以在这个页面的表单提交
   第二:系统只允许一个页面放一个表单 

9:
  int TotalPage;
   int ClassBlog = 1;
    //Int32.Parse(Request.Params["F_Id"]); 
   string Cnnstr="server=localhost;pwd=sa;uid=sa;dataBase=Global";     
      string Cmdstr = "select Count(*) From I_LiuYan where I_Class ='"+ClassBlog+"'";   
            SqlConnection Cnn = new SqlConnection(Cnnstr);
  
            Cnn.Open();
            SqlCommand Cmd = new SqlCommand(Cmdstr,Cnn);
   int TotalRecord =(int)Cmd.ExecuteScalar();
   Cnn.Close();
        
   if((TotalRecord%PageSize)>0)
   {
    TotalPage=TotalRecord/PageSize+1;
  
   }
   else
   {
    TotalPage=TotalRecord/PageSize;
  
   }
  此段语句告诉我的是怎么样数据库里返回一个值并对它进行计算
  int TotalRecord =(int)Cmd.ExecuteScalar();
  上此语句很重要 起关键作用是用Cmd.ExecuteScalar()执行查询并返回结果的第一行第一列
  并把它定义为int类型 存放于TotalRecord的变量中


10:step1.visible="true"
   step1代表的是任何的控件 很多的控件都有.visible的性质 它代表的是
   如果该控件是否显示出来  这个性质很重要 必须记住 很多地方都有用途

11:Dim sql as String
           Dim myconn as OleDbConnection
           Dim myCmd as OleDbCommand
          Function getdatareader(str as String) as OleDbDataReader
             myCmd=New OleDbCommand(str,myConn)
             myConn.open()
             getdatareader=myCmd.ExecuteReader()
          End Function
         function executesql(sql as string)
             myCmd=new OleDbCommand(sql,myConn)
             myConn.open()
             myCmd.ExecuteNonQuery()
             myConn.close()
          end function
     这是在vb中看到的 我觉得值得学是在数据库操作的时候 怎么样把连接数据库的语句绑定到
     一个事件中 注意事件一中把getdataReader看成了是一个OleDbDateReader的类型了

12:其实我觉得一份好的开发文挡 必须
   a:尽量少用数据表
   b:还有有必要进行参数传递分析
   c:功能分析
   d:排版分析

13://对存储过程的分析:实例
       //string G_name ,string G_password为传递给此存储过程的参数,string Loging表示方法名和类型
 
  public string Login(string G_Name ,string G_Passord)
  {

   SqlConnection Conn = new SqlConnection(ConfigurationSettings.AppeSettings["ConnectionString"]);
  //此为连接语句
  /*
   ConfigurationSettings.AppeSettings["ConnectionString"]
   表示从Configurantion加载了一条连接语句
   Config里的语句为
   <appSettings>
         <add key="ConnectionString" value="server=Localhost;uid=sa;pwd=sa; dataBase= Global" />
        </appSettings>
         <system.web>
   注意此标是放在<system.web>的上面
   */
   SqlCommand Comm = new SqlCommand("Login",Conn);
        //新建一个SqlCommand的实例Comm并把它标记为储蓄过程名为Login。
       
   Comm.CommandType =CommandType.StoredProcedure;
        //将Comm标记为储蓄过程

 

        //下面为存储过程添加参数
   SqlParameter parameterG_name = new SqlParameter("@G_name",SqlDbType.NVarChar,20);
        // 新建了一个SqlParameter的储蓄过程参数实例:实例名为pranmeterG_name
  //并定义了一个名为"@G_name"的参数名,定义类型SqlDbType为NvarChar 字节数为20;
       
   parameterG_name.Value=G_Name;
        //为参数实例parameterG_name赋值 为这个值是从方法Login中传递进来的值
        //注意parameterG_name.Value=G_name 中的G_name和语句new SqlParameter("@G_name",SqlDbType.NVarChar,20);
     //中的@G_name是不同,@G_name是为一个SqlParameter的储蓄过程定义的一个参数名
 
   Comm.Parameters.Add(prarameterG_name);
        // 为Comm为添加参数paratemterG_name

 


   SqlParameter parameterG_password = new SqlParameter("@G_password",SqlDbType.NVarChar,20);
   parameterG_password.Value=G_password;
   Comm.Parameters.Add(parameterG_password);

   SqlParameter parameterG_Id = new SqlParameter("@G_Id",SqlDbType.Int,4);
   parameterG_Id.Direction = ParameterDirection.Output;
            // parameterG_Id.dDirection 获取或者设置一个值,该值指示指示参数是只可
     //只可以输入,只可以输出,双向 还是存储过程返回值参数
            //ParameterDirection.Output;定义了此参数为输出参数
   Comm.Parameters.Add(paramerG_Id);
           
   //打开连接并执行Command命令
   Conn.Open();
   Comm.ExecuteNonQuery();
   Conn.Close();
           
   //对获得parameterG_Id.Value的值进行处理
   int G_id =(int)(parameterG_Id.Value);

   if(G_id==0)
   {
    return null;
    //返回空
   }
   else
   {
    retrun G_id.ToString();
    //将此信息转换为等效字符串的表现形势
   }

14:其实我发现在代码的编写过程中,一定要自己写 不要老看出 先把它写出来 在运行去改
   a:理解的东西很容易写出来
   b:然后要是写什么文本框名的 这个时候就可以参照定义的文本框名什么的  这个网页都有

15:在自定义颜色里 可以进行色彩的调配这是运用所学的美术知识的一个很好的地方
   这样可以模似美术里的调色

16:怎么样在代码中做弹出警告
      Response.Write("<script>alert(\"成功\")</script>")

17:以前对字段的名字不明白 想在建设数据库表的时候 也提到字段
  现在觉得比能够理解 其实就是一个对象 像建设留言本 L_Id,L_Name,L_Note
    这些都是字段他们有容量 就是字节了 然后字段有类型啊 现在好理解了

18: string Cmdstr = "select Count(*) From I_LiuYan where I_Class ='"+ClassBlog+"'";
    Label4.Text=Cmdstr;
    差点忘记一个调试的技巧了 可以把sql语句输出来检查错误

19:想显示不同类的标题的时候 类下面的标题专题还没有选择啊 这个时候可以这样解决
  这个方法有一定通用性:
  public void Page_Load(object sender, System.EventArgs e)
  { 
   if(!IsPostBack)
   {  
    BindGrid(a);
   }
 
          
  }
  private void BindGrid(int RsCount)
  {
                 //处理的数据 
        }  
  
  当页面加载的时候 我们可以设定传递一个参数给BindGrid
  如果我们以后再调用BindGrid,并传递参数给BindGrid参数 
 达到我们想选择类的目的

20:在开发中我发现可以把绑定数据源,可以做成那种滚动的效果
   我知道的有Pepeater里绑定的数据源

21:一个值得学习的例子
            SqlDataAdapter da= new SqlDataAdapter(strsql2,Cnn1);
  
   da.Fill(ds,(RsCount-1)*PageSize,PageSize,"I_LiuYan");

   /*对da.Fill的理解,以前对这个不是理解,不过现在比较明白了
    这是参加da.Fill 里的系统提示 同时结合自己实践理解的
     Fill()里有四个参数,第一个表示DataSet 第二个表示填充的标,而第二个RsCount-1)*PageSize
     表示分页的起始页,第三个参数PageSize表示每一页显示记录的条数。
     */
  
   int ex =(RsCount-1)*PageSize;
   Label3.Text=ex.ToString();
           而第而条语句 ex.tongstring();告诉我的是很多时候 我们为了看清楚语句的执行情况
           可以先把他转换成字符串然后再显示出来

22:LinkButton的灵活运用
    前台代码
    <asp:linkbutton id="PageFirst" runat="server" Text="首页" CommandArgument="First">首页</asp:linkbutton>
    <asp:linkbutton id="PagePrev" runat="server" Text="上一页" CommandArgument="Prev">上一页</asp:linkbutton>
    <asp:linkbutton id="PageNext" runat="server" Text="下一页" CommandArgument="Next">下一页</asp:linkbutton>
    <asp:linkbutton id="PageLast" runat="server" Text="最后一页" CommandArgument="Last">最后一页</asp:linkbutton>
   
    后台代码:
    private void InitializeComponent()
  {
   this.PageFirst.Click += new System.EventHandler(this.PageCut_Click);
   this.PagePrev.Click += new System.EventHandler(this.PageCut_Click);
   this.PageNext.Click += new System.EventHandler(this.PageCut_Click);
   this.PageLast.Click += new System.EventHandler(this.PageCut_Click);
   this.Label1.Load += new System.EventHandler(this.Page_Load);
   this.Load += new System.EventHandler(this.Page_Load);

  }
  #endregion

  private void PageCut_Click(object sender, System.EventArgs e)
  {
   LinkButton lb =(LinkButton)sender;
   //这里是为声明lb为System.Web.UI.WebControls.LinkButton
   String commangArg=lb.CommandArgument.ToString();
   /* 这里获得LinkButton的属性值,这里根据不同的LinkButton触发不同的事件从而
    获得不同LinkButtton的属性值 
    我觉得这里也是很值得学习的 是一个很好的学习点
   */
  
  
   switch(commangArg)
   {
    case"First":
    {
     BindGrid(1);
     break;
    }
    case "Prev":
    {
    
     BindGrid(int.Parse(Label1.Text)-1); 
     break;
    }
    case "Next":
    {
     BindGrid(int.Parse(Label1.Text)+1);
     break;
    }
    case "Last":
    {
     BindGrid(int.Parse(Label2.Text));
     break;
    }
    default:
    {
     break;
    }
   }
  }
      要说这里值得学的就是我觉得对LinkButton的灵活运用,甚至还可以引用到其他控件

19:Response.Redirect("../blog/index.aspx");中的Response相对服务器的绝对路径 所以
   这个时候我我们要使用绝对路径 但是如果我们使用是其他控件 像链接按纽 我们就可以
   写成这样的路径:../index.aspx

          
 18:对三大控件的分析小的归纳

   1:DataGrid控件中的列的类型包括5中:BoundColumn ButtonColumn  EditCommandColumn
   HyperLinkColumn TemplateColuMn

    BoundColumn:表示绑定到数据源中的一个字段,同时使用样式显示在DataGrid表格中,其中
  属性DataField表示其对应的数据源字段或者属性,DataFormatString表示该字段显示的格式
  ReadOnly表示该列为只读,即无法编辑,BoundColumn为DataGrid控件的默认的列类型
  //评论:这就是说它是绑定到每一个列的第一个字段
    
 
    ButtonColumn即按纽列,表示该列中每一项为一个用户自定义的按纽,如添加按纽等,
  其中,属性ButtonType表示所以显示按纽的类型,默认值为LinkButton; CommandName
    表示单击该按纽的时候所执行的命令,DataTextField表示绑定到ButtomColumn中按纽的
  Text属性的字段名,Text表示按纽上所执行的标题
  //评论:它没有说绑定到那里位置放在那里就在那里 但是告诉了我们绑定的是按纽

    EditCommandColumn是一种特殊的列类型,它包含了用于编辑每行数据的各种编辑命令按纽
  如果编辑取消等等,其中,属性ButtonType表示要显示的按纽的类型,默认为值为LinkButton
    EditText:表示在编辑按纽上显示的文本 
  UpdataText表示在更新按纽上显示的文本
    CancelText表示在“取消”按纽上显示的文本
    //表示对数据库里每天一行的编辑 其实就是在这里面完成的,像更新,编辑,取消 等等
   
    HyperLinkColumn即超级链接列,用于创建绑定到数据字段值的超级链接的列,其中属性
    DataNavigteUrlField:表示DataSource中对象的字段或属性,它提供了所要链接到的Url
    DataNavigateUrlFormatString:用于设置Text属性的显示格式;
  DataTextField:用于设置列Text属性的数据源
  NavigateUrl:表示要链接到的页的Url地址
  Targe:表示显示链接页的目标窗口如:top,blank
    Text:表示超链接文本
  // 我觉得这个属性就是其实就是告诉你怎么样把数据库里的某一字段放在表里,并且这个并且
    把它做成链接啊 可以对它链接的Url地址 目标窗口 包括他链接时候 传递的数据源
    以及链接文本的显示格式。 
    
  
    TemplateColumn即模板列,其所以建的列允许使用自定义html元素和控键的模板来定义控件的布局
         EditItemTemplate:用于定义该列处于编辑状态时候的html元素和控件
         FooterTemplate:用于定义该列注脚编辑状态时的HTML元素和控件
         HeaderTemplate:用于定义列标头的HTML元素和标签,
         ItemTemplate:用于定义该列显示的HTM元素
   
    //这中用法我还没有用过但是我想这应该是在html标签中自定义模板列,
      看以以后的例子吧

    //总结
      我发现这个四个属性分别定义了绑定列,链接,按纽,模板,按纽,特殊列。还有定义各种对事件进行操作的列
      其中链接为链接到其他地址,按纽是定义各种按纽事件,模板支持自定义 而绑定列就是把数据绑定到第一个字段   
      注意:BoundColumn绑定的是行而其他的是列
      DataGrid控件主要用于一表格的方式来显示数据,它允许用户定义各种类型的列以控制网格单元
      格内容的布局,并添加特定的功能

  2:DataList控件
    DataList控件主要用通过模板来显示数据,Datalist控件所显示的数据格式,都可以通过模板
    和样式来定义,这也是DataList控件与DataGrid控件,Repeater控件最大的不同
    DataList控件所提供的模板包括:
    AlternatingItemTemplate:主要用于控件交替行所显示的文本和控件样式
    EditItemTemplate:主要用于控制处于编辑状态下的项文本和控件样式
    FoolterTemplate:主要用于控制的脚注所显示的文本的样式
    HeaderTemplte:主要用于控件DataList标头所显式的文本和控件样式
    ItemTemplate:主要用于控件DataList控件中每一行所显示的样本和格式
    SelectedItemTemplate:主要用于控件用户所选中的DataLsit控件的一项所显示的文本和控件样式
    SeparatorTemplate:主要用于控制DataList控件中各项间分隔符的样式
   //其实我觉得书上说的很对 Datalist主要是通过定义模板来显示数据,它通过定义不同模板
    来控制:在不状态下,交替行,编辑,所选中行 所以显示的文本和格式
    还有定义控件脚注和标头的样式,总的来说通过定义不同的模板,可以自定义DataList控件的
    外观来内容
 
  3:Pepeater控件
    Pepeater控件的主要功能是以更自由的方式 来控制数据显示,也就是说可以使用非表格的形式来
    显示数据,从而灵活的定义自己的风格
    pepeater就一个基本的容器控件,它没有内置的布局或样式,不具有固定的外观,因此该控件
    的模板内显式地声明所有的HTML布局,格式设置有样式标记,Repeater控件没有内置的选择和编辑支持
    可以通过ItemCommand事件处理从模板引发到该控件的控件事件 所以点击它的属性的时候
  你会发现 好多它的属性没有 因为主要是靠自己去定义

  HeaderTemplate:定义头标签,在实际中我发现 这个标签是它可以给表格取一个标题
          但是他不能够绑定数据
  FooterTemplate:定义脚标签,在实际中我发现 这个标签是它可以给表格取一个标题
          但是他不能够绑定数据

   
    //我觉得Pepeater主要是支持自定义功能
 
  总结上述:DataList DataGrid pepeater 三种数据控件各有各的特色,但是相同的是,他们绑定
      一个数据源,为数据源中的每一条记录生成一个条目,他们都是以列表的形式来显示条目
    
   


                       
  

  20: ordery by   I_name ASC 所谓ASC应该是按照字母的大小写 排序  

 21:SqlParameter parm1=new SqlParameter("@Titel",SqlDbType.VarChar,20);
   parm1.Value=this.TextBox6.Text;
  此段语句告诉我们的是怎么样文本框中获得值并放到并作为参数放到parm1中

 22:SqlParameter parm1=new SqlParameter("@I_Id",SqlDbType.Int);
    parm1.Value=this.DataGrid1.DataKeys[e.Item.ItemIndex];
    comm.Parameters.Add(parm1);
    常常会看要用到获得主键的值,比如我们用DataGrid 绑定一个表,这个时候我们想用
  点击那一行 就获得那一行的主键,这个时候
  因此我们需要为DataGrid指定一个DataKeyField(前台代码中)告诉它,
  我的表的主键就是这个字段,在绑定了以后DataGrid的DataKeys就存储数据
  了列表控件中每个记录的主键,所以取的时候用索引
  this.DataGrid1.DataKeys[e.Item.ItemIndex]来取就可以得到主键

  注意在前太代码中必须有:DataKeyField="I_Id"不然是获不到主键的

 23: 对 SqlDataReader result = Comm.ExecuteReader(CommandBehavior.CloseConnection);
     语句的解析
      中ExecuteReader为返回一个SqlDataReader对象,这里是返回给result,而result
      必须声明为SqlDataReader,提供对查询结果和和查询对数据库影响的说明
      

 24:有的时候看到他们写代码 很快 很流利,但是仔细想象 只要把三层关系 各种块搞清楚了 其实也就很简单的
    首先 数据库建表:开发者要对整个系统表的字段,属性,说明 表名 能够记得清楚 建起表来就简单了
         存储过程写法:把sql语句理解了 如果不知道可以查询sql帮助文件,然后剩下的事情就很简单了
         类文件写法:(其实也就是连接数据库的文件的写法)我觉得把连接数据库的一个类,以及他们的关系
                      理解清楚了,就可以很好的写出来了
         第二层的cs文件的写法:这里的文件基本上要知道怎么样调用类行文件(这个比较简单)
                     同时能够知道引用各种建的对象(像按纽什么的)这个新建的对象在文件中都有定义的
                     然后要知道C#语言(基本上用的是一些条件什么的控制语句)去控制这些对象
         前台:很简单了
         html层:这里的觉得 其实的没有问题 就是对那三个时间绑定控件的属性还要搞一下才好。                  

 25:今天在开发中,发现在《解决方案资源管理器》 上面的查看代码,视图设计器中 这几个选项目
     很好使用,它可以方便的我在前台与后台之间 像以前那样去点击视图窗口上面去找        
    


 26:以前对Panel这个小兵 并不是很注意 因为觉得应该太小 不太注意吧
    其实仔细想想它还是关键时候起作用的 它能够做为其他控件的容器,我们可以利用它的属性
    可以达到显示和隐藏控件的目的
 
 27:直接从数据库获得时间的写法:(getdate())
     在文件中声明时间变量:DateTime now = DateTime.Now;
 28:对与时间的使用就要用到 now这个对象,点击它你会发现有很多的属性和方法
    包括对日期的加,获得不同的时间 还有进行时间的转换都在这里,所以找到now 你就可以
    一个对时间处理的法宝

 29:我觉得在开发个人博客系统中有一个感受 就是需求分析是最重要的,所以一个好的需求分析能够为你以后的开发扑平了道路
    我觉得应该按照这样的步骤去开发:
    a:掌握本网站的体现的思想
    b:写好系统功能文档
    c:在数据库里建好所有的表
    d:写好所有的存储过程语句
    e:写好所有的类型文件
    f:建各种模块,前台
    h:进行系统的调试
    j:与美工设计前台进行对接

 30:在类型文件中:using System.Configuration;
    SqlConnection Conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
    中的(ConfigurationSettings.AppSettings["ConnectionString"])无效

    如果不用引用直接用的话 可以这样写
   SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);
    
 
 31:  public void Del_Click(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
  {
   try
   {
    SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);
    SqlCommand comm=new SqlCommand("delete from L_LeaveWord where L_Id=@L_Id",conn );
    SqlParameter parm1=new SqlParameter("@L_Id",SqlDbType.Int);
    parm1.Value=this.DataGrid1.DataKeys[e.Item.ItemIndex];
    comm.Parameters.Add(parm1);
    conn.Open();
    comm.ExecuteNonQuery();
    conn.Close();
    SetBind();
   }
   catch(System.Exception exc)
   {
    Response.Write(exc.Message);
   }
  }
  这段程序在运行的时候 如果索引值小于0就会出错误,但是如果加上try-catch就不仅能够保证页
  面的正常运行 还每个把错误信息显示在页面上  
 
 32:
   function makesql()
   select case xianzhi.SelectedItem.value
      case "0"
      sql="insert into ads(sitename,picurl,url,class,place,window,regtime) values('"& sitename.text &"','" & picurl.text &"','"& siteurl.text &"',"& xianzhi.SelectedItem.value &","& place.SelectedItem.value &","& opentype.SelectedItem.value &",'"& now() &"')"
   case "1"
      sql="insert into ads(sitename,picurl,url,class,place,window,clicks,regtime) values('"& sitename.text &"','" & picurl.text &"','"& siteurl.text &"',"& xianzhi.SelectedItem.value &","& place.SelectedItem.value &","& opentype.SelectedItem.value &","& cint(click.text) &",'"& now() &"')"
   case "2"
      sql="insert into ads(sitename,picurl,url,class,place,window,shows,regtime) values('"& sitename.text &"','" & picurl.text &"','"& siteurl.text &"',"& xianzhi.SelectedItem.value &","& place.SelectedItem.value &","& opentype.SelectedItem.value &","& cint(show.text) &",'"& now() &"')"
   case "3"
      sql="insert into ads(sitename,picurl,url,class,place,window,lasttime,regtime) values('"& sitename.text &"','" & picurl.text &"','"& siteurl.text &"',"& xianzhi.SelectedItem.value &","& place.SelectedItem.value &","& opentype.SelectedItem.value &","& enddate.text &",'"& now() &"')"
   case "4"
      sql="insert into ads(sitename,picurl,url,class,place,window,clicks,lasttime,regtime) values('"& sitename.text &"','" & picurl.text &"','"& siteurl.text &"',"& xianzhi.SelectedItem.value &","& place.SelectedItem.value &","& opentype.SelectedItem.value &","& cint(click.text) &",'"& enddate.text &"','"& now() &"')"
   message.text=sql
   case "5"
      sql="insert into ads(sitename,picurl,url,class,place,window,shows,lasttime,regtime) values('"& sitename.text &"','" & picurl.text &"','"& siteurl.text &"',"& xianzhi.SelectedItem.value &","& place.SelectedItem.value &","& opentype.SelectedItem.value &","& cint(show.text) &",'"& enddate.text &"','"& now() &"')"
   case "6"
      sql="insert into ads(sitename,picurl,url,class,place,window,clicks,shows,lasttime,regtime) values('"& sitename.text &"','" & picurl.text &"','"& siteurl.text &"',"& xianzhi.SelectedItem.value &","& place.SelectedItem.value &","& opentype.SelectedItem.value &","& cint(click.text) &","& cint(show.text) &",'"& enddate.text &"','"& now() &"')"
   end select
   return sql 
  end function
  此例子是用vb做的 但是很值得学习,因为它告诉了我怎么样对数据库不同的查询进行控制,很有意思   
    
    

  33: replace的使用 

举个简单例子
str="abcdef"
s=replace(str,"bc","xy")
结果s="axydef"

 

附Replace 函数详细介绍

描述
返回字符串,其中指定数目的某子字符串被替换为另一个子字符串。
语法
Replace(expression, find, replacewith[, compare[, count[, start]]])
Replace 函数的语法有以下参数:

参数 描述
expression 必选。 字符串表达式 包含要替代的子字符串。 
find 必选。被搜索的子字符串。
replacewith 必选。用于替换的子字符串。
start 可选。expression 中开始搜索子字符串的位置。如果省略,默认值为 1。在和count 关联时必须用 
count 可选。执行子字符串替换的数目。如果省略,默认值为 -1,表示进行所有可能的替换。在和 start 关联时必须用。
compare 可选。指示在计算子字符串时使用的比较类型的数值。有关数值,请参阅“设置”部分。如果省略,缺省值为 0 ,这意味着必须进行二进制比较。

 


设置
compare 参数可以有以下值:
常数 值 描述
vbBinaryCompare 0 执行二进制比较。
vbTextCompare 1 执行文本比较。


返回值
Replace 返回以下值:
如果 Replace 返回
expression 为零长度 零长度字符串 ("")。
expression 为 Null 错误。
find 为零长度 expression 的副本。
replacewith 为零长度 expression 的副本,其中删除了所有由 find 参数指定的内容。
start > Len(expression) 零长度字符串。
count 为 0 expression 的副本。

 34:在开发中有一个这样的发现;如果我做一个组件 在里面建一个表 但是很难定位
    因为它不是嵌套在html中的 所以我可以拖动表 后来我才发现原来  原来这个问题
    因为在编辑的时候 你拖动表的时候可以进行定位 这个定位座表 在编译平台有显示

35:在开发中遇到这样的一个难题 我做内容显示的时候,只想显示一部分 开始不知道怎么做  
   不过现在知道了,当时我想到是不是可以对从数据库里,找出的数据绑定字段进行操作
    现在知道了,其实这个完全可以做到的
    这里有二中方法:
     a: select left(内容,6) 姓名,性别 from 表
     b: Text='<%# substring((string)DataBInder.Eval(Container, "DataItem.title"))%>'
        public string substing(sting sss)
        {  if( sss.Length>2)
             {
                 return sss.Substring(0,6)+"...";
             }
            else
             {
                 return sss;
              }
         }
         

 36:怎么样把自符串转换成为为它等效的整数形式:
   Example: int.Parse(Label1.Text)

 37:昨天出现了一个小的问题:害的我今天搞了一个下午 不过终于找到原因了
    程序是这样的:
      if(int.Parse((Label1.Text)+1)>int.Parse(Label2.Text))
     { 
      BindGrid(int.Parse(Label1.Text)+1);
      break;
     }
  细看此程序没有什么错误:可是当我LabeL获得int.Parse((Label1.Text)+1)的值得时候 出现了成十倍增长的数字
   如果:11,21,31,。。。
   开始一直觉得莫名其妙,后来无意去掉后面那个"+1"发现可以正确显示翻页,最后终于发现是把1写进了int.Parse()
   的括号里了,其实正确写法应该是 if(((int.Parse(Label1.Text))+1)>int.Parse(Label2.Text));


 38:今天发现了一个新功能 在组建里可以放组件 这到是以前我没有想到了 这确实给我带来许多方便了
    现在看编程也可以相通的地方,这里做的组件 也相于flash里的元件,但是值得注意的是我们不能够
    直接连接到一个ascx页面

 

  39:想从前台获得一个id, 并且知道id类型的是int
    于是我是这样写的代码:
  前台:<%#substr((int)DataBinder.Eval(Container.DataItem,"I_Id"))%>
  后台: public string substr(int sss)
  {
   Response.Write("<script>alert(\"成功\")</script>");
   Label3.Text=sss.ToString();
   return sss;
  }
  结果在运行的时候出现这样错误提示:无法将内容隐式转换为string;
    其实这种错误提示我是经常能够看到的 在调试过程中。
  在这次调试过程中 我在想 是不是 用return 不能够返回int型 或者还有一个可能那就是
  return 只能够返回sting
  于是我将return sss;作了以下更改:|| reurn 23; || int a=24;return  a;||bool a=23;
     ...
    我终于发现用所有的数值类型都回出现和上面一样的错误提示:
  但是如果我把a定义为sting 并赋给它一个字符串值的时候 我发现就可以了
  所以我觉得return应该是只能够字符串(当然这只是在.net中,我也还没有真正的去证实,看以后去检验了
    在C#中是不存在这个问题的)
   

40:怎么样从存储过程中取值:并进行判断
    int i_AdminID = (int)parameterAdminID.Value;
   if (i_AdminID == 0)
    return null;
   else
    return i_AdminID.ToString();   

41:在.net编程过程中我几乎在忘记一个概念 开始在搞操作 那就是忘记了一个类可以调用另一个类
     的方法,类与类 等等在C#里学的那些  在这里是可以灵活运用的

 

42:在程序的调试中经常会出现这样那样的错误提示:还有一个很好的方法 就是直接将错误提示
   放在google中去搜 就可以了

43:除了Session() Request  之外还有一个可靠 传参数的方法:Server.Transfer

44:trim:为掉字符前后的空格

45:今天在开中发现好象 我们可以利用文本输入框的属性控制输入的字符的数量 觉得这是很有用的


46:对类层过程的再一次理解,就是对从存储过程里传递来的数据进行接受(也可以处理)并传回,
   并从把从前台获得的数据传递给存储过程
 
47:注意在写语句的过程中遇到写一些参数的时候,你写到那个参数那个提示就会变成黑体  
 
   
48:如果像那种声明实体的语句,如果你在等号前段打对了语句 那么在new 关键字之后系统的提示
   将自动定位到你声明的那种实体

49:因为刚才在用like做模糊查询的时候,因为一其他的原因 让我怀疑是like的错误 所以找了我
   很久 不过后来终于发现是没有模糊查询的变量没有传递进来 我开始还以为是从输出语句看不到
   变量是因为没有显示后来才知道这是因为没有获得变量的原因。
   现在对sql语句作一个小结:

   like存储过程中的写法为:
           (  @Search nvarchar(255) )
          AS
           SELECT Count(*)
            FROM I_LiuYan
          WHERE (I_Title LIKE '%'+@Search+'%' ) OR
          (I_Note LIKE '%' + @Search + '%')OR
          (I_Man  LIKe '%' +@Search+'%' )
           group by
          I_Lytime  
                  
    RETURN
    //注意这里的1:like是@search 2:分别用二个单引号围住like, 3:用一个加号围住@Search
      4:多个like语句中间or  5:排序用group
 
    在cs类型文件中的写法为:
     string strsql="select I_Id,I_Title,F_Id,I_Note,I_Man,I_PinglunNumber,I_Lytime from I_LiuYan";
     string strsql2=strsql+" where I_Title like'%"+Search+"%'or I_Note like'%"+Search+"%'or I_Man like'%"+Search+"%'";
     //1:这里和在存储过程中在like部分只有Search前面去掉了@
       2:这里还有一点要注意的是,也是经常容易出问题的是,如果sql字符太长,这个时候我们就要
         进行字符串的连接,其实目的很简单就是要把二个字符串连接,所以我们要做的这样的工作
         a:把每一段sql前后加上引号这样就能够确保这段sql是字符串,
         b:还要注意的就是因为在sql语句中有的时候 是需要空格的 如果这个时候我们在连接的
           的时候很容易的把这个空格去掉了像上面 I_LiuYan和where中间是需要空格的 但是如果
          在strsql2的语句 where前我们不加上空格就很会变化成 I_LiuYanwhere这样就会出错误
          所以我们一定要几住 在连接每一条sql语句的时候前面要上空格

50:今天知道其实获得客户断的IP很容易,但是我们却可以利用这个功能做很多的事情
   如果做统计访问人数,控制一台计算机上重复登陆等等,

51:今天突然在网上看到其实在前台显示的字符串,也可以通过样式去控制实现 不过我没有试过

52:经常看到类型似于这样的Link方面的句子:
   可是很容易写错: 现在对其作一个小结:
     Number1:<asp:HyperLink Id="HyperLink1" Runat="server" NavigateUrl='<%#"../ShowIndex.aspx?F_Id="+DataBinder.Eval(Container.DataItem,"F_Id")%>' Text ='<%# DataBinder.Eval(Container.DataItem,"F_Name")%>'/>
     Number2: 
            <td>
      <%#DataBinder.Eval(Container.DataItem,"I_Lytime")%>
            </td>
     首先分析Number2:对与绑定的数据字符我们要用引号如:"I_Lytime"
     而它前面是Container.DataItem,我想应该是数据集 Container.DataItem,"I_Lytime"
     告诉的是从数据集里面取出一个数据字节,当然数据集里的字是绑定从数据库从传来的
     DataBinder.Eval绑定的标志,说明这是一个绑定,和前面连起来的意思就是说,从数据
     库取出的字节的存放在Container.DataItem里,这里取出了I_Lytime进行绑定
     而<%# %>是绑定的标志 注意在Number2 这样就可以了 括号外面不要加引号了
     直接放在标签中就可以了
     但是如果要把它作为一个值附给一个对象的某个属性 那么就应该在前面加上引号
     像Text ='<%# DataBinder.Eval(Container.DataItem,"F_Name")%>' 一样
     那么加引号 到底是单引号 还是双引号呢,这里有一个规则:就是从里到外 以双引号
     开始,外面一层加单引号,单引号外面在加双引号,这样递归。。
     example: 在sql语句的中的表现:
     string strsql="select I_Id,I_Title,F_Id,I_Note,I_Man,I_PinglunNumber,I_Lytime from I_LiuYan";
     string strsql2=strsql+" where I_Title like'%"+EndSearch+"%'or I_Note like'%"+EndSearch+"%'or I_Man like'%"+EndSearch+"%'";
   
         
    而对与asperLink控件中
    NavigateUrl的用法就只注意: 1:NavigateUrl等号另一边 必须要加上引号,因为它是作为一个属性,其实在
    上面举的例子也一样,Text ='<%# DataBinder.Eval(Container.DataItem,"F_Name")%>'数据绑定也加上引号了
    另外一个要注意的就是对于要传递的参数的存放的变量 和引的页也必须加上引号
    所以就出现了:"../ShowIndex.aspx?F_Id=" 就上引号的现象,对于绑定的数据是不要加上引号 只是里面的数据字段
    要加上所以就有这样的了在NavigaterUrl后面:DataBinder.Eval(Container.DataItem,"F_Id")
     当然为了连接在DataBinder前面要加上“+”的连接字符标志


  53:平时老以为是写sql查询语句的时候一定要根据数据表里的字节排列顺序来写
      如:数据表里有I_Id,I_title二条记录,写select的时候不一定要
          这样写: select top 10 I_Id,I_title  from  I_LiuYan order by  I_Lytime
          其实也可以这样写:
                   select top 10 I_title I_Id  from  I_LiuYan order by  I_Lytime
  
  54:对与sql语句涉及的东西太多 针对经常写错 再一次写一点体会
     1:sql语句把它看作为一个字符串,所以前后要加上引号,
     2:在sql语句里面 如果是表里面的字节就不用加上引号
     3:如果不是的经常出现变量 就要加上三层东西 如: L_Mode='"+Mode+"'
         第一层为:+ //注意不能够者空格,或者是&字符
         第二层为:双引号
         第三层为:单引号
        当然这只是大多数的 如果想有like'%"+EndSearch+"%' 这样的语句 就不同了
        同时在Vb中其要求也有小的变化

 
   55:开始以为C# 区分大小写不是很好,不过现在却觉得相反了 其实这样挺好的因为可以通过变化大小写命名
   这样挺方便的  

  
  56: 通过这一段时间的实战
   体会到如下好处
   a:使用组件:可以让我省了在多个页面编写同样的代码
   b:使用存储过程:即可以提高系统运行速度 同时还能够对sql语句进行集中统一管理 更改 起来比较方便
   c:建立类型文件:可以对和存储过程打交道的语句进行集中统一管理
   d:.net平台:不同以往的任何平台,集中开发提高了开发效率
   e:采用与句绑定 即可以重复利用代码 也可以有利于结构化编程
  
   57:一个控制数据库表显示条数的一个方法
     SqlConnection Cnn1 = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
     string strsql="select * From I_LiuYan";
  Cnn1.Open();
  DataSet ds = new DataSet();
  SqlDataAdapter da= new SqlDataAdapter(strsql,Cnn1);
  da.Fill(ds,(RsCount-1)*PageSize,PageSize,"I_LiuYan");
  #region
  /*这里有一个值得注意的地方,我本来是要查询出10条记录
    可是我查询表是这样写的select * 并没有说只查询出十条记录
   这是我的目的答到了,表中只显示出十条记录,我晕了,神仙
   在帮我吧,后来我知道了不是的,原来是
   da.Fill(ds,(RsCount-1)*PageSize,PageSize,"I_LiuYan");
    语句在作怪,PageSize,为1,既每一个页面显示的记录数为1;
   而通过我定义TotalRecord=10控制了RsCount-1其实页
    从而间接的达到了,控制显示数据表记录条数的目的
   */
    #endregion
    Repeater1.DataSource=ds.Tables["I_LiuYan"];
    Repeater1.DataBind();
    DataTable t;
    t=ds.Tables["I_LiuYan"];
    Label1.Text=RsCount.ToString();
    Label2.Text=TotalPage.ToString();
    ds.Clear();
     Cnn1.Close();
  
   58:开始对想查询最新记录 可是我查到的却是最早的记录 用top 后来才想到用DESC 这样的话就可以查到最新的了
     select top 10 P_Name,I_Id from  P_PingLun ORder by I_Id DESC ;
  
   59:网站配置可以分为以下几种配置:
      公共模块类:即主要是类型的cs文件
      网站样式类:主要指css
      数据访问类: 主要指数据库访问的封装
      网站配置文件:web.config的配置
      上面这些方面 它的意义是具有全局性的,所以说特别数据库访问的封装,既让我感觉到
      比较新鲜,也让觉得确实能够提高工作效率,并且有利于结构化编程
   60:一定要弄懂网站配置的问题 重点是config文件,这个太重要了
      很多时候 把比人的文件拿到自己机子上不能够运行 这真上太郁闷的事情了
  
   61:对控件的启用不关闭的控制
      Example:
       private void PageInit()
  {
   int nState = int.Parse(TxtState.Text);
            //TxtState.Text是在各中按纽事件调用该事件的时候传递过来的值

   PalView.Visible = (nState != 0) ? true:false;
   PalArticle.Visible = (nState == 0) ? true:false;

   BtnAdd.Enabled = (nState == 0 || nState == 1) ? true:false;
   BtnDel.Enabled = (nState == 0 || nState == 1) ? true:false;
   BtnSave.Enabled = (nState == 2 || nState == 3) ? true:false;
   BtnCancel.Enabled = (nState == 1 || nState == 2 || nState == 3) ? true:false;

    //上面这些是对在操作的时候 各种控件进行可用不可用的控制
                  //其实我觉得在这里我学的一个方法就是对控件的用与否的控制问题
    //也觉得了我一个对我网站前面组件的显示与否的控制问题
  }
 
       调用此方法:
        private void BtnAdd_Click(object sender, System.EventArgs e)
  {
   TxtState.Text = "2";
   PageInit();
   Clear();
  }
        开始对这个不是很理解,PageInite()调用了此方法, 是BtnAdd_Click这个事件,
        但是在PageInit()中按钮BtnAdd.Enabled = (nState == 0 || nState == 1) ?
        true:false;它只有1和0啊,后来我是终于明白了是怎么回事了,其实在这里
        在调用这个方法的时候,通过TxtState.Text=2;语句把TxtState.Text的值设为2
        这样在整个方法PageInit()方法中
        对于上述按纽,如果有nState=2并且为Ture的可以执行   
        
       
    62:对config的理解:
        因为以前其他的编程语言做出的东西,放在服务器上,存在比较烦琐的配置的问题
        但是在.net就不同了 它把这些放在一个config的文件中,这样我们就可以只通过
        配置config,从而达到在是放在服务器上web程序能够运行

    63:对dll文件的理解
        dll文件是经过编译的,这样的好处就是能够使别人看不到自己的原代码,特别是
       如果我公司做的软件是放在服务器上 服务器管理员 是看不到我的程序源代码的
        同时 我可以通过更改dll文件 从而达到更改服务器上文件的目的

    64:这次做系统有一个体会 最好把各个模块的文件 放在一个文件夹中
  
    65:出错页面是在congfig中定义
 
    66:关与怎么样把文件存在数据库 ,本来以前对这个问题不是很清楚,
        但是现在可以对其做一个总结了
        一般要把文件存进数据库 应该取得客服端文件的三个方面的数据
        a:文件名:
          imgUploadedName = UploadFile.PostedFile.FileName;
          这只是取得文件的完全限定名
          在对其加工,取得文件的真正名
         (这里可以获得用户自己命明的)
          imgName_value = GetLastRightOf(" \\",imgUploadedName );

           public string GetLastRightOf(string LookFor,string myString)
  {
   int StrPos;
   StrPos = myString.LastIndexOf(LookFor);
   return myString.Substring(StrPos + 1);
  }
 
   //如果文件名输入文本没有输入,则从上取得上传的问件名
   //当然这是通过GetLastRightOf获得真正的上传文件的问奖名
         这样得到的文件名就是最后的文件名 imgName_value就可以直接
          存到数据库了

        b:获得文件的数据类型
          imgContentType = UploadFile.PostedFile.ContentType;
 //获得文件的类型
          这样得到了imgContenType 就可以直接存到数据库里了
          注意这个类型没有特别的要求 只要数据库里类型定义为
          Varcahr 就可以了


        c:正式读取文件
           这是一重点也是整个文件存到是数据库的关键
           这里的步骤为:
           1:Stream imgStream;//提供字节序列的一般视图
              imgStream  = UploadFile.PostedFile.InputStream;
              //UploadFile为上传文件文本框的文件名
       //PostedFile为获得由客户端指定上传文件的访问 其实就是说服务器它能够访问指定的文件
       //InputStream 获取一个System.IO.Stream对象,该对象指向一个上载文件,以准备读取该文件的内容
              这一小步就可以对文件读取进行准备
               int n = imgStream.Read(imgBinaryData, 0, imgLen); 
       //imgStream为开始在前面建立的对象用来准备读取文件的内容。
      //Read正式读取字节 这里是对imgStream的重写 因为开始它的里面是没有东西的
    
           2:imgLen =  UploadFile.PostedFile.ContentLength;
      //UploadFile.PostedFile.ContentLength
              获取上载文件的字节大小
           
           3:byte[] imgBinaryData=new byte[imgLen];
       //把字节大小转化为byte[]的类型  并把它存放于imgBinaryData中
               其实2是为3服务的

           imgBinaryData 就是最后得到文件的数据
  
   67: 对于数据绑定控件DataGrid 有绑定经常会用到一些绑定控件属性 这些属性上控制表的
       现在对此作一个总结:
       1:GrdFile.Items.Count 是获取这个控件绑定放项的数目,如果是翻页的 就是指
          这个页面的绑定的数目,打个比方如果第一页有9个项目 那GrdFile.Items.Count
          返回的就是9了 如果是第二页 只有1个 那rdFile.Items.Count返回的就是1
       
       2:GrdFile.Items[i] 这里返回的就是表里记录的条数 当然也可以说对象的条数,
         这里和上面Items.Count不同 它返回的就是在GrdFile在每一个页的总的数量
         而GrdFile.Items[i]就不同 它也是指向第几个对象
         注意:1:它和页面没有关系 例如:如果第二个页 每天个页的的记录条数为十条,那第二个页
                 那GrdFile.Items[11] 是指向第二个页的第一条记录。
               2:但是如果只写上GrdFile.Items[11]那就只返回对象 不会返回值   
               3:GrdFile.Items[i]中的i是不能够超出范围,如果超出的话就会
                  有这样的提示:索引超出范围。必须为非负值并小于集合大小。参数名: index
                   i是从零开始的。
       3:GrdFile.Items[i].Cless[j]
          这里的Cless[]帮助里提的是行 其实通过我实践,Cless[j]指的是第j列
           GrdFile.Items[i].Cless[j] 返回的是第几个对象 的第几列的值
          这里应该注意的是 有的时候也并不是返回真正的值:比方 如果那项是时间
          则返回的时间,如那项不实实在在的值 那返回的就不会是真正的值,像图象
          的那返回不会返回不会是图象 那个也不可能返回啊 
       4: 现在对此做一个补充 开始对GrdFile.Items[i].Cless[j] 不是用一种正确的方式去理解
          所以才会出现3那样的写出的理解
          其实很简单:Item[i]是指第一个对象也可以只第几行
           Clsess[j]则是第几行过来的第几个单元格
                     
  
   68:怎么用定义一个对象为文本框
       CheckBox CbxDept;
  //设置CbxDept为复选框 这里为声明一个对象为控件对象
  //这个以前我是不知道的 不过现在知道到了 其实也可以声明一个对像为控件对象 
       CbxDept = (CheckBox)GrdFile.Items[nRow].FindControl("CbxSelect");
  //这里为GrdFile获得第几行对象,从控制面扳里搜索带指定id的服务器控件。
  //所以这里的id为CbxSelect
            
   69:分析一个翻页命令
       private void GrdFile_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
  {
  GrdFile.CurrentPageIndex = e.NewPageIndex;
  //GrdFile.CurrentPageIndex 获取或者设置当前页的搜索
  //而e.NewPageIndex就是选择页的搜索引
  //这是翻页的命令啊 以前对这个不是很懂 但今天这个就是翻页 把新的页附值给这个对象
  BindGrdFile();
  }

   70:怎么样封装删除一条语句:
        public bool ExecSql(string strSql)
  {                                       
   sqlConnection = GetConnect();
  
   SqlCommand Comm = new SqlCommand(strSql,sqlConnection);
   Conn.Open();
   try
   {
    if(Comm.ExecuteNonQuery() >0)
    {
     return true;
    }
    else
    {
     return false;
    }
   }
   catch
   {
    return false;
   }
   finally
   {

    Conn.Close();
   }
        
 
  }

          调用语句:
          strSql = "delete from uploadfile where id in(" + strTableID + ")";
   //
   if (Das.ExecSql(strSql))
   {
    Response.Write("<script>alert('删除成功!');</script>");
    Clear();
    BindGrdFile();
   }
   else
   {
    Response.Write("<script>alert('删除不成功,请稍后再试!');</script>");
    if(TxtState.Text=="1")
    {
     PageInit();
    }
   }

    71:对Comm.ExecuteNonQuery的理解它是在对连接数据库并返回受到影响的行。
        打个比方如果这次对数据库的操作 对数据库表的几行进行操作就返回几行
        上面例子对数据库进行操作就是利用这个属性达到检查数据库 操作有没有成功的问题
        这是很值得学习的
       
              
    72:Response.Write("<script>alert('删除成功!')</script>");的写法 

 

 

 

开发中的感受2.txt

1:关与几个平时很常见的取值问题:
  a:TxtUserName=DataGrid1.Items[nRow].Cells[1].Text;
    nRow为可以为设定的参数

 b:读取dataReader取值
  SqlDataReader Reader = new SqlDataReader(strsql)
    while(Reader)
    {
       strTitle= Reader[0].ToString();
       strContent=Reader[1].ToString();
       strSex =Reader[2].ToString();
       ...
    }

 2:注意到一点在只有类型文件中,是不能够使用Response.Wiret()的命令的
 
 3:以前经常看到用Reponse.Write()写语句生成html我没有试过
 但是觉得应该会比较好玩 所以特意抄了一例子下次有机会有用上
 public void madhtm()
  {
 Response.Write("<TR>");
 Response.Write("<TD heigth='150',align='left' width='155' Valign='top'>作者:"+strUserName);
 Response.Write("<br>发表时间"+strTitle);
 Response.Write("</TD>");
 Response.Write("TD colSpane='3'>");
 Response.Write("<Table id='Table2' height='100' runan='server'>");
 Response.Write("<TR>");
 Response.Write("<TD align='right' width='80' vAlign='top'>"+ strContent);
 Response.Write("</TD>");
 Response.Write("</TR>");
 Response.Write("</Table>");
 Response.Write("</Font>");
 Response.Write("</TD>");
 Response.Write("</TR>");
    } 
    
  注意这的strTitle,strContent为变量 可以从上面1中那样取值绑定到此
 
 4:以前用Label基本上是这样用Label1.Text
   今天发现还有一个功能很一意思:Label1.Font.UnderLine=True;
   使用该属性把控制件的文本更改为下划线形式
 5:开始在开发的过程中觉得Label,.txt传递值很好 可是在面板上确看的见 不过现在知道了
   可以把其属性隐藏起来就可以了
   Lable.Visible=false;

 6:今天在看别人的文件代码的时候,突然有一个感受,做一个网站
   我没有可以把许多的变量什么的先放在一个类型文件中,还有许多需要处理的方法也必须
    放在一个类型文件中,有些我们可以做接口 什么的 这样就必须有实现这个接口等等
    这些都是很重要的
 7:在开发中平级别目录为:"FileGet.aspx?ID={0}"
   上一级别目录的写法为:"../FileGet.aspx?ID={0}"
   下一级别目录的写法为:"cs/FileGet.aspx?ID={0}"
   上一级在下一级别的写法为"../cs/FileGet.aspx?ID={0}"
   上二级目录写法为在下二级目录:"../../asax/Admin_Liuyan.ascx"
   
 8:经常在网站看到别人说一些编程方面的问题 有的是不知道所云
   这到底是什么原因:现在觉得应该是是一个过程问题吧
   就想几年前我现在自己能够写这么多代码简直觉得不可思议一样 因为那个时候
   很多都看不懂 甚至被同学笑说连1加1都编不出了
   现在通过自己这一段的锻炼 觉得最基本的东西应该没有什么大问题 不过还要加强
   现在应该是对.net核心技术 编译.net的内部机智
   我建议自己能够研究一下《asp.net基础教程》那本书 
 
 9:对写sql语句的再一次说明
   int imgid = int.Parse(Request.QueryString["id"]); 
   string sqlText = "SELECT filename,data,Contenttype FROM uploadfile where id=" + imgid;
   看这个语句的imgid它没有写在里面啊 不是说sql语句都要放在引号内吗
    其实也不能够完全这样讲,因为你看imgid是一个数字 它没有必要放在把它当成字符串看待

 10:经常会用到搜索,但是觉得如果要搜索某一问题,想一个好的搜索关键字是至关重要的
    如果要搜索某一问题:可以先想好几个关与着方面的关键字 然后再去搜索
 
 11:以前没有接触过ImageUrl 这个属性 这个属性在很多控件里 都有的以前也没有用
    所以每一次见到也是 觉得熟悉而陌生 今天遇到一个从数据库里 从出图片怎么样显示出来
    并且绑定控件,不知道怎么解决
    然后找到一个例子终于知道怎么做了:
    控件写法:
    ImageUrl='<%#"ReadImage.aspx?ImageID="+DataBinder.Eval(Container,"DataItem.id")%>'
    ReadImage.aspx 下面的cs:
 blog.cs.DataSql data = new blog.cs.DataSql();
 SqlConnection cn =data.GetConnect();
 SqlCommand cmd=new SqlCommand();
 cmd.CommandText="select data from uploadfile where id='"+this.Request["ImageID"]+"'";
 cmd.Connection=cn;
 cn.Open();
 this.Response.ContentType="image/*";
 SqlDataReader dr=cmd.ExecuteReader();
 while(dr.Read())
 {
 this.Response.BinaryWrite((byte[])dr["data"]);
 }
 cn.Close();
 12:我买了一本书《asp.net高级编程》看了关于dll文件的编译问题  可是觉得还有一些地方没有
     弄懂所以在网上搜索了下,可是让我觉得奇怪的是 很多地方 想无优网  还有一些论坛里
     都看到和书上一模一样的文字 当然有的还加上了一点在后面 这样就成了其他的文章
     可见很多东西 并不是真正的发表者些出来的 当然也不能够说这是错误 能够借用别人的 东西
     未必不是一件好事 说这一段话的目的 是不要认为别人都很牛的 其实很多很多人都是引用了别人的
     东西

 13:这里要说的是DataGrid里的模板我觉得很有用
     <asp:BoundColumn DataField="Pt_Id" HeaderText="Id">
       <HeaderStyle HorizontalAlign="Left" Width="5%"></HeaderStyle>
 <ItemStyle HorizontalAlign="Left"></ItemStyle>
     </asp:BoundColumn>
   注意这里的Width="5%" 这个很重要我觉得 他可以控制宽度,比方说时间字节我们要长一点
   我们就可以在时间那里的headerStyle上把width设为20% 而上面这个id宽度要求比较小所以
   width设为5%
 14:文本输入框可以控制输入的字节数

 15:在C#里一种简单的添加参数的写法:
     请看例子:对添加一个参数的二种写法:
     Number1:
     command.Parameters.Add("@Img_Name", SqlDbType.VarChar, 50).Value = imgName;
     Number2:
     SqlParameter param2= new SqlParameter("@Img_Name",SqlDbType.VarChar,50);
     param2.Value=imgName;
     command.Parameters.Add(param2);
 
16:这个删除语句很有意思: strSql = "delete from Ph_Photo where Pt_Id in(" + strTableID + ")";
   注意它是用的in 我想意思应该是 Pt_Id='"+strTableId+"'
   但是这种用法第一次见 很有意思

17:sql语句不区分大小写

18:看这二个调用:blog.cs.DataSql Data = new blog.cs.DataSql();
                 DataSql Data = new DataSql();
   以前写都是用第一种写法:但是其实如果调用的类与被调用的类 是在一个文件下面就没有必要
   用第一种写法了,这只是一个小问题 却能够节省写代码的时间
 
19:在做系统的时候必须注意:做一件事情 或者说打到一个目的 有很多方法 这个时候我们就必须
   去选择那一种方法是最好的 最可靠的:当然这里考虑的因素很多 比如说走这一条路径程序运行
   速度,还有系统的稳定性 以及以后系统的维护等方面 这些都是必须考虑的

20:在写存储过程的时候 有几次都遇到了这样一个问题了 现在对这做一个总结:
    有的时候运行存储过程语句出现 可以输入插入值 但是当我运行完语句的时候 就出现了
     这样的提示:当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'P_PingLun
     结果是没有插入值,这是为什么呢,开始我看不懂:IDENTITY_INSERT 设置为 OFF
     后来发现是我向标识列中插入了值,这个列id 是主键 是不能够向里面插入值的
     是我sql语句写错,改了以后就没有事了

21:我们在写程序语句的时候 写等好是要我们算术里的两个等号 一个是附值号 但是
    在sql语句中等号是一个等号 我还没有发现在里面有附值号

22: 这里有小技巧要说出来,我们在写程序的时候,往往出现括号多少的错误,
    表现是在一个边括号上用红色标识出来,提示就这里多了或者少了一个括号,
    那里这里到底是多了还是少了怎么看呢 这里有一个技巧:就是我们可以看旁边的
    树型的节点线:如果标识括号的下面还有节点 但是没有边括号了,
    肯定是这里少了一半括号,如果是多了一括号 则是这样提示的 标识的括号不在 
    节点上 是多了 所以要把它删掉

23  blog.cs.DataSql conn = new blog.cs.DataSql();象上面这样的调用公共类的语句
    之前我说过如果是在同一个文件夹下面,可以这样写:
    DataSql Conn = new DataSql()
    其实我觉得第一种方法 从文件的移动方面来说有它绝对的优势 因为如果你调用这里类
    在掉用的这个文件改变位置的时候 方法一这样还是有效的 方法二就不一定有效了

24: 以前说觉得数据库不是很重要 但是现在却不是这样认为的了,可以说现在读数据库的理解
    是从实践中认识到的:我觉得对于一个有数据库(有后台)的程序来说 程序就是负责从
     只是将存人数据库里的信息进行加工处理:当然这个加工包括很广 包括各种知识 如:
    算法,数据结构,程序语言,脚本语言  还有基本的电脑知识等  然后从数据库里取出
    信息进行加工处理,这里也涉及到的加工数据所需要的知识,所以说这种输入输出
    也不是很难的,当然这里也有几个较难一点 一是数据结构 还有一个是Xml,xml是
    .net的核心 它有跨平台的优势
    这里重点要说数据结构  它的维护涉及到知识很关 这里又是一门学问 数据更新
    等等
    现在见到的网站的更新 就是把输入输出进行变换 而数据库没有变
    这也可以说是换药没有换汤,当然这样做的好处 是你网站以前的信息还在 可是这个网站
    却和以前不同了

25:以前忽视了一个问题:其实对于ubb字符的替换完全可以把它放在一个公共的模块中去完成

26:刚才把一个ubb字符替换放入模块中 可是访问不到啊 怎么会事情 明明调用了这个模块
    后来才知道 原来是这个模块是定义成private其实应该定义成public了 就可以了

27:今天晚上一个问题花了我一个多小时没有解决 就是我想从前台显示的id调用后台的参数
    再查找出评论数 再返回给前台的评论数数据源 可是遇到的问题是无论我怎么样
    也不能够调用成功 因为从id调用的方法 传递参数到返回给前台的评论数据源的参数的方法
    中间参数我传递不过 我用了一个Label控键作为中间变量也不可以,后来我终于
    从迷茫中走出来了 其实在前台根本不要评论的数据源 只要把前台的id调用它后台的方法
    再返回给评论数给id显示出来 这样我就可以把id当作评论数就可以了
28:其实我觉得有必要对各种变量的命名自己做一个总结 一个好的变量命令法则对个人编写代码
   是很用的:我现在对这个有模糊的认识和运用但是觉得还没有明确化 下次应该对此好好作一
    个总结

29:blog.cs.Review good = new blog.cs.Review(); 
    good.AddPn_Pinlun(Name.Text,HTML.FilterBadWords(HTML.HTMLEncode(HTML.HTMLEncode(TEXTAREA1.Value))),id);
    这个例子是自己尝试写的:得出结论是方法可以嵌套
  
30:以前对于数据库里设计表的时候 向里面添加一行的时候 只能够是添加的选中行的上一行不是很理解
   想想怎么数据库设计的时候不添加它下面的一行,现在才知道 如果我要添加的首行
   还非得是添加点击的上一行才行

31:数据库里是不区分大小写的

32:对与SqlDataReader读取数据的认识

   SqlDataReader是对于大多数有效的情况下读取数据的好的方式。你不能使用它来写入数据。
   SqlDataReaders通常作为快速的只向前读的数据流。
   你能够以只向前的顺序方式从SqlDataReader对象中进行读取。
   只要你已经读取了某些数据,你必须保存它们,因为你将不能够返回并再一次读取它。
   SqlDataReader的只向前读的设计使它很迅速。
   它并没有遍历数据或者将数据重新写回给数据源的负担。
   因此,如果你一次只需要读一组数据,并且希望最快速的方法,
   SqlDataReader则是最好的选择。同样,如果一个单独调用所需要读取的数据量大于内存的存放能力,
   SqlCommand对象cmd的ExecuteReader方法返回一个SqlDataReader实例。
   使用new关键字创建一个SqlDataReader并不做任何事情。前面的课程已经学到,
   SqlCommand对象引用connection和SQL语句对于SqlDataReader读取数据是必需的
   前面已经解释了,SqlDataReader通过顺序数据流返回数据。为了读取这些数据,
   你必须从一个表中一行一行的取出数据。只要一行被读取,之前的数据就不再有效。
   为了再次读取那行,你应该创建一个新的SqlDataReader实例并且再次从数据流中读取它

   从SqlDataReader中读取返回的数据流的典型方法是通过while循环迭代没一行。下面的代码显示了如何完成:
        { 
               // get the results of each column
               string contact = (string)rdr["ContactName"];
               string company = (string)rdr["CompanyName"];
               string city    = (string)rdr["City"]; 
               // print out the results
               Console.Write("{0,-25}", contact);
               Console.Write("{0,-20}", city);
               Console.Write("{0,-25}", company);
               Console.WriteLine();

        }

    注意在上面代码中的while循环对SqlDataReader对象rdr调用的Read方法。
    Read方法的返回值为bool,并且只要有记录读取就返回真。
    在数据流中所有的最后一条记录被读取了,Read方法就返回false。
     在前面的课程中,我们使用SqlDataReader的索引器,比如rdr[0],
    提取行中的第一列。你能够使用诸如这样的数值索引器提取行中的列,
    但是它并不具有很好的可读性。上面的例子使用了字符串索引器,
    这里的字符串是从SQL查询语句中得到的列名(表的列名如果你使用一个星号,
    *.字符串下标具有更好的可读性,使得代码能够更好的维护。
 
     一定要记住关闭SqlDataReader,就像关闭SqlConnection一样。
     将数据存取代码用try语句块包围起来,并把关闭操作放到finally语句块中,就像这样:
        try
        {
               // data access code
        }
        finally
        {
               // 3. close the reader

               if (rdr != null)
               {
                       rdr.Close();
               } 
               // close the connection too
        }   
     SqlDataReader的数据流形式应该是一个好的选择
     using System;
    using System.Data; 
    using System.Data.SqlClient;
 

    namespace Lesson04
     {
        class ReaderDemo
        { 
               static void Main()
               {
                       ReaderDemo rd = new ReaderDemo();
                       rd.SimpleRead();
               } 
               public void SimpleRead()

               {
                       // declare the SqlDataReader, which is used in
                       // both the try block and the finally block
                       SqlDataReader rdr = null; 
                       // create a connection object
                       SqlConnection conn = new SqlConnection(
                         "Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI");  
                       // create a command object
                       SqlCommand cmd  = new SqlCommand(
                               "select * from Customers", conn); 
                       try
                       {
                               // open the connection
                               conn.Open(); 
                               // 1.  get an instance of the SqlDataReader
                               rdr = cmd.ExecuteReader(); 
                               // print a set of column headers

                               Console.WriteLine( 
                                 "Contact Name             City                Company Name");

                               Console.WriteLine(

                                "------------             ------------        ------------");

                               // 2.  print necessary columns of each record
                               while (rdr.Read())
                               {
                                      // get the results of each column
                                      string contact = (string)rdr["ContactName"];
                                      string company = (string)rdr["CompanyName"];
                                      string city    = (string)rdr["City"];
                                      // print out the results
                                      Console.Write("{0,-25}", contact);
                                      Console.Write("{0,-20}", city);
                                      Console.Write("{0,-25}", company);
                                      Console.WriteLine();
                               }
                       }
                       finally
                       {
                               // 3. close the reader

                               if (rdr != null)
                               {
                                      rdr.Close();
                               }
                               // close the connection
                               if (conn != null)
                               { 
                                      conn.Close();
 
                               }
                       }     
               }
        }
   }
    SqlDataReader对象允许你以一种快速的只向前的方式读取数据。
    你从数据流中读取每一行来读取数据。调用SqlDataReader的Close方法保证资源泄漏不会发生。

    我觉得总的说:1:Reader.Reader()只返回true与flash
                  2: Reader[n].tostring()返回的是第1列第n行的记录
                  3:Reader记得关闭,重要性和sqlConnection一样;
                  4:一个sqlDataReader对象一个记录只能够读取一次
                     如果要再次读取则要重新实例化一个对象
                  5:最好使用try{}fially()语句对其中进行控制
         6:如果我想要读取指定表中的字节:的写法为
           string contact = (string)rdr["ContactName"]; 
                      Console.Writeline(rdr[“CustomerID”]+rdr[“CompanyName”]);
         7: Reader是以一种流的形式读取
                  8:用Reader.GetByte();可以控制读取的字节数;
                  9: if(ReadEnd.Read())
   {
    Label1.Text=ReadEnd[0].ToString();
    Label2.Text=ReadEnd[1].ToString();
                         '''
   }
                    以前对这个有一个误解:其实这不是去读取返回第一行的的第一个字节记录
                    第二个字节记录 知道第n行字节记录 注意这都是在一行的

                 10:用SqlDataReader读取的记录中如何判断列的数据类型
                    Reader.Item("ColumnName").GetType().Name
                
                 11:在实践中我发现不能够用SqlDataReader去读取列的记录,只能够用它来读取行的记录
                     就是返回的行 如果返回多行 它读取最先的那一行 当然这是我实践中的认识  我想
                     是不是这样的就我以后去验证了
              
33:以前对与方法ToString()的认识觉只可以一变量后面直接加上此方法例如:a.ToString()
   现在才知道不是这样的其实也可以这样的,(int)ReadEnd["A_Key"]).ToString();
   但是如果是这样写就不可以了(int)ReadEnd["A_Key"].ToString();
   也就是说我们在ToString()方法前面可以直接加一个用括号的方法,

34:javaScript语言区分大小写的

35:在写存储过程语句的时候 换行的时候 可以直接写 就像在一行里写一样 不像在程序中写语句这样麻烦

36:有的时候你定义一个变量 在用另一个地方去用它可是不知道 是不是跟一定义的变量写的一样  有没有
    写错 着个时候你可以在你写的变量上面 停留鼠标 如果这个变量有的话 就会有提示这个变量的路径
37:try{}catch{}还真的厉害 它能够把在在try{}语句调用地方的语句的 的存在的错误报告出来

38:开始以为在同一个类中的一个公共的变量 如果在一个方法的定义一个值在另一个方法是不可以得到这个值
    其实不然:
    比方: private int a;
             private void Check()
            { a=1;
            }
           private void Button1_Click(object sender, System.EventArgs e)
     {
  Check();
  good(a);
            }
    这个例子调用方法good()可以把a=1的值传递进去

 

 

 


开发中的感受3.txt

1:一前对写连接存储过程语句不在行现在看此例子:
  public int GetPn_PinLun(int Pt_id)
     {
  DataSql Data = new DataSql();
  SqlConnection Conn = Data.GetConnect();
  SqlCommand Comm = new SqlCommand("GetPn_PinLunNumber",Conn);
  Comm.CommandType=CommandType.StoredProcedure;
  SqlParameter Parameterid = new SqlParameter("@Id",SqlDbType.Int);
  Parameterid.Value=Pt_id;
  Comm.Parameters.Add(Parameterid);
 Conn.Open();
 int result = (int)Comm.ExecuteScalar();
        return result;
     }
  如果我是要返回到调用此方法的类的话 我们就要在public中定义为返回类型的数据类型
  此例子中定义为int 则在返回的resule也为int类型 对于传进的参数 想pt_id 也不一定
  要为年int 型即不一定和和public定义的类型一样
  如果没有返回则用Void
 
  想写这种连接存储过程的语句 还有一个要值得注意的地方就是 注意数据库连接类的对象
  比方Comm对象下面的方法返回的并一定就是我们想要得到的类型 这样时候 我们就要把
  类型进行转换,比如上面的这个例子int result =(int)Comm.ExecuteScalar();
  就成功把ExecuteScalar()的类型进行了转换
 
  此例子还有一个值得学习地方就是我开始不知道要写连接存储过程 返回查找的数目
  语句因为觉得类型转换不过来不过现在我觉得知道了。
  
2:对存储过程语句初步定义:
   1:要表里插进语句的用Insert_Table
   2: 对表进行更新的语句用:TableUpdate+(查的意义词)_(字节);
   3: 对重表里差找记录的用:TableSelect+(查的意义词)_(字节;
   4: 对删除表里记录的用: Tabledelet+(查的意义词)_(字节)

3:继续说一下括号的事情 对上次说这个的一个补充 在编程过程中如果发现有括号 打上红线还有
  一种可能就是程序的标点有有问题 少标点 当然如果是多一个标点 也会标红线 不过是标在
   多的那个标点上
4:经常在调试的时候 看这样的提示,找不到类型或者命名空间(出错对像) 是否缺少using
   指令或者程序集引用 出现这种情况有二种可能 一种就是缺少引用 一种就是对像写错了。


5:  ADO.NET连接池超时
   今天在运行程序的时候 有的时候运行速度很慢   我估计应该不是我做的程序的问题而是我电脑的问题
   由于在运行的时候 久久不出一个页面子  过了大概二十秒 就出现“
   超时时间已到。在从池中获取连接之前超时时间已过。
   出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。”
   现在对这个问题终于知道了:主要是打开的连接没有关闭导致的 所以解决这个我问题
   有二个办法:一:记得要关闭所以打开的连接
               二:题的原因是与数据库的连接没有显示关闭,而等系统自动回收是要时间的.
                   解决的方法是改变连接池的大小.在连接字符串的后面加上以下代码:
                   Enlist=true;Pooling=true;Max Pool Size=300;Min Pool Size=0;
                   Connection Lifetime=300;user id=sa;packet size=1000
                   其实方法一是治本的
                   对于方法二我还没有用过
               三:此问题还可以延伸到一个SqlDataReader 对象在打开后面也要记得关闭
                   SqlDataReader对象一般以为很多时候要用Reader.Read()方法读取
          所以一般边用这样的过程控制语句:
          try{ if(Reader.Read()){//读取数据} }finally{if(Reader.Read!=null)
                    {Reader.Close()}}
          进行关闭

6:看一个储藏过程的例子:
   ALTER PROCEDURE GetClassName
    (  @Id int,
       @ClassName varchar(50) output
    )
    AS  
    Select @ClassName=F_Name from F_Class where F_Id =@Id ; 
    RETURN
   
   public string GetClass(int Id)
    {
        DataSql Data = new DataSql();
        SqlConnection Conn = Data.GetConnect();
        SqlCommand Comm = new SqlCommand("GetClassName",Conn);
 Comm.CommandType=CommandType.StoredProcedure;
        Comm.Parameters.Add("@Id",SqlDbType.Int).Value=Id;
 SqlParameter Parameterclassname = new SqlParameter("@ClassName",SqlDbType.VarChar,50);
        Parameterclassname.Direction=ParameterDirection.Output;
 Comm.Parameters.Add(Parameterclassname); 
        Conn.Open();
 Comm.ExecuteNonQuery();
 Conn.Close();
 string F_ClassName = (string)(Parameterclassname.Value);
 return F_ClassName;
    }
   这是一个从利用存储过程向数据库里进行有条件查询的例子,这个例子进行了语句的输进与输出
   这个输出不是返回一个符合条件的字节 以前遇到这个问题不知道怎么解决
   现在对这个作一总结:利用Parameterclassname.Direction=ParameterDirection.Output;
   得到一个输出型参数 @ClassName 并通过Comm.Parameters.Add(Parameterclassname);
   加载到Comm对象通过Comm.ExecuteNonQuery();执行 从而把变量 传递给储藏过程GetClassName
   中的@ClassName 接着通过@ClassName=F_Name语句@ClassName得到值
   这个时候我们通过定义F_ClassName接受收到返回来的值,这里我们把Parameterclassname.Value
   通过(string)(Parameterclassname.Value);此语句把它转换成字符串,
   最后我们把得到结果F_ClassName 通过return 返回,值得注意的是 因为返回的是字符串 
   所以在定义方法GetClass 的类型的时候 我们定义成string 型的

7:引用是不去分发小写的 但是引用上带的问件名是区分大小写的

8:<%@ OutputCache Duration="200" VaryByParam="none"%>
   以前看到过这个引用 不知道干什么啊 现在知道了是页面输出缓冲,这里东西缓冲方面很多
   以后会对这个做一个分析吧  今天用了一下 感觉果然很爽

9: 开发系统有些能够在客户端完成的工作就不要提交给服务器去处理 所以对与控件不要
   在服务器端去完成的就不要做成服务器控件

10:对与try{} catch() 语句以前总在catch后面加上System.(System.Exception EXE)
    结果如果不通过Response.Write(EXE.Message) 倒出来就会有运行提示
    在catch 下面有蓝线标识 接着有这样提示 声明了EXE 但从未使用过
    不过现在发现其实可以这样写:try{} cath{} 这样我们没有声明Exception 就不存使用
    不使用EXE的事了

11:注意在数据库访问的时候 如果我们想得到每一个字节下对象的个数学 Count(*)
    没有的话返回的是0 但是如果我们输入一条记录作为查找另一条记录的条件的
    话如果查找没有成功的话  返回的就会出错

12: 我觉得数据库里的表一但建设好,尽量不要去修改
    但是如果要修改根据经验 如果要删除里面的字节 如果这个字节有内容 最好先把内容去掉
    还有要除掉一个字节一般带来的麻烦一般比向表里加一个字节多的多
   
13:对与掉用公共模块的话 最好把实例化对象放在开头即定义这个类公用的对象
    以便其他方法调用,这样做一是有利于结构化编程 另外一个就是省去如果多
    个方法调用的 重复性实例的麻烦
  
14:我觉得一般写代码应该注意格式 这也上老掉牙的话题了 不过觉得重要所以再说一下
    这是一种良好编程风格的体现 所以我们在编程嗲们过程中一方面要注意结构化编程
    另一方面则要在写完程序后对整个页面进行排版 删掉多余的空格 同时
    注意方法的放的位置
    a:像一般控件触发事件一般放在 web窗体设计器代码的下面
       其他的放在上面
    b:一般处理事件接近的方法放在一起
    c:方法与方法只之间为一个空格
    d: 方法括号与里面代码之间一头为一个空格
    e: 方法定义的变量前后一个空格
    f: 方法里作用相同的代码放在一起成一块 块一块之间为一个空格
   
15:我决改代码比写代码有的时候更头疼

16:方法private void Page_Load(object sender, System.EventArgs e){}
   就相当C#编程里的Main()方法 是程序执行的入口。
17:在数据库里定义字节的默认值的时候 记得要用括号把时间括起来(1)

18:调试系统的时候 选择的启动页加载容易一点的 在进入页面的时候如果有多条路径
   进入则选择容易加载路径 其次可以把经常调试的页 放如缓存
  

19:在实践中我发现写sql语句的时候 只要用对了 并且对应的数据对了 顺序没有错
    同一地方的字节的顺序是没有多大关系的
     例如:
     insert into P_PingLun(P_Name,P_Email)values(@P_name,@P_email)
     insert into P_PingLun(P_Email,P_Name)values(@P_email,@P_name)
    是一样的

20  以前对web控件与html控件的认识不是很清楚
    web一般是运行的web上的也就是服务器上的
    html一般指的是html页码 所以它一般是运行在客户端的
    如果要把html页运行到web上就要把变成在服务器控件 一般经常看到有的时候
    点多次点击html控件的时候就会有这样的提示
    其次还要注意一点就上一般我们要在cs里对服务器html控件进行编程的时候
    这个时候 就要把它变化成服务器控件

21:我觉得如果有必要的话 可以把常用的控件放在一起做成一个模块

22: 经常看到调试中有这样的语句未将对象引用到实例 其实这句的话意思就是
    说你建了这个对象 但是没有实例话这个对象 当然这种实例 不是简单的那
    C#里那样的 比方说你在cs文件里定义个一Panel1的控件对象 但是没有在前台
    建立Panel控件 就这样就会提示未将对象引用到实例

23:看一个例子:
    <TABLE id="Table4" style="HEIGHT: 27px" cellSpacing="1" cellPadding="1" width="540" border="1">
  <TR>
  <TD><FONT face="宋体">&nbsp;
   <asp:label id="Label4" runat="server"></asp:label><asp:checkbox id="CheckBox1" runat="server" AutoPostBack="True" OnCheckedChanged="CheckBox1_CheckedChanged"></asp:checkbox>&nbsp;
   <asp:label id="Label5" runat="server"></asp:label><asp:checkbox id="CheckBox2" runat="server" AutoPostBack="True" OnCheckedChanged="CheckBox2_CheckedChanged"></asp:checkbox></FONT></TD>
  </TR>
    </TABLE>
  
    cs:
    public void CheckBox1_CheckedChanged(object sender, System.EventArgs e)
  {
   if(CheckBox1.Checked)
   {
    Panel1.Visible=false;
    Label4.Text="查看评论";
   }
   else
   {
    Panel1.Visible=true;
    Label4.Text="关闭评论";
  
   }

  }

  public void CheckBox2_CheckedChanged(object sender, System.EventArgs e)
  {

   if(CheckBox2.Checked)
   {
    Panel2.Visible=false;
    Label5.Text="发表评论";
   }
   else
   {
    Panel2.Visible=true;
    Label5.Text="收起评论";
   }
 
  }

    这个是调用checkbox触发事件的例子 一般的只在前台点击触发的CheckedChanged
    public void CheckBox2_CheckedChanged是不会执行的 所以应该加上:
    AutoPostBack="True" OnCheckedChanged="CheckBox2_CheckedChanged语句
    这个例子对我很有启发 我觉得可以类推其他控件触发事件的使用 这个 例子里
    通过CheckBox的事件对Label控件的Text属性进行了改变
 
    同时在前台的时候我们选某个控件去和其他控件的事件相关联 这是很值得学习的一个地方


24:不能对 ntext、text、image 或 bit 列使用 GROUP BY 或 HAVING 子句,
   除非它们所在的函数返回的值具有其它数据类型。这样的函数包括 SUBSTRING 和 CAST。
   如果要对表与表之间查询 而里面的字节类型存在上面的三种类型之一
   有三种方法可以解决:
  
   (一) 内连接 内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。
          内连接分 三种:
          1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 表中的所有列,包括其中的重复列。
          2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。
           这些 运算符包括>、>=、<=、<、!>、!<和<>。
          3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 结果集合中所包括的列,并删除连接表中的重复列。
           例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:
           SELECT * FROM authors AS a INNER JOIN publishers AS p
         ON a.city=p.city
            又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
         SELECT a.*,p.pub_id,p.pub_name,p.country
       FROM authors AS a INNER JOIN publishers AS p
       ON a.city=p.city
         (二) 外连接 内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
          如下面使用左外连接将论坛内容和作者信息连接起来:
         SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
       ON a.username=b.username
          下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:
        SELECT a.*,b.* FROM city as a FULL OUTER JOIN user as b
       ON a.username=b.username
         (三) 交叉连接 交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
              例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 于6*8=48行。
              SELECT type,pub_name FROM titles CROSS JOIN publishers
              ORDER BY type

   

 25: 以前对储藏过程写法不是很清楚 特别是对有DataSet,SqlDataAdapter这样的对象的时候  不是怎么写
     后来才知道要新建一个抽像类 并对这个类建立一些属性 把从储藏过程得到的属性存储到抽象类的属性中
    
    连接存储过程:
     using System;
     using System.Data;
     using System.Data.SqlClient;
     using System.Configuration; 

     namespace blog.cs
      {
 /// <summary>
 /// AdminEnd 的摘要说明。
 /// </summary>
 ///
 public class GetClassItem
 { 
  public DataSet ClassItems;
 }
 public class AdminEnd
 {  
  DataSql Sql = new DataSql(); 
  public AdminEnd()
  {
  }
   public GetClassItem AdminClassNumber1()
   {
    SqlConnection Conn  = Sql.GetConnect();
    SqlDataAdapter myCommand = new SqlDataAdapter("Admin_classNumber1",Conn);
    myCommand.SelectCommand.CommandType=CommandType.StoredProcedure;
                                SqlParameter ParameterID = new SqlParameter("@Id",SqlDbType.Int,4);
    ParameterID.Direction=ParameterDirection.Output;
    myCommand.SelectCommand.Parameters.Add(ParameterID);

    SqlParameter ParameterName = new SqlParameter("@Name",SqlDbType.VarChar,50);
    ParameterName.Direction=ParameterDirection.Output;
    myCommand.SelectCommand.Parameters.Add(ParameterName); 
    DataSet Ds = new DataSet();
    myCommand.Fill(Ds,"FClass");
                                 GetClassItem GetClass = new GetClassItem(); //抽象一个实例化抽象类
    GetClass.ClassItems=Ds; //把得到的Ds的类附给GetClass抽象类下面的ClassItems(DataSet的实例)对象
    return  GetClass;  //返回GetClassItem类的实例

                          
   } 
     }
           }
      
         调用连接方法:把blogGetClassItem.ClassItems得到的表绑定
         protected void SetBind()
    {  
                blog.cs.AdminEnd blogAdminEnd = new blog.cs.AdminEnd();//实例化类 得到对象blogAdminEnd
  blog.cs.GetClassItem blogGetClassItem = blogAdminEnd.AdminClassNumber1();
                //把从blogAdminEnd.AdminClassNumber1()方法通过GetClass.ClassItems=Ds;把语
                //把得到的Ds的类附给GetClass抽象类下面的ClassItems(DataSet的实例)对象
  this.DataGrid1.DataSource=blogGetClassItem.ClassItems.Tables[0].DefaultView;
                //blogGetClassItem.ClassItems就是Dataset对象的实例
                //blogGetClassItem.ClassItems.Tables[0].DefaultView; 就是得到DataSet对象实例
                //里面的表
  this.DataGrid1.DataBind(); 
    }
   我对此的理解:我觉得很好理解 就是把连接存储过程从里面返回的一些对象 附值给抽象类的一些
                 对象 然后在用的时候调用抽象类 ]


26:关于Value大小写的问题 看这二个例子:
   Number1:Comm.Parameters.Add("@Id",SqlDbType.Int).value=Id;
   Number2:Comm.Parameters.Add("@Id",SqlDbType.Int).Value=Id;
   在写语句的时候 我注意的到写成value的时候 字体变颜色
   但是如果写成Value的时候 字体没有变色 因为C#是区分大小写 所以写成value是不可以的

27:现在简要的说明一下关与存储过程连接类的SqlDataReader 的用法
   就在连接类中新建一个类型的为SqlDataReader的方法 然后返回一个类型为SqlDataReader的对象
   然后在调在用此方法的类中 用一个实例接受 并通过Read()方法打开并读取

 

28:今天在的用存储过程查询出一个表中的所以的记录的时候 遇到了这样的情况 可是不知道怎么办
   提示为:数 5: String 类型的 “@Nr ”,Size 属性具有无效大小值: 0
   因为@Nr 字节为Text类型 当我Text设定字节的时候

   SqlParameter ParameterNr = new SqlParameter("@Nr",SqlDbType.Text,3000);
   ParameterNr.Direction=ParameterDirection.Output;
   Comm.SelectCommand.Parameters.Add(ParameterNr);


   储藏过程的输出语句为:
    @Id  int output,
    @Title varchar output,
    @Note  varchar  output,
    @FId  int output,
    @Man varchar output,
    @Click int output,
    @Lytime datetime output

   又有这样错误提示:当前命令发生了严重错误。应放弃任何可能产生的结果。
   在网上查了一下:提示为:
  
     最近同事写的一个操作存储过程的代码,一直交替出现下面两个异常:

    “当前命令发生了严重错误。应放弃任何可能产生的结果。 ”
   “ 常规网络错误。请检查您的网络文档。 ”

    经过测试,发现是以下情况所致。

    存储过程中有一个输出参数 varchar(8000)
    同事用企业库(Enterprise Library - June 2005)来调用这个存储过程,其中有一行代码如下:
    wrapper.AddOutParameter("@Answer",DbType.String,8000);

    就是这行代码在作怪,造成上述稀奇古怪的异常。

    原因请看MSDN的帮助:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatadbtypeclasstopic.asp

    DbType.String 
    A type representing Unicode character strings.

    DbType.AnsiString
    A variable-length stream of non-Unicode characters ranging between 1 and 8,000 characters.

    如果你的参数类型是 varchar 你应该用 DbType.AnsiString ,如果是 nvarchar 应该用 DbType.String。

    不过由于这个原因抛出 “当前命令发生了严重错误。应放弃任何可能产生的结果。 ” 、
   “常规网络错误。请检查您的网络文档。 ” 这样的异常,则太容易误导寻
 
   与是我改动此语句
   SqlParameter ParameterNr = new SqlParameter("@Nr",SqlDbType.varchar,3000);
   结果就可以了
 
  
  总结:对于Text Image,bit 这样的类型真的应该小心用 因为在涉及在表于表的查询的时候他们不能够使用
        像今天遇到上面的错误 我想只好把输出的类型该了才能够实现
        不过这里要注意的是我没有在数据库去改东西 我只是把上面语句改了 开始想到是不是要把表里
        这个字节的内型去改了 不过现在这样可以实现的话 就觉得没有必要了

   

 

28:这是用数组的例子:

  public static void AddFAQ(Entity.FAQEntity entity)
        {
       
            SqlParameter[] parameters = {
     new SqlParameter("@FAQID", SqlDbType.Int,4),
     new SqlParameter("@Title", SqlDbType.VarChar,500),
     new SqlParameter("@CategoryID", SqlDbType.Int,4),
     new SqlParameter("@RootID", SqlDbType.Int,4),
     new SqlParameter("@Content", SqlDbType.VarChar,8000),
     new SqlParameter("@OrderNum", SqlDbType.Int,4),
     new SqlParameter("@BlnSubmit", SqlDbType.Int,4),
     new SqlParameter("@BlnSpercial", SqlDbType.Int,4),
     new SqlParameter("@SpercialType", SqlDbType.Int,4),
     new SqlParameter("@SpercialText", SqlDbType.VarChar,4000),
                    new SqlParameter("@BlnGlobal",SqlDbType.Int)
            };
            parameters[0].Direction = ParameterDirection.Output;
            parameters[1].Value = entity.Title;
            parameters[2].Value = entity.CategoryID;
            parameters[3].Value = entity.RootID;
            parameters[4].Value = entity.Content;
            parameters[5].Value = entity.OrderNum;
            parameters[6].Value = entity.BlnSubmit;
            parameters[7].Value = entity.BlnSpercial;
            parameters[8].Value = entity.SpercialType;
            parameters[9].Value = entity.SpercialText;
            parameters[10].Value = entity.BlnGlobal;
            SqlHelper.ExecuteNonQuery(SqlHelper.connectionStrings, CommandType.StoredProcedure, "UP_Ppilve_Faq_FAQList_ADD", parameters);
        }


    这个例子是从找28问题的时候找到的 可能存在26上面的错误 之所以把它放在这里是觉得用数组进行操作的
    没有见过觉得表新鲜所以copy到这里

29:sql语句操作 在写存储过程的时候 定义的输入输出变量 可以和数据库的的变量同名
   在写连接存储过程的时候 接收的变量名也可以 与送到数据库里的变量名字相同

 

30:对与27出现的的问题 的新的见解
   其实有三个类型的字节都会出现27那样的问题 它们是:Image Text next(next我还没有真正遇到过但是我猜也是)
   我采用的方法就是其实就是一个类型转化的问题 刚才在写存储过程 select * .. 的时候当调用类型为image
   的字节就不可以了 与是我把 image 类型 转换成了varbinary就可以了:
   1:值得注意的是我是从连接存储过程的语句里用了其他的类型的在存储过程输出的时候是
       不是也要用转换后的这种类型 就随便了 所以我一般不用转换后的类型,
   2:  还有一个值得注意的地方就是数据将截断为 8,000 个字节,超过就会失败
  
   3:我觉得这个应该带给我的好处是很多的 因为很多地方要用到text image 这样如果不能够直接用的话
      我就可以转化它们了

   这得意于:我在Sqlserver200帮助文件带来的好处: 可以输入关键字image 就可以查到关于这三个数据类型的
   许多知识 ,帮助文件:支持使用 CAST 函数进行从 text 到 varchar、从 ntext 到 nvarchar 和从 image 到 varbinary 或 binary
   的显式转换,但 text 或 image 数据将截断为 8,000 个字节,ntext 数据将截断为 4,000 个字符(8,000 个字节)。
   从 text、ntext 或 image 到其它数据类型的转换(无论是显式的还是隐性的)都不支持。但是,可以对 text、ntext
    或 image 数据进行间接转换,例如:
    CAST( CAST( text_column_name AS VARCHAR(10) ) AS INT )。


 
31:谈谈SqlCommand 写语句 与SqlAdatapter语句的差别
       看例子:
  public GetClassItem FileFileNumber1()
  {
                      SqlConnection Conn  = Sql.GetConnect();
        SqlDataAdapter Comm = new SqlDataAdapter("File_FileNumber1",Conn);
                        //此句与Command Comm = new Command(("File_FileNumber1",Conn);很相似

        Comm.SelectCommand.CommandType=CommandType.StoredProcedure;
                        //此句是声明类型
          //其实就是在Comm.CommandType=CommandType.StoredProcedure;
   //中Comm的后面加上 SelectCommand   

        SqlParameter ParameterId = new SqlParameter("@Id",SqlDbType.Int);
        ParameterId.Direction = ParameterDirection.Output;  
   //ParameterDirection 就是Parameter 与 Direction的结合
        Comm.SelectCommand.Parameters.Add(ParameterId);

  }
 

32:经常看到这样的语句this.DataGrid1.DataKeys[e.Item.ItemIndex]
   其实这个语句的意思就是后的当前数据绑定控件DataGrid1点击行的索引值 我想其实就是获得点击行的Id值
   也许这个不太准确但是在用的时候 我觉得就是这么回事
   int Id = int.Parse(this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString());  

33:以前提到关与连接池的问题 一般的连接的对象采用的方法就是关闭 其实我的觉得很多对象也可以
   用清除:DataSet ds = new DataSet();
           它采用的方法就是 ds.Clear();


34:从实践中发现,一般的纯类文件,像连接存储过程的方法 其基本属性都是定义为public
   而对于每一个页面对应cs往往定义方法为privater

 

开发中的感受4.txt


1:以前对控件的使用 中觉得前台和后台使用有一点差别我觉得其实不然
  比方:
  前台:
   <asp:DropDownList ID="DropDownList1" runat="server" DataSource="<%# PopulateDropDownList() %>"
    DataTextField="Phone" DataValueField = "PhoneID">

  这些在后台一样可以实现:
  DropDownList1.DataSource =PopulateDropDownList();
  DropDownList1.DataTextField="Phone";
  DropDownList1.DataValueField="PhoneID";
  DropDownList1.DataBind();

  说起来其实很简单 因为dropDownList是一个对象 你只要把前台对象定义的方法属性 在后台对这个对象相应的对象
  属性进行相应的定义就可以了 这个对于其它控件也是一样的

2:我们可以对一个对象进行很多种操作的比如
  Label1.Text=DropDownList1.SelectedItem.Value.ToString().Trim().Length();
  ToString().Trim().Length():这是我们平时没有注意到的

3:今天系统的运行的时候受到大了很大的重创,因为电脑突然短电 导致我的blog项目启动不了,
  开始按照提示以为是bin 下面的blog.dill文件的问题 所以搬了一份 以前copy 的项目中的blog.dll
  文件过来 可是还是没有用 于是我blog.csproj,blog.csproj.webinfo blog.sln换了 也没有用
  注意一点的是:blog.sln 是启动文件 在开启此项目的时候 可以保存此文件
  此时候真不知道怎么办 拿开始copy也不可以啊 因为那里的文件不是现在的啊 我现在的文件的是经过了
  很多加工的  这个时候 其实也真正的意识的 不时的copy系统的重要性
 
  与是我想建一个blog项目 那以前那个删掉 可是建不起来 因为以前那个始终不能够完全删掉
  与是我建了一个blogs项目 把它的命名空间 解决方按 也改成blog 这个时候又提示:错误
  大概意思就已经有这样的blog文件之类的了
 
  没有办法 我最后只好又建了一个blog1的项目 把blog1下面的文件copy过来
  当然不包括 blog.csproj,blog.csproj.webinfo blog.sln webconfig 
  并copy过来的路径为 blog的一一替换为blog1 设定数据库webconfig的连接
  然后发现可以运行了,

  值得注意的是:Global.asax文件我觉得它应该跟保持历史记录有关 当然现在是猜想
  书上有得好好看看了
 
  现在运行文件可以了 可是美中不足的是当我运行到有系统的检测的登陆页面的时候 就有js脚本库
  我想应该是开始某个文件搞错了 后来从同学机子上看了它的那个文件的路径
  
  原因是:C:\Inetpub\wwwroot 下面的aspnet_client文件夹 我放在其他地方去了 与是copy一份过来就ok了  
 


4:关与方法中参数传递的问题
  ExP:blog1AdminEnd.PhotoIndexNumber2((RsCount-1)*PageSize,PageSize);

      public GetClassItem PhotoIndexNumber2(int ds1,int ds2)
  {
   SqlConnection Conn = Sql.GetConnect();
   SqlDataAdapter Comm = new SqlDataAdapter("PhotoadminNumber1",Conn);
   Comm.SelectCommand.CommandType=CommandType.StoredProcedure;

   SqlParameter ParameterId = new SqlParameter("@Id",SqlDbType.Int);
   ParameterId.Direction=ParameterDirection.Output;
   Comm.SelectCommand.Parameters.Add(ParameterId);
 
   Conn.Open();
   DataSet Ds = new DataSet();
   Comm.Fill(Ds,ds1,ds2,"Table");

   GetClassItem ShowWord= new GetClassItem();
   ShowWord.ClassItems=Ds; 
   return  ShowWord;

  }
 
      此调用方法photoIndexNumber2 这个方法需要2个参数
      如果blog1AdminEnd.PhotoIndexNumber2((RsCount-1)*PageSize,PageSize);中传递给hotoIndexNumber2()
      多于2个或者小于2参数的时候 方法photoIndexNumber2()都不能够接收到参数 这个时候
     系统运行的错误提示为:重载PhotoIndexNumber2方法未获取3参数
     注意这个3是动太的如果只传递1个参数 就会是1参数, 4个参数 就是4参数


5:凡有数据绑定的一般都的Data这样的词在里面
  如:
   Repeater1.DataSource
   Repeater1.DataBind()
   DataSet Ds = new DataSet();
   SqlDataAdapter 为Sql+Data+Adapter


6:在开发中我发现存储过程名与类下面的方法的名字可以相同
   存储过程中定义的变量名 还传递进连接存储过程的变量名 以及表中的字节名 都可以相同

7:ALTER PROCEDURE SearchEndNumber1
 
  (@Search varchar(1000))
  AS
  SELECT Count(*)
  FROM I_LiuYan
  WHERE (I_Title LIKE '%'+@Search+'%' ) OR
      (I_Note LIKE '%' + @Search + '%')OR
      (I_Man  LIKe '%' +@Search+'%' )
     Order by Time
  RETURN 

 这是我写的一个存储过程语句 是用在搜索用的 这是想得到符合条件数目
 
 接受到数目 
 public int PopLiuYanShowNumber1()
 {
 SqlConnection Conn =Sql.GetConnect();
 SqlCommand Comm = new SqlCommand("PopliuYanShowNumber1",Conn);
 Comm.CommandType=CommandType.StoredProcedure;
 Conn.Open();
 int Result =(int)Comm.ExecuteScalar();
 Conn.Close();
 return Result;
 }

 可是Result是1  明知到我用的是Comm.ExecuteScalar();应该没有错啊
 检查PopLiuYanShowNumber1()方法也没有错误 后来终于知道了 就是不能够用 Order by Time命令
 因为如果用了此命令将对得到的结果排序 所以返回的结果就是1 所以只要去掉次命令就可以了
  

8:关于从数据库里存储过程调出图片的sql语句的问题:

   sql: Select Pt_ContentType,Pt_Data from Ph_Photo where Pt_Id=@Id
   调用页:
    int Id = int.Parse(Request.QueryString["ID"]);
    SqlDataReader dr=blog1AdminEnd.PhotoShowNumber1(Id);
  while(dr.Read())
  {
  Response.ContentType=(dr["Pt_ContentType"].ToString());
  Response.BinaryWrite((byte[])dr["Pt_Data"]);
  }
   dr.Close();

    注意这里的Pt_ContentType,Pt_Data在调用的地方和sql语句中的必须一至,不然显示不出
 

9:sql语句的另一种写法:
        blog1.cs.DataSql data = new blog1.cs.DataSql();
 SqlConnection cn =data.GetConnect();
 SqlCommand cmd=new SqlCommand();
 cmd.CommandText="select Pt_Data from Ph_Photo where Pt_Id='"+this.Request["ImageID"]+"'";
 cmd.Connection=cn;
 cn.Open(); 
 this.Response.ContentType="image/*";
 SqlDataReader dr=cmd.ExecuteReader();
 while(dr.Read())
 {
 this.Response.BinaryWrite((byte[])dr["Pt_Data"]);
 }
 dr.Close();
 cn.Close();
    这是图片的写法 我觉得很值学习因为写法比较新鲜:

  这是现在用的一般的些法:
   int Id =int.Parse(this.Request["ImageID"].ToString());
 SqlDataReader dr =blog1AdminEnd.PhotoShowNumber1(Id);
 while(dr.Read())
 {
 this.Response.BinaryWrite((byte[])dr["Pt_Data"]);
 }
 dr.Close();

    
   public  SqlDataReader PhotoShowNumber1(int Pt_Id)
    { 
 SqlConnection Conn = Sql.GetConnect();
 SqlCommand Comm = new SqlCommand("PhotoShowNumber1",Conn);
 Comm.CommandType=CommandType.StoredProcedure;
        Comm.Parameters.Add("@Id",SqlDbType.Int).Value=Pt_Id; 
 Conn.Open();
 SqlDataReader Reader = Comm.ExecuteReader(CommandBehavior.CloseConnection);
 return Reader;
   }

10:昨天又接触了一个新的名词 则表达式 这是我在找Email验证控件的时候找到的 看了一篇介绍这方面的文章
   觉得可以了 所以copy出来可以1去看一下 这是继解释ubb之后一个新的名词


11:今天在用LinkButton翻页的时候  发现触发不了事件 找了很久也不知道怎么回事 后来终于发现是
    copy的时候 把折叠的触发事件的代码给忘记
   
12:从一个页面中传递过来的参数数我们可以另一个接收到的页面中的的多个方法中接收到  

13:有的时候有些文件放在项目中可是没有被发现 这样的话可以刷新一下视图


14:今天第一次成功的运用样式表 感觉到一个字爽  其实样式表早就听说过可是一直没有用 但是知道它大概是对网页的外观进行
   定义的工具, 我可以说这是我知道的继,javascrpt,ubb,正则表达式之后又一个重要的内容css 这些都是编程非常实用的东西
   于查了一下这方面的资料觉得
   a:式表可以令到网页制作者的工作更加轻松
     样式表可以令到网页制作者的工作更加轻松。当每个水平规则的语句都需要使用<HR WIDTH="75%" SIZE=5 ALIGN=center>的时候,
     网页制作者将觉得非常麻烦。使用样式表,只需要指定这样的参数一次,样式就会被整个网站所应用。
     而且如果网页制作者觉得WIDTH="50%"会更好的话,那么他只需要在一处地方改变这个参数,而不是找遍几百页来更改HTML。
     不仅仅如此,当一个文件包含了所有的样式信息时,样式表还可以减少下载的时间呢。
     式表也为他们提供的展示效果的项目给予更多的灵活性。属性,例如颜色、背景、边界、边框和许多的更多都能被所有的元素所应用。
     仅仅使用HTML和它专有的扩展,必须依赖像BGCOLOR之类的属性,而这些属性只对于少数的一些元素有效。
     样式表给予应用一个样式到所有的段落、或所有的二级标题、或所有的强调文字很大的灵活性。
     个较高特性的样式永远都凌驾于一个较低特性的样式

     样式表一般包括以下几个部分:基本语法
     目录
     用于属性定义的语法  
     字体属性                              
     颜色及背景属性
     文本属性
     方框属性
     分类属性
     单位
       字体属性
     字体族科
     字体风格
     字体变形
     字体加粗
     字体大小
     字体
     颜色及背景属性
     颜色
     背景颜色
     背景图象
     背景重复
     背景附件
     背景位置
     背景
     文本属性
     文字间隔
     字母间隔
     文字修饰
     纵向排列
    文本转换
    文本排列
    文本缩进
    行高
    方框属性
    上边界
    右边界
    下边界
    
    左边界
    边界
    上补白
    右补白
    下补白
    左补白
    补白
    上边框宽度
    右边框宽度
    下边框宽度
    左边框宽度
    边框宽度
    边框颜色
    边框风格
    上边框
    右边框
    下边框  
    左边框
   边框
   宽度
   高度
   漂浮   
   清除
   分类属性
   显示
   空白
   目录样式类型
   目录样式图象
   目录样式位置
   目录样式
   单位
   长度单位
   百分比单位
   颜色单位
   统一资源管理(URLs)

15:其实今天想做一个错误处理页 小做了一会儿有这样的的感觉 就是觉得这个可以简单 也可以深度高一点
   对我有启发的地方就是以后其实整个系统我们可以把所以的错误传递给一个页面 比如我们经常用的 try cath
   语句产生的错误 我们就可以把把错误信息作为一个参数传递过去啊
 

16:今天看了一下何利民程序觉得他的程序结构化程度比较高,特别是在sql数据库的连接 sql语句的执行检查方面 体现了很多东西出来
    这些其实我早些也在设想 也用了一些简单了  今天看了他的觉得 他做了 而且站的起点比较高 真的应该好好学习 不
    过觉得没有必要去分析他证个系统的程序  现在苦是他的程序 我打不开 不然的话 直接从想要实现的功能去看那一段的程序就是最好的了

17:再说webconfig
   可能还有很多刚刚接触ASP.Net的人不太了解Config.web这个文件。那我就顺便介绍一下。
   Config.web是ASP.Net的一个配置文件,它里面存放着关于ASP.Net的所有配置信息。当执行一个ASP.Net页面时,
   它会先到该页面所在的目录查找这个文件,如果没有找到,就往上一级目录找,一直到wwwroot目录。如果都没有,
   它就会调用X:\WINNT\Microsoft.NET\Framework\v1.0.2204目录中的Config.web文件(X为系统目录)。
   所以,如果大家要想改变所有页面的配置,就应该改WINNT目录中的那个Config.web。另外顺便说一下,
   当你打开Config.web后,你会发现这是一个XML结构的配置文件。

    就应该改WINNT目录中的那个Config.web。另外顺便说一下,当你打开Config.web后,你会发现这是一个XML结构的配置


18: str = str.Replace(">", "&gt;");  与 str=str.Replace(">","&gt;");
   有时候在写代码的时候在想 上面一式和二式是不是一样的啊 因为一式中间可以空格 后来发现其实有空格没有什么
   一式和二式是一样的

19:今天觉得以前在有一地方走了弯路,就是如果一个按纽 的事件 没有和后台的方法连接上
   以前我在的做发是在前台去双点击那个按钮(其实也可以是其他对象)然后去连接后面的事件
  现在知道其实完全没有必要只要在这个对象的属性 的事件 选项中选则那个后台我们想关联的事件就可以了

20:今天发现几件省力的事情 一是对与组件的控制 如果我们从一地方引进一个组件到另一个页面
   如果我想对这个组件进行显示控制 以前我的办法就是用panel 去控制 其实现在知道还有一办法
   要知道引进的组件是一个对象 选中它我们就可以对它进行控制 包括是否显示 功能是否可用等

22:对ubb知道昨天才真正的利用起来 开始不知道怎么样去屏蔽html 只知道要屏蔽它的功能 不过现在知道了
    其实通过替换 <,> 就可以实现 chr=chr.Replace("<","&lt"); chr=chr.Replace(">","&gt");
    然后还有一个要注意的就是要引进一个命名空间:using System.Text.RegularExpressions;
    就可以实现了  ubb很多是利用正则表达式 其实不知道 还是可以利用的

23:把许多组件放在一个组件里 再去调用就可以那个容器组件就可以了,一边在前台页面 是放美工
    过来背景图 所以在这里放样式 可能够会产生冲突 所以最好把样式放在放组件的组件里

24: 经常看到连接池满的问题 其实上次也遇到过,知道是连接对象没有关闭的问题 并我认为要关闭的对象关闭掉
    可是遇到有一情况觉得不能够关闭:
    SqlDataReader result = Comm.ExecuteReader();
    return result;
    如果我在rentun  result 后面加一个Conn.Close()的话 此语句不能够执行
    如果在前面加的话 在其他地方调用此类的对象的 类型为:SqlDataReader 的对象就打不开
    后来发现其实不能够这样写 应该这样写:
    SqlDataReadedr Result=Comm.ExecuterReader(CommandBehavior.CloseConnection);
    return result;
   
    其实在这里我发现遇到上面的问题 可以在错误页面上看到 是那个文件没有关闭 并找到它关闭它就是了
 
26:有的时候我们利用结构化编程

25:经常看看到我们点到一个对象上的时候 就会显示提示信息的 以前对这个不是很了解,以为这个是我们自己不
   能够定义的,不过现在就看法不同了,因为我知道其实很简单:
   例:
    /// <summary>
  /// 显示消息提示对话框,并进行页面跳转
  /// </summary>
  /// <param name="page">当前页面指针,一般为this</param>
  /// <param name="msg">提示信息</param>
  /// <param name="url">跳转的目标URL</param>
  public static void ShowAndRedirect(System.Web.UI.Page page,string msg,string url)
  {
   StringBuilder Builder=new StringBuilder();
   Builder.Append("<script language='javascript' defer>");
   Builder.AppendFormat("alert('{0}');",msg);
   Builder.AppendFormat("top.location.href='{0}'",url);
   Builder.Append("</script>");
   page.RegisterStartupScript("message",Builder.ToString());

  }
   以前经常看到期:summary并且在前面有///的符号不是很重视 不过现在就不同了知道它是起提示的作用
   看下面的例子:
   using LGH.Common; //此为引入命名空间
   MessageBox.ShowAndRedDirect(this,"你登陆不成功",index)
   ShowAmdRedDirect上的提示为:显示消息提示对话框,并进行页面跳转  
  当你写到“this”这个时候的提示为:当前页面指针,一般为
  当写到"你登陆不成功"提示为:提示信息
   当写到index时候的提示为:跳转的目标URL
 

26: aspx文件为继承:System.Web.UI.Page
    asx为件为继承:System.Web.UI.UserControl

27:以前在引用类型文件的时候经常是这样写 blog1.cs.Admin blog1Admin = new blog1.cs.Admin();
    其实没有必要这样 可以先加引用:
     using blog1.cs
     Admin blog1Admin = new Admin();
     但是有人就会问那么我怎么样像上面的Admin我怎么知道它是来自blog1.cs 其实这个很简单,你只要把鼠标放在Admin
     上就会有提示的它来自那里,这样你就知道了

28: 对Label1比较高明一点的用法
    lblMsg.Visible =true;
    lblMsg.Text = "<" + "br " + ">错误的用户名或密码!" + "<" + "br" + ">";
    这里对"br"比较新鲜我想应该还能够其它的标签进行使用

28:结构化编程的方法还真的多,对存储过程的的写法今天又学了一招用数组的和智能字段set和get一起实现的例子,
   看好像是看懂了,可是还没有试过,希望下次能够试一下
   现在写到这里:
   看一个登陆页面的例子:
  
   智能字段的代码:
   using System;

namespace LGH.Common.model
{
 public class Users
 {
  public Users()
  {
  }
  #region Model
  private int _id;
  private string _name;
  private string _pass;
  private string _empname;
  private int _deptid;
  private int _popedom;
  public int id
  {
   set{ _id=value;}
   get{return _id;}
  }
  public string name
  {
   set{ _name=value;}
   get{return _name;}
  }
  public string pass
  {
   set{ _pass=value;}
   get{return _pass;}
  }
  public string empName
  {
   set{ _empname=value;}
   get{return _empname;}
  } 
  public int deptId
  {
   set{ _deptid=value;}
   get{return _deptid;}
  }
  public int popedom
  {
   set{ _popedom=value;}
   get{return _popedom;}
  }
  #endregion Model
 }
}
   登陆页代码:
   using LGH.Common;
   using DataAccess;
  
   private void Button1_Click(object sender, System.EventArgs e)
  {
   string strEmpId = txtname.Text.Trim().ToString();
   string strEmpPass =LGH.Common.LghSecurity.Encrypt(txtpass.Text.Trim());//加密密码
   LGH.Common.model.Users model =new LGH.Common.model.Users();//声明此类一个实例对象Mode
   model.name =strEmpId;//向此类访问器传递参数
   model.pass =strEmpPass;
   DALUsers bll =new DALUsers();
   string userId =bll.Login(model);//封装后的Mode进行传递给Login方法提交数据库进行处理
                                                        //这里还要注意是的这里是调用了编译后的.dll文件里的方法
 
   if ((userId != null) && (userId != ""))
   {
   
    DALUsers bb =new DALUsers();
    int empId =bb.GetUsersId(strEmpId);
    Session["empName"]=userId;
    Session["empId"]=empId;
    Response.Redirect("index.aspx");
   }
   else
   {
    lblMsg.Visible =true;
    lblMsg.Text = "<" + "br " + ">错误的用户名或密码!" + "<" + "br" + ">";
   }
  }

   连接存储过程的语句:
   using System;
   using System.Data;
   using System.Data.SqlClient;
   using LGH.Common;
   连接数据库:
    private SqlConnection mySqlConnection;
  public  string CONN=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
  public DALUsers()
  {
   mySqlConnection = new SqlConnection(CONN.ToString());
  }

   public string Login(LGH.Common.model.Users model)//检查用户名和密码 接收Mode并提交数据库
     {
 SqlParameter[] parameters = {
         new SqlParameter("@empName", SqlDbType.VarChar,15),
         new SqlParameter("@name", SqlDbType.VarChar,50),
         new SqlParameter("@pass", SqlDbType.VarChar,50)};
   parameters[0].Direction = ParameterDirection.Output;
   parameters[1].Value = model.name;
   parameters[2].Value = model.pass;

 SqlHelper.ExecuteNonQuery(mySqlConnection, CommandType.StoredProcedure, "UserLogin",parameters);
 if ((parameters[0].Value != null) && (parameters[0].Value != System.DBNull.Value))
  {
  return ((String)parameters[0].Value).Trim();
  }
  else
  {
  return String.Empty;
  } 
     }
  
  着个提交数据库的里的ExecuteNonQuery我到文件一看吓一跳就着类SqlHelper下的次方法就有9个
  还有其他的方法不算  这里上面还没有真正的与存储过程打交道其实它完成的只是把参数类型进行封装
  并通过SqlHelper.ExecuteNonQuery(mySqlConnection, CommandType.StoredProcedure, "UserLogin",parameters);
  把参数传递给连接存储过程的语句:
  我现在把那9条写出来 下面的9条 上面的命令它不会全部执行它只选则符合条件的一条执行
    #region ExecuteNonQuery
        public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText)
        {
            return ExecuteNonQuery(connectionString, commandType, commandText, (SqlParameter[])null);
        } 
        public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
   if( connectionString == null || connectionString.Length == 0 ) throw new ArgumentNullException( "connectionString" );
 
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open(); 
                return ExecuteNonQuery(connection, commandType, commandText, commandParameters);
            }
        } 
        public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)
        {
   if( connectionString == null || connectionString.Length == 0 ) throw new ArgumentNullException( "connectionString" );
   if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );
            // If we receive parameter values, we need to figure out where they go
            if ((parameterValues != null) && (parameterValues.Length > 0))
            {
                // Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
                SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);
                // Assign the provided values to these parameters based on parameter order
                AssignParameterValues(commandParameters, parameterValues);
                // Call the overload that takes an array of SqlParameters
                return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters);
            }
            else
            {
                return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName);
            }
        } 
        public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText)
        {
            return ExecuteNonQuery(connection, commandType, commandText, (SqlParameter[])null);
        }
       
        public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
        {
   if( connection == null ) throw new ArgumentNullException( "connection" ); 
            SqlCommand cmd = new SqlCommand();
   bool mustCloseConnection = false;
            PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection );
      
            int retval = cmd.ExecuteNonQuery();
            cmd.Parameters.Clear();
   if( mustCloseConnection )
   connection.Close();
            return retval;
        }
        public static int ExecuteNonQuery(SqlConnection connection, string spName, params object[] parameterValues)
        {
   if( connection == null ) throw new ArgumentNullException( "connection" );
   if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );
            if ((parameterValues != null) && (parameterValues.Length > 0))
            {
                SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
                AssignParameterValues(commandParameters, parameterValues);
                return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters);
            }
            else
            {
                return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName);
            }
        }
        public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText)
        {
            return ExecuteNonQuery(transaction, commandType, commandText, (SqlParameter[])null);
        }
  public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
  {
   if( transaction == null ) throw new ArgumentNullException( "transaction" );
   if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" );
   SqlCommand cmd = new SqlCommand();
   bool mustCloseConnection = false;
   PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection );
   int retval = cmd.ExecuteNonQuery();
   cmd.Parameters.Clear();
   return retval;
  }
        public static int ExecuteNonQuery(SqlTransaction transaction, string spName, params object[] parameterValues)
        {
   if( transaction == null ) throw new ArgumentNullException( "transaction" );
   if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" );
   if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );
            if ((parameterValues != null) && (parameterValues.Length > 0))
            {
                SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); 
                AssignParameterValues(commandParameters, parameterValues); 
                return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters);
            }
            else
            {
                return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName);
            }
        }
        #endregion ExecuteNonQuery


29:怎么样对css进行动态的控制
   前台:
   <LINK id="css1" runat="server" type="text/css" rel="stylesheet"/>
  
   后台:
        Admin blog1Admin = new Admin();  
  protected System.Web.UI.HtmlControls.HtmlGenericControl css1;//对次进行引用

  private void Page_Load(object sender, System.EventArgs e)
  {
   if(!IsPostBack)
   {
    Bind();
   }
  }
  private void Bind()
  { 
   SqlDataReader ReadEnd =blog1Admin.SelectModule();

   if(ReadEnd.Read())
   {       //根据不同的情况进行选择样式:
    if(int.Parse(ReadEnd[11].ToString())==0)
    {
     css1.Attributes.Add("href","css/blog1.css");
    }
    else if(int.Parse(ReadEnd[11].ToString())==1)
    {
     css1.Attributes.Add("href","css/blog2.css");
    }
    else if(int.Parse(ReadEnd[11].ToString())==2)
    { 
     css1.Attributes.Add("href","css/blog3.css");
    }
    else
    {
                   css1.Attributes.Add("href","css/blog4.css");
    }
  
   }
   ReadEnd.Close();

 

  

  30:数据加密处理:
     public static string Encrypt(string cleanString)
  {
           Byte[] clearBytes= new UnicodeEncoding().GetBytes(cleanString);
   //对加密对象进行编码
     Byte[] hashedBytes=((HashAlgorithm) CryptoConfig.CreateFromName("MD5")).ComputeHash(clearBytes);
   //进行加密
      return BitConverter.ToString(hashedBytes);
  }

 31:觉得数据库操作是一个很大一个方面 想有oleDb数据库 Sql数据库,Oldc数据库,Oracle数据库
    那么要对这些数据进行操作怎么办,其实以前也经常用可是就是觉得数据库就是对象可是每次都只是
    看到书的,也没有明确这个对象有什么属性和用途,今天在工具栏中看到有数据选项,里面就是
    对各种不同数据库进行操作的对象, 小用了一下觉得还可以 所以下次用的时候可以试着用一下
    这种方法,然后从这个里面还可以查看这个对象的属性和各种方法
   
 
  32:用href传递参数看例子
     例1:
     <a href='<%#"../blog1/photoindexend.aspx?Pt_Id="+DataBinder.Eval(Container.DataItem,"Pt_Id")%>'>
     <asp:Image id="Image2" Width=150 Height=200 runat="server"
     ImageUrl='<%#"../photoend.aspx?ImageID="+DataBinder.Eval(Container,"DataItem.Pt_Id")%>'>
  </asp:Image></a>  
     例2:
     <td>
  <asp:HyperLink Runat=server NavigateUrl='<%#"../photoindexend.aspx?Pt_Id="+DataBinder.Eval(Container.DataItem,"Pt_Id")%>' Text='<%#DataBinder.Eval(Container.DataItem,"Pt_Name")%>' ID="Hyperlink2" />
  <br>
     </td>
 
  33:今天想在DataGrid分页时候按照1,2这样的按数字分不想 上一页 下一页 这样分 其实就在
     加上Mode="NumericPages"例子:
     <PagerStyle NextPageText="下一页" PrevPageText="上一页" Mode="NumericPages"></PagerStyle>
    
  34:今天又学了一招:如果在编程的时候 你不知道那个属性的用法  你只要在这个属性上
     按F1键 就可以获得帮助

 


开发中的感受5.txt


1:今天遇到一个这样的问题
  想在DataGrid控件中的asp:HyperLinkColumn传递二个参数 到网上一查发现只能够传递一个参数
  那怎么办法
  在网上早到一个篇好一点的文章:

  如下:

 HyperLinkColumn里怎样传递2个参数
leejun 发表于 2005-11-15 12:58:00


HyperLinkColumn里怎样传递2个参数
--------------------------------------------------------------------------------

好比是:yyy.aspx?id=111&classname=kkkkk
但是HyperLinkColumn只能绑定一个参数啊
希望那位大哥用VB给个代码出来。

--------------------------------------------------------------------------------

在使用DataGrid的时候如果你有一个asp:HyperLinkColumn又想使用多个需要绑定的参数作为链接的url,那么请改成模板列,使用普通的link标签<a>或者asp:HyperLink都可以,下面2种实现多绑定参数的解决方案。
(1)后台返回url
前台
<asp:TemplateColumn HeaderText="打开">
<ItemTemplate>
<asp:HyperLink Text="打开" NavigateUrl='<%# myfunc2(DataBinder.Eval(Container.DataItem,"vName"),DataBinder.Eval(Container.DataItem,"iAge"))%> ' Runat="server" Target="_blank" ID="Hyperlink1">
</asp:HyperLink>
</ItemTemplate>
</asp:TemplateColumn>
后台
protected string myfunc2(object s1,object s2)
{
return "newpage.aspx?name="+s1.ToString()+"&age="+s2.ToString();
}
(2)直接前台设定url
<asp:TemplateColumn HeaderText="打开">
<ItemTemplate>
<asp:HyperLink Text="打开" NavigateUrl='<%#"newpage.aspx?name="+DataBinder.Eval(Container.DataItem, "vname")+"&age="+DataBinder.Eval(Container.DataItem, "iage") %>' Runat="server" Target="_blank">
</asp:HyperLink>
</ItemTemplate>
</asp:TemplateColumn>
其实以上2个方案是一回事情,但是前者更加清晰,而且易于后台动态生成url。

--------------------------------------------------------------------------------

找到一个这样的文章但是好像SQLSTRING有错误哦
因为一个HyperLinkColumn控件只能绑定一个字段
如果你使用的是数据绑定,例如在DataGrid控件中使用HyperLinkColumn,你需要先在SQL语言构造这个字段,例如:
<asp:datagrid id="DataGrid1" runat="server" AutoGenerateColumns="False" AllowPaging="True" PageSize="5">
<Columns>
...
<asp:HyperLinkColumn Text="details" DataNavigateUrlField="details" DataNavigateUrlFormatString="Detail.aspx?{0}"></asp:HyperLinkColumn>…
</Columns>
</asp:datagrid>
下面是绑定数据的代码
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Not IsPostBack Then
            FillDataGrid()
        End If
    End Sub
    Public Sub FillDataGrid()
        Dim cnn As SqlConnection = New SqlConnection("server=sha-vbdc-01;database=pubs;Integrated Security=SSPI")
        Dim sql As String
        'sql = "select * from authors"
        sql = "select *, 'au_id=' + au_id + '&' + 'au_fname=' + au_fname details from authors"
        Dim cmd As SqlDataAdapter = New SqlDataAdapter(sql, cnn)
        Dim ds As DataSet = New DataSet()
        cmd.Fill(ds, "Authors")
        DataGrid1.DataSource = ds
        DataGrid1.DataMember = "Authors"
        DataGrid1.DataBind()
    End Sub
请注意上面的SQL语句,它构成一个details字段与HyperLinkColumn绑定。


上面的例子我用了第二个方法 可是我的是写在存储过程里的
开始遇到了一些麻烦包括类型的转换,还有sql在存储过程里的写法:
不过最后我还是做出来了:
现在写出来:

存储过程语句

 (  
    @CS varchar output
 )

AS 

  select *, 'I_Id='+LTRIM(str(I_Id))+'&'+'F_Id='+Ltrim(str(F_Id)) as CS from I_LiuYan

连接存储过程语句
SqlParameter ParameterCS = new SqlParameter("@CS",SqlDbType.VarChar,50);
   ParameterCS.Direction=ParameterDirection.Output;
   Comm.SelectCommand.Parameters.Add(ParameterCS);

前台语句
<asp:HyperLinkColumn Target="_blank" DataNavigateUrlField="CS" DataNavigateUrlFormatString="../showend.aspx?{0}"
   DataTextField="I_Title" HeaderText="主题"></asp:HyperLinkColumn>

 

这样就可以传递二个参数了


此例子给我的启发:
 1:怎么样传递二个参数
 2:sql 语句的些法 a:用了 and     as
                  b:str 这是比较关键的因为在例子里 I_Id和F_Id的数据类型int
                   如果不进行类型的转换运行起来的就会出错
                   开始我不知道怎么转换 只知道要转换 不过后来在sql去查了
                  一下发现找到了 并且东西好不少:
    
    其实找到就是 表达式函数

     字符串(字符)函数 

     日期函数
 
     数学函数

     系统函数

     其它函数,例如某些将数据从一种类型转换为另一种类型的函数

 


     现在拿出一部分出来:

    
     描述 示例
LCASE( )1、
LOWER( ) 将字符串转换为小写字母 SELECT UPPER(substring(lname, 1, 1)) +
  LOWER(substring (lname, 2, 99))
FROM employee


将姓氏的第一个字母转换为大写,将其余字母保留小写后显示姓氏。

 
LTRIM( ) 删除字符串前面的空格 SELECT stor_name, LTRIM(stor_address)
FROM stores


删除前面多余的空格后显示地址列。

 
SUBSTRING( ) 从字符串中提取一个或多个字符 SELECT SUBSTRING(phone,1,3)
FROM employee


显示电话号码的前三个字符(区号)

 
UCASE( )1、
UPPER( ) 将字符串转换为大写字母 SELECT * FROM employee
WHERE UPPER(lname) = 'SMITH'
将 lname 列的内容转换为大写字母后再与特定的值进行比较(以避免当搜索区分大小写时不匹配)。有关在 SQL Server 中区分大小写的详细信息,请参见查询设计器注意事项。

 


1    如果作为 ODBC 函数调用,请使用如下语法:{ fn LCASE(text) }。

日期函数
下表包含日期函数的样本。有关更多信息,请参见 日期和时间函数。

函数 描述 示例
DATEDIFF( ) 计算两个日期间的间隔。 SELECT fname, lname, hire_date
FROM employee
WHERE DATEDIFF(year, hire_date, getdate()) > 5


查找雇佣期限超过五年的所有员工。

 
DATEPART( ) 返回日期或日期时间列的指定部分,包括日、月或年。 SELECT DATEPART(year, hire_date)
FROM employee


只显示员工是在哪一年被雇佣的(而非完整日期)。

 
CURDATE( )1
GETDATE( ) 或 DATE( ) 以日期时间的格式返回当前日期。对于许多其它日期函数,该函数作为输入函数很有用,如计算距当天之前或之后的时间间隔。 SELECT order_id
FROM orders
WHERE order_date = GETDATE()
Displays orders placed today.

 


1    如果作为 ODBC 函数调用,请使用如下语法:{ fn CURDATE() }。

数学函数
下列函数是许多数据库中可用的典型函数。有关更多信息,请参见数学函数。

注意   可以使用聚合函数 AVG( )、COUNT( )、MAX( )、MIN( ) 和 SUM( ) 在报表中创建平均值及合计值。有关详细信息,请参见汇总和分组。

函数 描述 示例
ROUND( ) 将数字按指定的小数位数四舍五入 SELECT ROUND(qty * (price * discount), 2)
FROM sales


显示根据折扣价格计算的总价格,然后将结果四舍五入到小数点后两位。

 
FLOOR( ) 将数字向下四舍五入为最接近(最小)的整数 UPDATE titles
SET price = FLOOR(price)


将 titles 表中的所有价格四舍五入为最接近的整数。

 
CEILING( ) 将数字向上四舍五入为最接近的整数 INSERT INTO archivetitle
SELECT title, CEILING(price)
FROM titles


将 titles 表中的 title 和 price(向上四舍五入为最接近的整数)复制到 archivetitle 表中。

 


系统函数
下列函数是许多数据库中可用的典型函数。有关更多信息,请参见系统函数。

函数 描述 示例
DATALENGTH( ) 返回指定的表达式所用的字节数 SELECT DATALENGTH(au_lname + ', '
  + au_fname)
FROM authors


列出组合姓氏与名字所需的字节数。

 
USER( )1、
USER_NAME( ) 返回当前用户名 SELECT company_name, city, phone
FROM customers
WHERE salesperson = USER_NAME()


为运行查询的销售人员创建客户列表。

 


1    如果作为 ODBC 函数调用,请使用如下语法:{ fn USER() }。

其它函数
下列函数举例说明许多数据库中可用的实用工具函数。有关更多信息,请参见函数。

函数 描述 示例
CONVERT( ) 将数据从一种类型转换为另一种类型。格式化数据时或者在需要其它数据类型的函数中将数据列的内容作为参数时很有用。 SELECT 'Hired: ' + CONVERT(char (11),
  hire_date)
FROM employee


显示前面带题注的日期;CONVERT( ) 函数根据日期创建字符串,使其可以与文字字符串串联。

 
SOUNDEX( ) 为可创建"近似"搜索的指定表达式返回 Soundex 代码。 SELECT au_lname, au_fname
FROM authors
WHERE SOUNDEX(au_fname) = 'M240'


搜索与"Michael"相似的名字。

 
STR( ) 将数字数据转换为字符串,以便可以用文本运算符对其进行处理。 SELECT str(job_id) + ' ' +
   str(job_lvl)
FROM employee


在单个字符串中显示 job_id 和 job_lvl 列(都是数字型)。
 


我觉得上面这写很有用 今天学了几个东西 

 1:怎么样传递多个参数
 2:怎么样在sql语句在把几个字节放在一个字节里输出 像上面就是放在CS中输出的
 3:不仅知道了在sql语句中有许多函数可以用,并且还知道了怎么去用这些函数了

 


2:今天又发现一个很用的东西 看例子:


<asp:TemplateColumn HeaderText="照片">
<ItemTemplate>
<a  href='<%#"../blog1/photoindexend.aspx?Pt_Id="+DataBinder.Eval(Container.DataItem,"Pt_Id")%>'>
<asp:Image id="Image1" Width=50 Height=80 runat="server" ImageUrl='<%#"../photoend.aspx?ImageID="+DataBinder.Eval(Container,"DataItem.Pt_Id")%>'> </asp:Image></a>
</ItemTemplate>
</asp:TemplateColumn>
这是在DataGrid控件里的 对绑定数据的新用法
即:DataBinder.Eval(Container.DataItem,"Pt_Id")%>

在看:
<asp:HyperLinkColumn Target="_blank" DataNavigateUrlField="Pt_Id" DataNavigateUrlFormatString="../photoindexend.aspx?Pt_Id={0}"
DataTextField="Pn_Name" HeaderText="评论主题"></asp:HyperLinkColumn>

一般是这样的用法DataTextField="Pn_Name" 很多控件里是这样的
只是那些用sqlDataReader用DataBinder.Eval(Container.DataItem,"Pt_Id")%>
我也想过这二种能够通用吗  不过今天看来是可以的
这样的话 这给我带来了很大的方便了

posted @ 2007-09-03 19:22  兴百放  阅读(3261)  评论(1编辑  收藏  举报