我正在尝试在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();
}
答案 0 :(得分:3)
一般规则是仅在必要时打开连接,并在完成后立即关闭/处置它。连接池是自动管理的,因此打开新连接并不是一项繁重的任务。当您打开连接,关闭它并再次打开相同的连接时,实际上并未创建新的本机连接。前一个是从连接池中获取的。默认值通常很好,所以我建议在创建连接时不要传递池内容。如果您连续执行10个命令,请打开连接,执行10个命令并关闭它。只有当他们被保证一个接一个地被执行并且在做其他事情时你没有“坚持”连接时才这样做。如果您需要执行其他操作,请在执行此操作之前关闭连接。这通常会带来最佳性能。
几乎。尝试:
cmd = new command(...);
cmd.parameters.Add(...)
cmd.parameters.Add(...)
然后connection.open()
//执行命令并使用结果
答案 1 :(得分:0)
在致电cmd.ExecuteNonQuery()
之前,需要先打开连接。
试试这个:
cmd.Connection.Open();
cmd.ExecuteNonQuery();
答案 2 :(得分: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();
}
答案 3 :(得分:0)
准备命令的Sql Server版本需要
在致电Prepare之前,请指定每个参数的数据类型 要准备的声明。对于每个具有变量的参数 长度数据类型,必须将Size属性设置为最大大小 需要。如果不满足这些条件,准备就会返回错误
因为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();