2013-08-13 2 views
0

Я пытаюсь получить данные CLOB через ODP.NET. Моя проблема в том, что reader.GetValue (i) .ToString() может возвращать только до 4000 символов, а остальная часть данных усекается. Если я использую reader.GetOracleClob (1) .Value Я получил ошибку «Указанный приведение недействителен».Как получить Oracle Clob более 4000 символов ODP.NET

Любая идея, что я пропустил? Я использую ODP.NET 4.0

Ниже мой код.

using (OracleConnection oConn = new OracleConnection()) 
{ 
    oConn.ConnectionString = pConnstr; 
    oConn.Open(); 
    using (OracleCommand oCmd = new OracleCommand("select varchar_column, clob_column from test", oConn)) 
    { 
    oCmd.InitialLOBFetchSize = -1; 
    string key, value, value1; 
    var rd = oCmd.ExecuteReader(); 
    while (rd.Read()) 
    { 
     if (rd.IsDBNull(1)) { value = ""; } 
     else 
     { 
     key = rd.GetValue(0).ToString(); 
     value = rd.GetValue(1).ToString(); // unable to get more than 4000. 
     value1 = rd.GetOracleClob(1).Value; // Specified cast is not valid. 
     } 
    } 
    } 
} 

я нашел в Oracle Doc, что когда свойство InitialLOBFetchSize устанавливается в ненулевое значение, GetOracleBlob, GetOracleClob, GetOracleBlobForUpdate и GetOracleClobForUpdate напечатал методы доступа отключены. Это может помочь объяснить, почему я получил ошибку «Указанный приведение недействителен».

Однако я все еще не могу получить данные за пределами 4000.

Я пробовал различные комбинации, задокументированные здесь http://docs.oracle.com/cd/E11882_01/win.112/e18754/featData.htm#autoId6 Но не повезло.

ответ

1

На самом деле код работает правильно и получает данные, которые он должен получить. Я просто не понимал, что мои данные неполны и, похоже, были проблемой поиска при первом взгляде. Сожалею.

Следующий код является хорошим.

using (OracleConnection oConn = new OracleConnection()) 
{ 
    oConn.ConnectionString = pConnstr; 
    oConn.Open(); 
    using (OracleCommand oCmd = new OracleCommand("select varchar_column, clob_column from test", oConn)) 
    { 
    oCmd.InitialLOBFetchSize = -1; 
    string key, value; 
    var rd = oCmd.ExecuteReader(); 
    while (rd.Read()) 
    { 
     if (rd.IsDBNull(1)) { value = ""; } 
     else 
     { 
     key = rd.GetValue(0).ToString(); 
     value = rd.GetValue(1).ToString(); 
     } 
    } 
    } 
} 
Смежные вопросы