现在的位置: 首页 > 综合 > 正文

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

2012年12月04日 ⁄ 综合 ⁄ 共 25958字 ⁄ 字号 评论关闭
.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文件 从而达到更改服务器上文件的目的

抱歉!评论已关闭.