2009-06-04 109 views
0

我试图在Oracle中插入clob。如果我使用OdbcConnection尝试此操作,它不会将数据插入到数据库中。它返回1行受影响,没有错误,但没有插入到数据库中。使用ODBC将clobs插入到oracle

它与一个OracleConnection工作。但是,使用Microsoft OracleClient会使我们的Web服务经常崩溃,并出现AccessViolationException(试图读取或写入受保护的内存,这通常表示其他内存已损坏)。当我们使用OracleDataAdapter.Fill(dataset)时,会发生这种情况。所以使用这似乎不是一种选择。

有什么办法来插入带有.NET的更多然后4.000字符与OdbcConnection /更新的CLOB?

+0

你可以发布你正在使用? – 2009-06-04 08:02:42

回答

1

我没有工作在一段时间在.NET平台上,所以这是从内存。

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

因此,MS的的OracleConnection可能是调试更好的路径。 AccessViolationException通常是由分布式事务控制器(msdtc.exe)未启动引起的,尽管还有许多其他潜在原因(包括错误的硬件)。

之前调查之外,还有第三个连接库来考虑。 Oracle的DataAccess组件(ODAC ODP.NET),应包含在您的数据库许可证中。它比OdbcConnection更好地支持,并且应该绕过OracleConnection的异常抛出。

+0

我现在已经与甲骨文ODP.NET尝试过了,它似乎工作的代码。我想试试存储过程也会尝试。任何示例? – Carra 2009-06-04 09:38:31

1

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

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

+0

此处的链接已损坏... – LThode 2015-02-03 22:37:30

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();