【问题标题】:Do you need to "commit" between multiple oracle sql executions in a c# app?您是否需要在 c# 应用程序中的多个 oracle sql 执行之间“提交”?
【发布时间】:2017-01-04 15:16:31
【问题描述】:
 var oraConnectionString = new OracleConnectionStringBuilder(_connectionString);
            using (var oraConnection = new OracleConnection(oraConnectionString.ConnectionString))
            {
                oraConnection.Open();
                try
                {
                    using (var command = new OracleCommand(sqlText, oraConnection))
                    {
                        command.Parameters.Clear();
                        command.BindByName = true;
                        command.Parameters.Add("node", _currentNode);
                        command.Parameters.Add("carrierId", CarrierId);
                        command.Connection.BeginTransaction();
                        command.ExecuteNonQuery();
                        command.CommandText = UtilityMethods.LoadTemplate("Resources/CreateCarrier.sql", "Carriers");
                        command.Parameters.Clear();
                        command.Parameters.Add("carrierName", CarrierName);
                        command.Parameters.Add("line1", Line1);
                        command.Parameters.Add("line2", Line2);
                        command.Parameters.Add("line3", Line3);
                        command.Parameters.Add("line4", Line4);
                        command.ExecuteNonQuery();
                        command.CommandText = UtilityMethods.LoadTemplate("Resources/GetCarrierId.sql", "Carriers");
                        CarrierId = Convert.ToString(command.ExecuteScalar());
                        if (CarrierId == null)
                        {
                            //TODO
                        }

                        command.Parameters.Clear();
                        command.CommandText = command.CommandText = UtilityMethods.LoadTemplate("Resources/AddCarrierToNode.sql", "Carriers");
                        command.Parameters.Add("node", _currentNode);
                        command.Parameters.Add("rank", Convert.ToInt32(Rank));
                        command.Parameters.Add("carrierId", Convert.ToInt32(CarrierId));
                        command.ExecuteNonQuery();
                        command.Transaction.Commit();
                    }
                }

出于某种原因,CarrierId 返回 null。我能想到的唯一一件事是之前的 sql 命令的更改尚未提交。谁能告诉我你是否需要在每次执行之间提交?

【问题讨论】:

  • 既然我们看不到你的 SQL 命令是什么,你怎么知道这不是那里的问题?
  • 在 Oracle 会话中,一次提交足以保存在该提交之前完成的 DML 操作。
  • 何时提交应完全由业务逻辑决定。

标签: c# sql oracle


【解决方案1】:

这取决于...

  1. 如果您使用 ODBC 连接,您应该检查此链接的设置。默认情况下,ODBC 连接不会为每个操作请求自动提交。

  2. 我建议您在操作后随时调用“提交”。您应该在程序中实现您的业务逻辑,不要等待 ODBC 配置或其他环境中的潜在配置问题。

【讨论】:

  • Nope - "默认情况下,ODBC 事务处于自动提交模式" -msdn.microsoft.com/en-us/library/ms714549(v=vs.85).aspx
  • 对不起,我混合了sqlplus环境和ODBC设置。但是,用户/管理员可以更改它,我建议在代码中的所有关键操作之后调用“提交”。
猜你喜欢
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多