我正在尝试将clob插入Oracle。如果我使用OdbcConnection尝试此操作,它不会将数据插入数据库。它返回1行受影响且没有错误,但没有任何内容插入数据库。
它适用于OracleConnection。但是,使用Microsoft OracleClient会使我们的Web服务经常因AccessViolationException而崩溃(尝试读取或写入受保护的内存。这通常表明其他内存已损坏。)。当我们使用OracleDataAdapter.Fill(数据集)时,这种情况会发生很多。所以使用它似乎不是一种选择。
有没有办法从.Net使用OdbcConnection插入/更新超过4.000个字符的clobs?
答案 0 :(得分:1)
我有一段时间没有在.NET平台上工作,所以这是来自内存。
据我所知,OdbcConnection的Oracle适配器很古老,一次不能插入/更新超过4,000个字符。您可以编写一个存储过程来一次传输和更新CLOB 4,000个字符,但这似乎是支持老化库的一种艰巨而低效的方法。
因此,MS的OracleConnection可能是更好的调试途径。 AccessViolationException最常见的原因是分布式事务控制器(msdtc.exe)未启动,尽管还有许多其他可能的原因(包括有故障的硬件)。
在调查异常之前,需要考虑第三个连接库。 Oracle的DataAccess组件(ODAC ODP.NET),应包含在您的数据库许可证中。它比OdbcConnection支持得更好,并且应该绕过OracleConnection的异常抛出。
答案 1 :(得分:1)
我认为这不是odbc的问题,而是对oracles部分的限制。如果使用select语句插入或更新,则不能使用超过4000个字符。建议的方法是使用绑定变量和plsql。我知道这听起来像是一个非常难看的解决方案,但到目前为止我已经发现了它;(。
答案 2 :(得分:1)
在我的表格中,我将clob变成了blob。将进入表blob的文本转换为字节数组。然后当读取值convery字节数组tostring。
//insert code
System.Text.Encoding enc = System.Text.Encoding.ASCII;
byte[] blobByteArray = enc.GetBytes(text);
string sql = "insert into xxxxx (id,name,script_blob) values (?,?,?)";
cmd = new OdbcCommand(sql, conn);
cmd.CommandTimeout = _cmdtimeout;
cmd.Parameters.Add("id", OdbcType.VarChar);
cmd.Parameters["id"].Value = script_id;
cmd.Parameters.Add("name", OdbcType.VarChar);
cmd.Parameters["name"].Value = name;
cmd.Parameters.Add("script_blob", OdbcType.Binary);
cmd.Parameters["script_blob"].Value = blobByteArray;
int i = cmd.ExecuteNonQuery();
//read blob back from db
System.Text.Encoding enc = System.Text.Encoding.ASCII;
string sql = "select id,name,script_blob from bc_script";
cmd = new OdbcCommand(sql, conn);
cmd.CommandTimeout = _cmdtimeout;
OdbcDataReader dr2 = cmd.ExecuteReader();
if (dr2.HasRows)
{
rtn = new List<BCScript>();
while (dr2.Read())
{
string Script_text = enc.GetString((byte[])dr2["script_blob"]);
}
}
cmd.Dispose();