【发布时间】:2015-05-14 14:19:43
【问题描述】:
我正在开发一个带有 Access 2002 数据库 (.mdb) 和 OleDb 的小型离线 C# 应用程序。
我有 2 个表需要同时插入数据,其中一个持有另一个的外键。因此,为了简化,假设一个表有 2 个属性:“idTable1”(自动增量整数)和“数字”,另一个有 2 个属性:“idTable2”(自动增量整数)和“fkTable1”(包含一个与表 1 中的“idTable1”匹配的整数值。
foreach 循环遍历集合并将每个元素插入 Table1 中。然后想法是在Table1上使用SELECT @@Identity查询来获取最后插入的记录的自增id字段,并将其作为外键插入到Table2中。
我只是在尝试插入外键之前尝试第一部分:遍历集合,将每个项目插入 Table1 并获取最后插入记录的 idTable1。但是每当我尝试执行 SELECT @@Identity 时,我的数据库中只会得到 1 条记录,即使循环正确地遍历了所有集合项。
我的代码如下所示:
string queryInsertTable1 = "INSERT INTO Table1 (numero) VALUES (?)";
string queryGetLastId = "Select @@Identity";
using (OleDbConnection dbConnection = new OleDbConnection(strDeConexion))
{
using (OleDbCommand commandStatement = new OleDbCommand(queryInsertTable1, dbConnection))
{
dbConnection.Open();
foreach (int c in Collection)
{
commandStatement.Parameters.AddWithValue("", c);
commandStatement.ExecuteNonQuery();
commandStatement.CommandText = queryGetLastId;
LastInsertedId = (int)commandStatement.ExecuteScalar();
}
}
}
如果我注释掉最后 3 行:
commandStatement.CommandText = queryGetLastId;
LastInsertedId = (int)commandStatement.ExecuteScalar();
然后Collection 中的所有记录都正确插入到BD 中。但是一旦我取消注释这些,我只插入了 1 条记录,而存储在“c”中的值是集合中的最后一个元素(所以循环工作正常)。
我还尝试在 commandStatement.ExecuteNonQuery() 句子之后立即调用 commandStatement.Parameters.Clear(),但这没有区别(不应该,但我仍然尝试过)。
我不想通过使用事务等使事情变得复杂,如果可以避免的话,因为这是一个非常简单的单机离线小型应用程序。因此,如果有人知道我可以做些什么来使该代码正常工作,我将非常感激:)
【问题讨论】: