2

我正在处理的一项 Web 服务经常出现这个问题。我正在使用数据适配器使用事务和批量更新。最重要的是,我还使用 Oracle Command Builder 来获取我分配给数据适配器的插入/删除/更新命令。

这是从我的服务中提取的一些代码;并带有错误行:

请注意 - 我正在发布从我的源代码中提取的代码:

OracleTransaction trx = null;
if ((Transaction.Current.TransactionInformation.DistributedIdentifier == Guid.Empty))
                {
                    con.ConnectionString = con.ConnectionString + ";enlist=false"; ;
                    con.Open();
                    trx = con.BeginTransaction();
                    cmd.Transaction = trx;
                }

                try
                {
                    dsEmpData.AcceptChanges();
                    for (int i = 0; i < dsEmpData.Tables[0].Rows.Count; i++)
                    {
                        dsEmpData.Tables[0].Rows[i].SetAdded();
                    }
                    OracleCommandBuilder cb = new OracleCommandBuilder();
                    string SQL
                            = "--MY SELECT COMMAND. REMOVED BECAUSE IT IS NOT NECESSARY IN THIS BLOCK";

                    OracleDataAdapter da = new OracleDataAdapter(SQL, ConnectionString);
                    OracleCommandBuilder cmdInsert = new OracleCommandBuilder(da);
                    dsEmpData.Tables[0].TableName = "TABLENAME".ToUpper();

                    if ((Transaction.Current.TransactionInformation.DistributedIdentifier == Guid.Empty))
                    {
                        da.SelectCommand.Transaction = trx;
                        da.InsertCommand = cmdInsert.GetInsertCommand();//ERROR LINE
                        da.InsertCommand.Transaction = trx;
                    }
                    da.Update(dsEmpData, "TABLENAME".ToUpper());
                    if (trx != null)
                    { trx.Commit(); }
                }
                catch (Exception ex)
                {
                    if (trx != null)
                    { trx.Rollback(); }
                    throw new FaultException("MY MESSAGE " + ex.Message);
                }

因此,如上所述 - 我在上述行中收到异常“事务对象与连接对象不关联”: da.InsertCommand = cmdInsert.GetInsertCommand();

对此问题的任何帮助将不胜感激。如果您需要更多信息,请告诉我。

提前致谢。

4

1 回答 1

4

这是因为事务属于名为 con 的连接,它是在代码的大约第 5 行中创建的。但是,OracleDataAdaptor 不与该连接关联。你给它连接字符串而不是连接。这意味着它将创建自己的连接。

然后,您向该适配器提供与先前连接关联的事务。这行不通!您必须将数据适配器与与事务相同的连接相关联。您可以将适配器与原始连接相关联,或者从适配器的连接创建事务;一个或另一个将起作用。

干杯 -

于 2014-01-21T12:53:36.857 回答