我正在尝试在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:“由于对象的当前状态,操作无效。”
答案 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()
,它都无法工作。