3

我正在尝试在 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();
}

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

4

3 回答 3

2

典型的 Oracle 准备好的语句如下所示。

(注意只有prepared statement中的定义有:冒号,cmd.Parameters.AddWithValue调用中的没有)

String msg = "something here";

using (OracleConnection con = new OracleConnection(...insert connection params here...))
{
  con.Open();
  OracleCommand cmd = con.CreateCommand();
  cmd.CommandType = CommandType.Text;
  cmd.CommandText = @"
        insert into daily_cdr_logs
        (message) 
        values 
        (:message)";
  cmd.Parameters.AddWithValue("message", msg);
  cmd.ExecuteNonQuery();
}
于 2013-07-29T10:37:26.267 回答
0

我建议这样做:

//create a connection
string conString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionName"].ConnectionString;
OracleConnection con = new OracleConnection(conString);

//create SQL and insert parameters
OracleCommand cmd = new OracleCommand("insert into daily_cdr_logs (message) values (:_message)", con);
cmd.Parameters.Add(new OracleParameter("_message", msg));

    try
    {
        //if connection is closed, open it
        if (con.State == ConnectionState.Closed)
             con.Open();

             //execute query
             cmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
         //do something with the error
    }
    finally
    {
         //if connection is open, close it
         if (con.State == ConnectionState.Open)
         con.Close();
    }

我已经在我的 web.config 文件中创建了我的连接字符串,在这里演示。

于 2013-11-06T07:51:34.463 回答
0

首先,您的代码将无法编译,因为:message它不是有效的 C#标识符。添加参数的行应该是:

cmd.Parameters.Add(":message", msg);

第二——在准备阶段注册参数效率更高:

par = cmd.CreateParameter();
par.ParameterName = ":message";
cmd.Parameters.Add( par ); 

并在准备好的查询的每次调用中提供值:

cmd.Parameters[i].Value = message;

如果您跟踪您的参数,并且

cmd.Parameters[":message"].Value = message;

如果你不这样做。

第三——ODP.NET中 的Prepare()方法什么都不做。它只是为了满足IDbCommand接口,需要一个 方法。令人遗憾的是,尽管Oracle已经 为本地JDBC接口实现 了准备功能,但他们决定不针对ADO.NET反对它。另一方面,ODP.NET被宣传为 在本地缓存 重复查询,这应该会有所帮助。Prepare()

至于你得到的异常,我认为它与 .Prepare(). 在没有它的情况下尝试相同的代码,看看异常是否仍然存在。最可能的原因是您的连接未打开,因此无论.Prepare().

于 2020-10-23T17:15:27.437 回答