代码之家  ›  专栏  ›  技术社区  ›  Carra

使用ODBC将CLOB插入Oracle

  •  0
  • Carra  · 技术社区  · 15 年前

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

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

    有没有办法用ODBCConnection从.NET中插入/更新超过4000个字符的CLOB?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Andrew Champion    15 年前

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

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

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

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

        2
  •  1
  •   takrl cck    13 年前

    在我的桌子上,我把我的衣服改成了一团。将进入表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();
    
        3
  •  1
  •   Tim Cooper    13 年前

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

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