如何使用 C# 和 Oracle Data Access Client 更新带有长字符串的 Oracle CLOB 列
How to update Oracle CLOB column with long string using C# and Oracle Data Access Client
我正在尝试使用包含电子邮件 HTML 内容的长字符串更新数据库中的 CLOB 列。我遇到问题的记录中有 18,000 个字符。
如果我将 html 变量设置为 "short string",下面的代码将起作用。但是,如果我尝试 运行 具有 18,000 长字符 HTML 字符串的代码,我会收到此错误:"Oracle.DataAccess.Client.OracleException ORA-22922: nonexistent LOB value ORA-02063: preceding line from ((servername))"
public static void UpdateHtmlClob(string html, string taxId,string un, string pw)
{
using (OracleConnection conn = new OracleConnection())
{
try
{
conn.ConnectionString = "User Id=" + un + ";Password=" + pw + ";Data Source=server.com;";
conn.Open();
OracleCommand cmd = new OracleCommand();
string indata = html;
cmd.CommandText = "UPDATE table1 SET HTML_BODY = :clobparam";
OracleParameter clobparam = new OracleParameter("clobparam", OracleDbType.Clob, indata.Length);
clobparam.Direction = ParameterDirection.Input;
clobparam.Value = indata;
cmd.Parameters.Add(clobparam);
cmd.Connection = conn;
cmd.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
conn.Close();
}
}
}
在您编辑代码以反映我的回答之前,我看到您的代码存在两个问题。
首先,您需要在命令文本中使用冒号来告诉 Oracle clobparam
是绑定变量,而不是列名:
cmd.CommandText = "UPDATE table1 SET HTML_BODY = :clobparam";
其次,您没有在命令的任何位置设置数据库连接。该命令应使用哪个连接?在您的情况下,您只有一个连接,但更一般地说,可能会打开多个连接。添加行
cmd.Connection = connection;
或者使用
创建命令
OracleCommand cmd = connection.CreateCommand();
当然,如果 Oracle.DataAccess 返回一条错误消息,让您稍微暗示这是您做错了什么,那就太好了。
无论如何,既然你已经编辑了你的问题以包含关键细节 ORA-02063: preceding line from ((servername))
,它告诉我们你正在使用数据库 link,我真正能做的就是回应我评论中写道:直接连接远程数据库传输LOB数据,不要使用数据库link.
我正在尝试使用包含电子邮件 HTML 内容的长字符串更新数据库中的 CLOB 列。我遇到问题的记录中有 18,000 个字符。
如果我将 html 变量设置为 "short string",下面的代码将起作用。但是,如果我尝试 运行 具有 18,000 长字符 HTML 字符串的代码,我会收到此错误:"Oracle.DataAccess.Client.OracleException ORA-22922: nonexistent LOB value ORA-02063: preceding line from ((servername))"
public static void UpdateHtmlClob(string html, string taxId,string un, string pw)
{
using (OracleConnection conn = new OracleConnection())
{
try
{
conn.ConnectionString = "User Id=" + un + ";Password=" + pw + ";Data Source=server.com;";
conn.Open();
OracleCommand cmd = new OracleCommand();
string indata = html;
cmd.CommandText = "UPDATE table1 SET HTML_BODY = :clobparam";
OracleParameter clobparam = new OracleParameter("clobparam", OracleDbType.Clob, indata.Length);
clobparam.Direction = ParameterDirection.Input;
clobparam.Value = indata;
cmd.Parameters.Add(clobparam);
cmd.Connection = conn;
cmd.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
conn.Close();
}
}
}
在您编辑代码以反映我的回答之前,我看到您的代码存在两个问题。
首先,您需要在命令文本中使用冒号来告诉 Oracle clobparam
是绑定变量,而不是列名:
cmd.CommandText = "UPDATE table1 SET HTML_BODY = :clobparam";
其次,您没有在命令的任何位置设置数据库连接。该命令应使用哪个连接?在您的情况下,您只有一个连接,但更一般地说,可能会打开多个连接。添加行
cmd.Connection = connection;
或者使用
创建命令 OracleCommand cmd = connection.CreateCommand();
当然,如果 Oracle.DataAccess 返回一条错误消息,让您稍微暗示这是您做错了什么,那就太好了。
无论如何,既然你已经编辑了你的问题以包含关键细节 ORA-02063: preceding line from ((servername))
,它告诉我们你正在使用数据库 link,我真正能做的就是回应我评论中写道:直接连接远程数据库传输LOB数据,不要使用数据库link.