0

我用这个在网上到处都是,我很惊讶我似乎找不到任何方法来做我正在寻找的东西。

Oracle.DataAccess.Client在我的 C# 项目中使用该库,而不是已弃用的库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# 程序中,我希望允许用户保存评论。对于这个例子,我删除了任何复杂的东西。

我在表单上有一个按钮和一个名为“评论”的文本框。

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

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

4

3 回答 3

1

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

Command.BindByName=true;

您可以在评论中使用 > 32K 测试您的更新以查看它是否出错?

于 2014-01-16T14:34:32.040 回答
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();
    }
}
于 2013-04-26T19:18:51.340 回答
0

根据我的经验,可以通过将字符串转换为具有以下内容的字符数组来在此上下文中写入 Oracle CLOB:

String input = "string value";

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

因为 CLOB 是一个字符大对象。

于 2014-05-27T14:51:42.963 回答