在做这个项目的过程中,使用Ado.net和.net数据邦定特性比较多,Ado.net对于上一代的数据库访问类来说,有质的飞跃,效率更高、代码量更少,但是在我实际编程的过程中,还是有很多地方使我迷惑的,我现把我所遇到的问题和解决方法帖出来和大家交流一下:
        1、Ado.net中DataSet()对象update()方法更新数据的困惑;
        其实对于winform应用程序来说,用Ado.net链接数据库,执行一些存储过程然后把返回的数据放在一个本地的DataSet()对象中,对其进行操作与处理,然后进行更新是一点问题都没有的,但是有一次,在我写一个基于ASP.net的网页时,问题却出来了,我使用了一个datagrid控件,因为为了省事^_^,我使用了它默认的那些邦定特性,让其自动生成了模板去显示,然后实现了其编辑、删除、更新等操作
        因为自己以前没有ASp.net项目实施的经验,所以以为在Asp.net中datagrid的操作和winform应用程序中的操作差不多,于是在datagrid控件中的
        Sub DataGrid1_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.UpdateCommand事件中,直接就写为:
        dataSet1.Update("表名")
         呵呵,谁知数据库中根本更新不了,仔细一想,在网络环境中的数据更新肯定不是那么容易的,于是就有了一下的代码,在更新的时候重新和数据库连接,找到要修改的东西,更新的数据库中去,代码可能是:
        Private Sub DataGrid1_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.UpdateCommand
        Dim dgi As DataGridItem = DataGrid1.Items(e.Item.ItemIndex)        '*找到编辑更新的那一行
        Dim key As Int32 = CInt(DataGrid1.DataKeys(e.Item.ItemIndex))
'*-----------------------------------------------------------把修改过的取出
        Dim texBox1 As TextBox = DirectCast(dgi.Cells(3).Controls(0), TextBox)

        Dim texBox2 As TextBox = DirectCast(dgi.Cells(4).Controls(0), TextBox)
        Dim texBox3 As TextBox = DirectCast(dgi.Cells(5).Controls(0), TextBox)
        Dim texBox4 As TextBox = DirectCast(dgi.Cells(6).Controls(0), TextBox)
        Dim texBox5 As TextBox = DirectCast(dgi.Cells(7).Controls(0), TextBox)
        Dim texBox6 As TextBox = DirectCast(dgi.Cells(8).Controls(0), TextBox)
        Dim Sql As String = "catalogueInto3"
'*-----------------------------------------------------------重新连接到数据库,利用存储过程进行更新
        Dim ConnString As String = "Data Source=(local); User ID=sa; Password=19791023328; Initial Catalog=Henan_Opera"
        Dim Conn As New System.Data.SqlClient.SqlConnection(ConnString)
        Try
            Conn.Open()
            Dim Cmd As New System.Data.SqlClient.SqlCommand
            Cmd.Connection = Conn
            Cmd.CommandText = Sql
            Cmd.CommandType = CommandType.StoredProcedure
            Cmd.Parameters.Add("@lemma_title", texBox1.Text)
            Cmd.Parameters.Add("@lemma_content", texBox2.Text)
            Cmd.Parameters.Add("@index_title", texBox3.Text)
            Cmd.Parameters.Add("@stroke_title", texBox4.Text)
            Cmd.Parameters.Add("@catalogue_title", texBox5.Text)
            Cmd.Parameters.Add("@catalogue_key", texBox6.Text)
            Cmd.Parameters.Add("@id", key)
            Dim Record As Integer = Cmd.ExecuteNonQuery()
            Label2.Text = Record
            Conn.Close()
            DataGrid1.EditItemIndex = -1
            BindDataGrid()
        Catch ex As Exception
            Label2.Text = ex.Message
        Finally
            Conn.Close()
        End Try
    End Sub
        后来在网上看了一些相关的介绍,用DataAdapter的Update()方法借助CommandBuilder来实现更新,Update()实际上是通过CommandBuilder动态生成sql语句,然后才进行数据库操作,但如果你在一开始创建DataAdapter时的那个sql语句没有包含有主键的列的话,那CommandBuilder将不会发生作用,代码如下:
