我一直在网上玩这个,我很惊讶我似乎无法找到任何办法去做我想找的东西。
我在我的C#项目中使用Oracle.DataAccess.Client
库,不已弃用的System.Data.OracleClient.
我有一个非常简单的表格:
CREATE TABLE testing (
ID NUMBER(10),
COMMENTS CLOB,
DATECREATED DATE DEFAULT (SYSDATE) NOT NULL,
DATEMODIFIED DATE
);
INSERT INTO testing (ID, COMMENTS) VALUES(1, 'this is a test');
以上显然效果很好。问题是,这是一个评论字段,它将被更改。在我的C#程序中,我想允许用户保存评论。对于这个例子,我删除任何复杂的东西。
我在表单和文本框上有一个名为“comments”的按钮。
using (OracleConnection connection = new OracleConnection(<VALID CONN STRING GOES HERE>)) {
connection.Open();
using (OracleCommand command = new OracleCommand()) {
command.Connection = connection;
command.CommandText = "UPDATE testing SET COMMENTS = :COMMENTS, DATEMODIFIED = sysdate WHERE ID = :ID";
command.CommandType = CommandType.Text;
command.Parameters.Add("ID", OracleDbType.Int32, ParameterDirection.Input).Value = 1;
command.Parameters.Add("COMMENTS", OracleDbType.Clob, ParameterDirection.Input).Value = comments.Text;
command.ExecuteNonQuery();
}
}
所以基本上这个代码只要我不尝试编写Clob就可以工作。如果我保存修改日期,则按预期创建。但是当我用Clob保存时,没有任何反应。没有来自oracle的错误消息,没有例外,没有。
如果我放弃参数化并以错误的方式执行:
command.CommandText = "UPDATE testing SET COMMENTS = " + comments.Text + ", DATEMODIFIED = sysdate";
没有问题。看来参数化是这里的问题。
答案 0 :(得分:1)
事实证明我是正确的,因为参数化是个问题,但我可以说这是一个非常基本的错误。无论如何,该声明实际上运行得非常好,但参数是无序添加的。
注意最后添加以下代码ID,因为它是最后一个参数(where子句。)
using (OracleConnection connection = new OracleConnection(<VALID CONN STRING GOES HERE>)) {
connection.Open();
using (OracleCommand command = new OracleCommand()) {
command.Connection = connection;
command.CommandText = "UPDATE testing SET COMMENTS = :COMMENTS, DATEMODIFIED = sysdate WHERE ID = :ID";
command.CommandType = CommandType.Text;
command.Parameters.Add("COMMENTS", OracleDbType.Clob, ParameterDirection.Input).Value = comments.Text;
command.Parameters.Add("ID", OracleDbType.Int32, ParameterDirection.Input).Value = 1;
command.ExecuteNonQuery();
}
}
答案 1 :(得分:1)
为了使用ODP .NET的无序绑定,您需要指定此额外命令(更好的做法)如果您以前使用过Microsoft的提供程序,则不需要这样做。
Command.BindByName = TRUE;
您可以使用&gt;测试更新吗?评论中是否有32K,看是否有错误?
答案 2 :(得分:0)
根据我的经验,通过将String转换为具有以下内容的字符数组,可以在此上下文中编写Oracle CLOB:
String input = "string value";
OracleParameter parm = new OracleParameter("parameter_name", OracleDbType.Clob);
parm.Direction = ParameterDirection.Input;
parm.Value = input.toCharArray();
因为CLOB是一个字符大对象。