2013-04-26 34 views
0

我一直在这个网络上,我很惊讶,我似乎无法找到任何方法来做我想要的。使用C中的文本框更新CLOB#

我使用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"; 

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

+0

重复? http://stackoverflow.com/questions/4902250/insert-blob-in-oracle-database-with-c-sharp – gustavodidomenico 2013-04-26 16:54:38

+0

这个问题是处理“BLOB”数据类型,“CLOB”通常是用于字符。与BLOB不同的方法可能来自文件流,因为我的文本来自文本框。 – Rakshasas 2013-04-26 16:57:00

+0

愚蠢的问题,午餐和会议可以做什么,这是惊人的。这个问题是否应该被删除或者是否有足够的价值来帮助未来的某个人? – Rakshasas 2013-04-26 19:20:40

回答

0

事实证明我是正确的参数化是问题,但我可以说这是一个非常基本的错误。无论如何,该声明实际上运行得非常好,但参数却被无序添加。

注意如何在下面的代码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

当comments.Text.Length> 32k个字符时,这是否工作?我怀疑它不会。这个答案依赖于varchar2到clob的隐式转换,在超过varchar2数据类型的PL/SQL最大长度后,该clob会崩溃。 – 2013-05-14 03:41:30

+0

这很不幸。在我的特殊实现中,超过100个字符的可能性不大,但我需要记下这个问题并处理它。谢谢你的信息。 – Rakshasas 2013-05-14 13:18:37

0

为了使用无序的ODP .NET的结合,需要指定这个额外的命令(更好的做法)如果你以前使用过微软的提供者,这并不是必需的。

Command.BindByName = true;

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

0

从我的经验一个Oracle CLOB可以通过一个字符串转换为字符阵列具有以下被写入到在这种情况下:

String input = "string value"; 

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

为CLOB是字符大对象。