当我尝试执行多个查询时,在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(),但这没有区别(它不应该,但我仍然尝试)。

我不想通过使用事务之类的东西使事情变得复杂,如果我可以避免的话,因为这是一个非常简单的,单计算机,离线和小的应用程序。因此,如果有人知道我可以做些什么使代码工作,我将非常感激:)

当我尝试执行多个查询时,在OleDb中插入数据的循环中断

这里: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();
        }
    }
}

一旦您更改了命令文本,第一个查询将从其中消失,因此它不会再次将任何数据插入到第一个表中。重新输入