'*----------------------------------------------------引用其他网站里的东西
        string connstr=ConfigurationSettings.AppSettings["color"];
        OleDbConnection conn=new OleDbConnection(connstr);
        string sql="select * from member";
        OleDbDataAdapter ada=new OleDbDataAdapter(sql,conn);//建立一个DataAdapter对象
       //这里的CommandBuilder对象一定不要忘了,一般就是写在DataAdapter定义的后面
       OleDbCommandBuilder cb=new OleDbCommandBuilder(ada);
       DataSet ds=new DataSet();//建立DataSet对象
       conn.Open();//打开连接
       ada.Fill(ds,"mems");//填充DataSet
       conn.Close();//注意及时关闭连接
       DataTable dt=ds.Tables["mems"];//建立一个DataTable对象,方便操作
       dt.PrimaryKey=new DataColumn[]{dt.Columns["id"]};//建立一个主键
       DataRow dr=dt.Rows.Find(ids);//根据参数查找到需要修改的行
       补充一点,如果想设多于两个的主键的话,可以用这个
       dt.PrimaryKey=new DataColumn[]{dt.Columns["id"],dt.Columns["id2"]};
        就是给数组添加两个值,然后使用的时候:
       Object[] keyValues=new object[1]; //这里必须实例化否则会向你要初值
       //而且需要后面方括号中的这个索引范围
       keyValues[0]=(object)key1;
       keyValues[1]=(object)key2;
       ...... 另外一种写法
       Object[] keyValues={(object)key1,(object)key2};//以楣举方式赋初值

      dr["name"]=names;//对需要修改的记录赋新值
       ada.Update(ds,"mems");//用
DataAdapter的Update()方法进行数据库的更新
'*---------------------------------------------------------------------------------------
       这段代码我是从其他网站上拷贝出来的,主要是要说明这个方法,仅供参考,我个人对CommandBuilder这个东西理解的不是很深,主要是感觉有这么一种方法,但我觉得这个方法不够透明,呵呵,主要是个人偏好问题,我比较喜欢比较清晰的思路,呵呵,不过这种方法确实也很方便,但我觉得它本质上还是要通过原有的连接和数据在一次建立通道的,不过不是显式的,是通过DataAdapter对象使用新建的一个CommandBuilder对象,产生一个sql的语句再次进行更新的。但另一个关键是要在存储在本地的那个表中找到正在修改的行号,比如        Dim key As Int32 = CInt(DataGrid1.DataKeys(e.Item.ItemIndex)) 这一句就是找到了正在修改的行号,而对于datagrid控件来说,要进行编辑、删除操作,首先应建立一个主键......
        2、使用Data Access Application Block相关
       DAAB是一个.net组件,是微软enterprise library里的一部份,现在已经出了3.x了,支持对所有的数据库进行存取操作,它实际上把对数据库的访问都封装在了这个Daab中,真是太方便了,再者enterprise library里其他的相关的部分分别是用来开发企业级程序的必备的模块,这个东西是一种实现模式,主要是把企业开发中要面临的共性的东西提炼出来,减少相关的开发投入,使我们有更多的精力去考虑业务逻辑和其他的东西.......希望大家都把这样的好的模块好好研究一下,充实到自己的开发当中去。
        3、关于控件的数据邦定特性
        我在学习vb.net Start kit时里面有一个例子,对控件的数据邦定特性给与了充分的示范,我现在使用vb.net做这方面的工作实在是太方便了,它主要有一个邦定管理器BindingContext和一个邦定对象Binding构成,而且大部分空间都支持邦定的特性,所以这方面的代码量很少,如果我们配合vb.net的事件处理机制,就会在使用数据邦定时事半功倍,vb.net的AddHandler、WithEvents、.........
                                                                  <未完,待续......>