.Net中通过DataSet直接更新数据库相关问题和解决方法

一般存在的问题:

1. 没有acceptchange
2. 数据库中表没有设置主键

解决方法:

使用DataAdapter的update方法更新数据,该数据表必须设置主键,
那是因为这个方法的实现原理实际上只不过是根据表结构和主键自动生成SQL

也许你的数据表本身是有主键的,但是为什么还有问题?

DataTable也必须要有主键,有两种方式解决:
1)在读数据的时候DataAdapter.Fill后面,紧跟着就把表结构也读取进来,方法是 da.FillSchema(myDataset,System.Data.SchemaType.Mapped)

2)手工设置主键myDataset.Tables("test").PrimaryKey = new DataColumn(){myDataset.Tables("test").Columns()}'将第一列设置为主键

上面两种方式我强烈推荐第一种,这样在使用DataAdapter.Update方法的时候可以避免很多问题

 

示例代码:

    Dim m_OleDA As OleDb.OleDbDataAdapter
    Dim sCon As String = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=E:/szwork/排水/类设计/wsLibrary/test/ADO/SaveData/test.mdb"
    Dim oleCon As OleDb.OleDbConnection = New OleDb.OleDbConnection(sCon)

    Dim ds As DataSet = New DataSet()
    m_OleDA = New OleDb.OleDbDataAdapter("Select * from table2", oleCon)
    m_OleDA.Fill(ds, "table2")
    m_OleDA.FillSchema(ds, System.Data.SchemaType.Mapped)
    Dim oleCb As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(m_OleDA)


    Dim dt As DataTable = ds.Tables(0)
    Dim dr As DataRow = dt.NewRow()
    dr.Item("Addtwo") = 1001
    dr.Item("Mutipletwo") = 1001
    dr.Item("objectid") = 1001
    dt.Rows.Add(dr)


    m_OleDA.Update(ds, "table2")
    ds.AcceptChanges()
   
   
心得体会:
1,AcceptChanges必须在Update之后,从逻辑上便可想通.
2,FillSchema在New OleDb.OleDbCommandBuilder之前,FillSchema读入表架构,而New OleDb.OleDbCommandBuilder则根据表架构自动生成OleDbCommand,这和直接通过OleDbCommand来做是一样的道理,只不过一个是自动,另一个是手动.
3,也可以通过HasChanges和GetChanges来做,估计能节省资源. 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值