c#oracle-sql准备语句

本文关键字:语句 c#oracle-sql | 更新日期: 2023-09-27 18:25:17

我正试图在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,并使用visual studio 2010进行了Oracle DataAccess引用

c#oracle-sql准备语句

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

差不多。尝试:

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

则CCD_ 1//执行命令并使用结果

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

试试这个:

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

Sql Server版本的Prepare命令需要

在调用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();

试试这个方法:

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();
    }