【问题标题】:c# oracle sql prepared statement [duplicate]c# oracle sql准备好的语句[重复]
【发布时间】:2013-07-29 07:32:37
【问题描述】:

我正在尝试在 c# 中创建一个准备好的语句。

出于某种原因,我尝试的所有操作都以异常结束。

*。这是我现在的代码:

我得到的异常是:“由于对象的当前状态,操作无效。”

using (OracleCommand cmd = new OracleCommand())
    {
        cmd.Connection = conn;
        cmd.CommandType = CommandType.Text;

        cmd.CommandText = "insert into daily_cdr_logs " +
                "(message) " +
                "values " +
                "(:message)";

        cmd.Parameters.Add(:message, msg);
        //OracleDbType.Int32, postpaid_duration, ParameterDirection.Input);
        cmd.Prepare();
        cmd.ExecuteNonQuery();
    }
  • 我看到有人用Parameters.AddWithValue 来做这件事。但由于某种原因,我在 OracleCommand.Parameters 中找不到 AddWithValue 函数,我已经导入了 Oracle.DataAccess.Client 并且我有 oracle DataAccess 参考,使用 Visual Studio 2010。

【问题讨论】:

  • 你之前打开过连接吗?
  • 你之前没问过吗? stackoverflow.com/questions/17921492/…
  • 异常是由 Prepare 行还是 ExecuteNonQuery 行引发的?
  • 试试cmd.Parameters.Add("message", DbType.Varchar).value = msg;
  • 拳头——您的代码将无法编译,因为:message 不是有效的C# 标识符。添加参数的行应该是:cmd.Parameters.Add(":message", msg); 第二——在准备阶段注册并在准备好的查询的每次调用中提供值会更有效。

标签: c# sql oracle


【解决方案1】:

一般规则是仅在必要时打开连接,并在完成后立即关闭/处理它。连接池是自动管理的,因此打开新连接并不是一项繁重的任务。当您打开一个连接,关闭它并再次打开同一个连接时,并没有真正创建一个新的本机连接。前一个是从连接池中获取的。默认值通常很好,所以我建议在创建连接时不要传递池的东西。如果您连续执行 10 个命令,请打开一个连接,执行 10 个命令并关闭它。只有在保证他们一个接一个地执行并且您在做其他事情时不会“保持”联系时才这样做。如果您需要执行其他操作,请在执行此操作之前关闭连接。这通常会带来最佳性能。

几乎。试试:

cmd = new command(...);
cmd.parameters.Add(...)
cmd.parameters.Add(...)

然后connection.open() //执行命令并使用结果

【讨论】:

    【解决方案2】:

    在调用cmd.ExecuteNonQuery()之前需要打开连接。

    试试这个:

    cmd.Connection.Open();
    cmd.ExecuteNonQuery();
    

    【讨论】:

      【解决方案3】:

      准备命令的Sql Server版本需要

      在调用Prepare之前,指定每个参数的数据类型 拟备的声明。对于每个具有变量的参数 长度数据类型,必须将 Size 属性设置为最大大小 需要。如果不满足这些条件,Prepare 会返回错误

      因为 Prepare 命令是在 IDbCommand 类中定义并由其他 ADO.NET 类继承,我想这对于 Oracle 也是如此,因此添加以下行以将参数添加到您的命令(并确保连接是调用 Prepare 时已打开)

      cmd.CommandText = "insert into daily_cdr_logs (message) " +
                        "values (:message)";
      OracleParameter p = new OracleParameter(":message", DbType.Varchar);
      p.Size = 2000; // as a wild guess
      p.Value = msg;
      cmd.Parameters.Add(p);
      cmd.Prepare();
      cmd.ExecuteNonQuery();
      

      【讨论】:

        【解决方案4】:

        试试这个方法:

        using (OracleCommand cmd = new OracleCommand())
            {
                cmd.Connection = conn;
                cmd.CommandType = CommandType.Text;
        
                cmd.CommandText = "insert into daily_cdr_logs " +
                        "(message) " +
                        "values " +
                        "(:message)";
        
                 OracleParameter pMsg = new OracleParameter("message",OracleDbType.Varchar2);
                    pMsg.Value = msg;
        
                 cmd.Parameters.Add(pMsg);
        
                //OracleDbType.Int32, postpaid_duration, ParameterDirection.Input);
                cmd.Prepare();
                cmd.ExecuteNonQuery();
            }
        

        【讨论】:

        • DbType.Varchar;不存在,可能是 oracledbtypes?
        • @susparsy 也许是Varchar2?我编辑了答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-16
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 2016-05-01
        • 2021-06-24
        • 1970-01-01
        相关资源
        最近更新 更多