使用C#中的文本框更新CLOB

时间:2013-04-26 16:50:45

标签: c# oracle11g clob

我一直在网上玩这个,我很惊讶我似乎无法找到任何办法去做我想找的东西。

我在我的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";

没有问题。看来参数化是这里的问题。

3 个答案:

答案 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是一个字符大对象。