5

我正在尝试在 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。
4

4 回答 4

3

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

几乎。尝试:

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

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

于 2013-07-29T13:30:38.200 回答
0

试试这个方法:

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();
    }
于 2013-07-29T13:29:00.583 回答
0

Prepare命令的Sql Server版本需要

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

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

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();
于 2013-07-29T13:31:30.980 回答
0

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

尝试这个:

cmd.Connection.Open();
cmd.ExecuteNonQuery();
于 2013-07-29T13:24:43.103 回答