C#相当于java预编译语句

时间:2013-07-29 10:20:48

标签: c# sql oracle prepared-statement

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

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

3 个答案:

答案 0 :(得分:1)

典型的Oracle预编译语句如下所示。

(请注意,只有预准备语句中的定义具有:冒号,且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();
}

答案 1 :(得分: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文件中创建了连接字符串,演示了here

答案 2 :(得分: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()方法可以 nothing。 只有满足 IDbCommand 接口,才需要 Prepare() 方法。尽管 Oracle 具有 implemented 他们决定为本机 JDBC 接口准备功能 不反对 ADO.NET 。另一方面,发布了 ODP.NET cache 在本地重复查询,这应该有所帮助。

关于您得到的例外,我认为这与 .Prepare()。尝试没有它的相同代码,看看是否有异常 遗迹。最可能的原因是您的连接未打开, 因此无论.Prepare(),它都无法工作。