我有一个数据库表,其中一个字段叫做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。 Insert已成功,并且在数据库中该行具有有效的ID值。
如何获取该ID以便我可以继续第二次更新通话?
更新
IT看起来可以使用this setting自动完成。 但是根据msdn social的答案,OLEDB驱动程序不支持此功能。
不确定从哪里开始,使用oledb以外的其他东西?
更新
尝试过SQLCompact,但发现它有相同的limitation,它不支持多个语句。
最后一个问题:是否有任何简单的(基于单个文件的)数据库可以让你获得插入行的值。
答案 0 :(得分:1)
试试这个http://support.microsoft.com/kb/815629,示例代码在VB.NET中。
或者,如果在MS Access中接受多行查询并且它具有用于检索最后一个id的内置函数/变量,请使用此(数据库是SQLite):anyway see why I get this "Concurrency Violation" in these few lines of code??? Concurrency violation: the UpdateCommand affected 0 of the expected 1 records,尝试谷歌搜索函数< / p>
[编辑:在我的计算机上运行,我没有SQL Server Compact,但我没有使用多语句]
public Form1()
{
InitializeComponent();
var c = Connect();
var da = new SqlDataAdapter("select emp_id, emp_firstname, emp_lastname from emp where 1 = 0", c);
var b = new SqlCommandBuilder(da);
var getIdentity = new SqlCommand("SELECT CAST(@@IDENTITY AS INT)", c);
da.InsertCommand = b.GetInsertCommand();
da.UpdateCommand = b.GetUpdateCommand();
da.DeleteCommand = b.GetDeleteCommand();
da.RowUpdated += (xsender, xe) =>
{
if (xe.Status == UpdateStatus.Continue && xe.StatementType == StatementType.Insert)
{
xe.Row["emp_id"] = (int)getIdentity.ExecuteScalar();
}
};
var dt = new DataTable();
da.Fill(dt);
var nr = dt.NewRow();
nr["emp_firstname"] = "john";
nr["emp_lastname"] = "lennon";
var nrx = dt.NewRow();
nrx["emp_firstname"] = "paul";
nrx["emp_lastname"] = "mccartney";
dt.Rows.Add(nr);
dt.Rows.Add(nrx);
da.Update(dt);
dt.AcceptChanges();
nrx["emp_lastname"] = "simon";
da.Update(dt);
nr["emp_lastname"] = "valjean";
da.Update(dt);
}
SqlConnection Connect()
{
return new SqlConnection(@"data source=.\SQLEXPRESS;Database=Test;uid=sa;pwd=hey");
}
答案 1 :(得分:-1)
为什么不选择MAX(RowId),因为你的RowId应该为每个INSERT递增?这可能吗?
至于你的最终答案,SQLite可能是你的完美工具。希望如此!它有自己的.NET数据提供程序,因此不需要OLEDB或ODBC提供程序。