【发布时间】:2010-05-12 14:20:18
【问题描述】:
我有一个数据库表,其中有一个字段,称为 ID,是一个自动递增整数。 使用 TableAdapter,我可以读取和修改现有行以及创建新行。
但是,如果我尝试修改新插入的行,则会收到 DBConcurrencyException:
OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Shift.mdb;Persist Security Info=True");
ShiftDataSetTableAdapters.ShiftTableAdapter shiftTA = new ShiftDataSetTableAdapters.ShiftTableAdapter();
shiftTA.Connection = conn;
ShiftDataSet.ShiftDataTable table = new ShiftDataSet.ShiftDataTable();
ShiftDataSet.ShiftRow row = table.NewShiftRow();
row.Name = "life";
table.Rows.Add(row);
shiftTA.Update(row); // row.ID == -1
row.Name = "answer"; // <-- all fine up to here
shiftTA.Update(row); // DBConcurrencyException: 0 rows affected
另外一个问题,是否有任何静态类型的 NewShiftRow() 方法我可以使用,这样我就不必在每次想要插入新行时创建表。
我猜代码中的问题来自第一次 Update() 调用后仍为 -1 的 row.ID。插入成功,并且在数据库中该行具有有效的 ID 值。
如何获取该 ID 以便继续第二次更新调用?
更新:
看起来这可以使用this setting 自动完成。 但是根据msdn social上的回答,OLEDB驱动不支持这个功能。
不知道从哪里开始,使用 oledb 以外的其他东西?
更新:
试过SQLCompact,发现跟limitation一样,不支持多语句。
最后一个问题:是否有任何简单的(基于单个文件的)数据库可以让您获取插入行的值。
【问题讨论】:
-
挂钩 RowUpdated 事件并从那里分配 ID support.microsoft.com/kb/815629
-
关于您的最后一个问题(基于单个文件的数据库),Sqlite 完全符合要求。在这里查看我的答案stackoverflow.com/questions/1599230/…
标签: c# database sql-server-ce jet