一般存在的问题:
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来做,估计能节省资源.