Я не думаю, что передача 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 (тип поля «бит»).