错误:无法访问已处置的对象。对象名称:Oracle.ManagedDataAcess.Client.OracleCommand

时间:2018-12-12 08:08:32

标签: c# task-parallel-library objectdisposedexception oraclecommand

ExecuteNonQueryAsync()运行时,它在某些迭代中给出了错误:

  

无法访问已处置的对象。

正在读取一个具有1亿行的大文件,并将其批量插入DB。

所有执行都在单个事务中进行,因为如果有任何数据垃圾,我们需要回滚整个事务。

因此,数据库连接将保持活动状态,直到事务完成为止。

List<Task> insert = new List<Task>();

public void InsertDataToDB(string generatorRunId)    
{
        {
            // some logic

            // loop runs million times and task is added to list
            insert.Add(Task.Run(() => ExecuteOracleCommandAsync(schemaTable, oraConn, insertString, obj, param)));            
        }

    Task.WhenAll(insert).Wait();
}


private static async Task ExecuteOracleCommandAsync(DataTable schemaTable, OracleConnection oraConn, string insertString, object[][] obj, OracleParameter[] param)
{
    using (OracleCommand cmd = oraConn.CreateCommand())
    {
        cmd.CommandText = string.Concat(insertString, ")");
        cmd.ArrayBindCount = obj[0].Length;

        for (int i = 0; i < schemaTable.Rows.Count; i++)
        {
            cmd.Parameters.Add(param[i]);
        }

        await cmd.ExecuteNonQueryAsync();
    }
}

0 个答案:

没有答案