странная проблема с OdbcDataReader.GetBoolean (), бросая приведение не является допустимым исключением для столбца bool - PullRequest
0 голосов
/ 17 июля 2009

Хорошо, этот сводит меня с ума. У меня есть таблица в базе данных PostgreSQL, и я пытаюсь получить значение логического столбца для конкретной записи с помощью OdbcDataReader.GetBoolean (int col).

Проблема в том, что GetBoolean () продолжает выдавать приведение недопустимого исключения, даже если тот же код работал всего несколько дней назад. Что еще более странно, один и тот же код прекрасно работает в другой форме.

Единственным изменением, внесенным в предыдущую рабочую версию моего приложения, было добавление столбца в таблицу. Тем не менее, индекс столбца, который мне нужен, не изменился. О да, получение значения с помощью GetValue () и последующий вызов GetType () для результата возвращает System.String, а значения true / false переводятся в 1/0.

У меня нет идей.

Ответы [ 3 ]

0 голосов
/ 17 июля 2009

Хотя я до сих пор не знаю, что является причиной этого исключения, мне удалось найти работающий код (а не реальный код из моего приложения):

val1 = reader.GetInt32(0);
val2 = reader.GetBoolean(4);
val3 = reader.GetBoolean(8);

Это, однако, не:

val3 = reader.GetBoolean(8);
val1 = reader.GetInt32(0); // causes invalid cast exception
val2 = reader.GetBoolean(4);

Очевидно, порядок столбцов как-то связан с этим.

0 голосов
/ 05 ноября 2010

Я столкнулся с той же проблемой, на самом деле это было из-за неправильного приведения, который я имел в SP, которому я звонил ...

В сохраненном процессе

declare @colA INT -- should have been a float!!!
set @colA = select someValue from someTable

select @someVar, someColumn
from someOtherTable

 //the line below works, even though it should have the SQL datatype is FLOAT
 _someVar = reader[2] != DBNull.Value ? reader.GetDouble[2] : 0;
  //the following line blows up w/invalid cast exception, even though it is correct
 _someColumn = reader[3] != DBNull.Value ? reader.GetBoolean[3] : false;
0 голосов
/ 17 июля 2009

Я не думаю, что передача System.String в GetBoolean () будет работать для вас - как вы можете видеть из своего исключения, вы получаете InvalidCastException, что означает, что внутри себя где-то он пытается сделать что-то подобное :

string s = "true";
bool b = (bool)s;

Это явно не сработает.

Если вы видите, что ODBC передает вам обратно System.String, вы хотите использовать либо Convert.ToBoolean (), bool.TryParse (), либо bool.Parse, в зависимости от того, что именно лучше всего подходит для остальных ваш код.

Что касается того, почему он работал, а теперь нет - кто-то еще изменил базовый тип данных в поле базы данных на символьный тип?

Этот шаблон используется для получения логических данных из OdbcDataReader:

data.Gender = reader["Gender"] == DBNull.Value ? 
    false : Convert.ToBoolean(reader["Gender"]);

Трудоемко, да. Но это хорошо работает для нас. Основной базой данных для этого кода является Access (тип поля «да / нет») или MS SQL Server (тип поля «бит»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...