当我尝试执行多个查询时,在OleDb中插入数据的循环中断
本文关键字:OleDb 插入 数据 中断 循环 执行 查询 | 更新日期: 2023-09-27 17:49:16
我正在开发一个小型的离线c#应用程序,使用Access 2002数据库(.mdb)和OleDb.
我有2个表,我需要同时插入数据,一个持有另一个的外键。因此,为了简化,我们假设一个表有两个属性:"idTable1"(自增整数)和"number",另一个表有两个属性:"idTable2"(自增整数)和"fkTable1"(外键包含一个整数值,与表1中的"idTable1"匹配)。
foreach循环遍历一个集合并插入表1中的每个元素。然后,我们的想法是在Table1上使用SELECT @@Identity
查询来获取插入的最后一条记录的自动递增id字段,并将其作为外键插入到Table2中。
我只是在尝试插入外键之前尝试第一部分:在集合上循环,在表1中插入每个项目,并获得最后插入记录的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();
然后集合中的所有记录都正确地插入到BD中。但是一旦我取消注释,我就会插入1条记录,而存储在"c"中的值是集合中的最后一个元素(因此循环工作良好)。
我也试着在commandStatement.ExecuteNonQuery()
句之后调用commandStatement.Parameters.Clear()
,但这没有区别(它不应该,但我仍然尝试)。
我不想通过使用事务之类的东西使事情变得复杂,如果我可以避免的话,因为这是一个非常简单的,单计算机,离线和小的应用程序。因此,如果有人知道我可以做些什么使代码工作,我将非常感激:)
这里:commandStatement.CommandText = queryGetLastId;
您实际上将您的命令从插入更改为选择标识。
因此,在下一次迭代时,它不会插入任何内容,而是再次选择标识,这就是为什么您只有一条记录插入到DB中。
我认为最好有两个单独的命令来插入和选择标识。
还要注意-您试图在每次迭代中向commandStatement
添加新参数,因此在迭代中,例如,它将有N个参数。要么在添加新参数之前清除参数,要么在循环外添加参数,并在循环内仅更改其值。
using (OleDbConnection dbConnection = new OleDbConnection(strDeConexion))
{
using (OleDbCommand commandStatement = new OleDbCommand(queryInsertTable1, dbConnection))
using (OleDbCommand commandIdentity = new OleDbCommand(queryGetLastId , dbConnection))
{
commandStatement.Parameters.Add(new OleDbParameter());
dbConnection.Open();
foreach (int c in Collection)
{
commandStatement.Parameters[0].Value = c;
commandStatement.ExecuteNonQuery();
LastInsertedId = (int)commandIdentity.ExecuteScalar();
}
}
}
一旦您更改了命令文本,第一个查询将从其中消失,因此它不会再次将任何数据插入到第一个表中。重新输入