在c#中使用文本框更新CLOB

本文关键字:更新 CLOB 文本 | 更新日期: 2023-09-27 18:10:59

我在网上到处找这个,我很惊讶,我似乎找不到任何方法来做我想要的。

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

没有问题。似乎参数化是这里的问题

在c#中使用文本框更新CLOB

事实证明我是正确的,参数化是问题,但我可以说这是一个非常基本的错误。不管怎样,语句实际上运行得很好,只是参数的添加顺序乱了。

注意在下面的代码中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();
    }
}

为了无序地使用ODP . net的绑定,您需要指定这个额外的命令(更好的实践),如果您以前使用过Microsoft的提供程序,则不需要这样做。

Command.BindByName = true;

你能在评论中用> 32K测试你的更新,看看是否有错误吗?

根据我的经验,在这种情况下,可以通过将字符串转换为字符数组来写入Oracle CLOB:

String input = "string value";
OracleParameter parm = new OracleParameter("parameter_name", OracleDbType.Clob);
parm.Direction = ParameterDirection.Input;
parm.Value = input.toCharArray();

作为CLOB是一个字符大的对象。