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

Loop to insert data in OleDb breaks when I try to execute more than 1 query

我正在开发一个带有 Access 2002 数据库 (.mdb) 和 OleDb 的小型离线 C# 应用程序。

我有 2 个 table 需要同时插入数据,一个持有另一个的外键。所以,为了简化,假设一个 table 有 2 个属性:"idTable1"(自动递增整数)和 "number",另一个有 2 个属性:"idTable2"(自动递增整数)整数)和 "fkTable1"(外键包含与 table 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(),但这没有什么区别(不应该,但我还是试过了)。

如果可以避免的话,我不想通过使用交易等方式使事情变得复杂,因为这是一个非常简单的单机离线小型应用程序。因此,如果有人知道我可以做些什么来使该代码正常工作,我将不胜感激:)

此处:commandStatement.CommandText = queryGetLastId; 您实际上将命令从插入更改为 selecting 身份。

因此,在下一次迭代中它不会插入任何内容,但再次 select 用于标识,这就是为什么您只将一条记录插入到数据库中的原因。

我认为最好有两个单独的命令用于插入和 selecting 身份。

另请注意 - 您试图在每次迭代中将新参数添加到 commandStatement 中,因此在迭代中,比如说,N 它将是 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();
        }
    }
}

更改命令文本后,第一个查询将消失,因此它不会再次向第一个 table 插入任何数据。重新评估并尝试