Оператор SQL Oracle LONG не получен из БД - PullRequest
0 голосов
/ 27 февраля 2012

Я обращаюсь к базе данных Oracle из приложения .NET.Структура моего кода выглядит следующим образом:

using (OracleConnection conn = new OracleConnection(Oradb))
{
  conn.Open();

  string sql = "SELECT RI_DESCRIPTION 
                  FROM RI_RISK 
                 WHERE RI_CODE = 'GAIL'";
  OracleCommand cmd = new OracleCommand(sql, conn);
  cmd.CommandType = CommandType.Text;

  OracleDataReader dr = cmd.ExecuteReader();
  dr.Read();

  var result = dr.GetString(0);

  Assert.AreEqual("Golden Arches Insurance", result);
}

Теперь я не могу заставить этот оператор что-либо возвращать - assert fails, result = "";

Но я могу получить этот операторчтобы вернуть ожидаемое:

string sql = "SELECT CLI_ABBRNAME 
                FROM CLI_CLIENT 
               WHERE CLI_CLIENTNUMBER = 00404";

Я несколько раз проверял правильность имен таблиц и столбцов.Единственное отличие, которое я вижу, это типы данных:

  • RI_DESCRIPTION - это LONG
  • RI_CODE - это VARCHAR2
  • CLI_CLIENTNUMBER - это VARCHAR2
  • CLI_ABBRN2 - это VI

Следовательно, есть ли что-то, что я должен делать с LONG, которого я не делаю в коде?

Кроме того, CLI_CLIENTNUMBER действительно VARCHAR2, почему бы мне неМне нужны одиночные апострофы около 00404 в выражении, тогда как для RI_CODE, который является VARCHAR2, мне (очевидно) нужны апострофы вокруг 'GAIL' (в противном случае я получаю исключение Invalid Identifier?

** EDIT

Оператор отлично работает на SQL Plus

** РЕДАКТИРОВАТЬ - РЕШЕНИЕ

Хитрость, следуя ссылке в ответе, состояла в том, чтобы установить для объекта OracleCommand InitialLONGGetchSize значение -1. ​​

1 Ответ

1 голос
/ 27 февраля 2012

Во-первых, вы не должны использовать LONG.Вы должны преобразовать это поле в CLOB.LONG устарели.

Если вы используете ODP.NET, я нашел это в "Получение данных LONG и LONG RAW" .Похоже, что параметр InitialLONGFetchSize изначально установлен в 0, и вам нужно увеличить его, чтобы получить LONG.

И, ну, технически вам нужны кавычки, но так как вы сравниваете свой столбецпротив числа, я думаю, что есть неявное преобразование.То, что вы делаете, эквивалентно:

SELECT CLI_ABBRNAME 
  FROM CLI_CLIENT 
 WHERE TO_NUMBER(CLI_CLIENTNUMBER) = 404
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...