我在C#下访问ORACLE数据库。 读取数据。其中有个字段TEMP是CLOB类型。读取完后。发现有些记录的TEMP这个字段的值没有读取过来。请问下是为什么。我在网上找了下。有的说是CLOB存储的容量。在读取过来时超出了SQL的大小出现了问题。我对ORACLE不熟。请大家指点下。  如果能 给出 关于 CLOB类型的 读写方式更好。谢谢

解决方案 »

  1.   

    /// <summary>
            /// 读取 Oracle Blob 到文件中。
            /// </summary>
            /// <param name="idData">id 值</param>
            /// <param name="fileName">文件名</param>
            /// <param name="id">id 键</param>
            /// <param name="blob">blob 键</param>
            /// <param name="tableName">表名</param>
            public void ReadBlob(int idData,string fileName, string id, string blob, string tableName)
            {
                string connString = "server=oratest;User ID=kttest;Password=test";
                using(conn = new OracleConnection(connString))
                {
                    try
                    {
                        conn.Open();
                        OracleCommand cmd = conn.CreateCommand();                    // 利用事务处理(必须)
                        OracleTransaction transaction = cmd.Connection.BeginTransaction();
                        cmd.Transaction = transaction;                    // 获得 OracleLob 指针
                        string sql = "select " + blob + " from " + tableName + " where " + id + " = " + idData;
                        cmd.CommandText = sql;
                        OracleDataReader dr = cmd.ExecuteReader();
                        dr.Read();
                        OracleLob tempLob = dr.GetOracleLob(0);
                        dr.Close();                    // 读取 BLOB 中数据,写入到文件中
                        FileStream fs = new FileStream(fileName,FileMode.Create);
                        int length = 1048576;
                        byte[] Buffer = new byte[length];
                        int i;
                        while((i = tempLob.Read(Buffer,0,length)) > 0)
                        {
                            fs.Write(Buffer,0,i);
                        }
                        fs.Close();
                        tempLob.Clone();
                        cmd.Parameters.Clear();                    // 提交事务
                        transaction.Commit();
                    }
                    catch(Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        conn.Close();
                    }
                }
            }
      

  2.   

      OracleDataReader   reader   =   command.ExecuteReader();   
                      using(reader)   
                      {   
                              OracleLob   BLOB   =   reader.GetOracleLob(1)   
                              byte[]   buffer   =   System.Text.Encoding.Unicode.GetBytes(Content);   
                              if   (buffer.Length   <   BLOB.Length)   
                              {   
                                      BLOB.SetLength(buffer.Length)   
                              }   
                              BLOB.Write(buffer,0,buffer.Length);   
                              bReturn   =   true;   
                      }