0

我正在尝试将一个 clob 插入 Oracle。如果我使用 OdbcConnection 尝试此操作,它不会将数据插入数据库。它返回 1 行受影响并且没有错误,但没有任何内容插入到数据库中。

它确实适用于 OracleConnection。但是,使用 Microsoft OracleClient 会使我们的 Web 服务经常崩溃并出现 AccessViolationException(尝试读取或写入受保护的内存。这通常表明其他内存已损坏。)。当我们使用 OracleDataAdapter.Fill(dataset) 时,这种情况经常发生。因此,使用它似乎不是一种选择。

有没有办法通过 OdbcConnection 从.Net 插入/更新超过 4.000 个字符的 clob?

4

3 回答 3

1

我有一段时间没有在 .NET 平台上工作了,所以这是凭记忆的。

据我所知,OdbcConnection 的 Oracle 适配器很古老,一次不能插入/更新超过 4,000 个字符。您可以编写一个存储过程来一次传输和更新 CLOB 4,000 个字符,但这似乎是一种支持老化库的艰巨且低效的方法。

因此,MS 的 OracleConnection 可能是更好的调试途径。AccessViolationException 最常见的原因是分布式事务控制器 (msdtc.exe) 未启动,但还有许多其他潜在原因(包括硬件故障)。

在调查异常之前,需要考虑第三个连接库。Oracle 的数据访问组件 (ODAC ODP.NET),应包含在您的数据库许可中。它比 OdbcConnection 得到更好的支持,并且应该绕过 OracleConnection 的异常抛出。

于 2009-06-04T08:08:42.653 回答
1

我认为这不是 odbc 的问题,而是对 oracles 部分的限制。如果您使用 select 语句插入或更新,则不能使用超过 4000 个字符。推荐的方法是使用绑定变量和 plsql。我知道这听起来像一个非常丑陋的解决方案,但这是我迄今为止发现的全部;(。

http://www.evilcyborg.com/lounge/?ID=1245

于 2010-03-22T11:25:29.273 回答
1

在我的桌子上,我把我的 clob 变成了一个 blob。将进入表 blob 的文本转换为字节数组。然后在读取值时将字节数组转换为字符串。

//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();
于 2010-11-18T14:21:35.500 回答