чтение атрибутов со специальными именами из MS ACCESS в OleDbDataReader

У меня есть некоторые проблемы с чтением из базы данных accdb, когда она имеет имена полей с такими символами, как «-», «%», «/» или если имя поля «Уровень». Когда у меня есть что-то вроде этого:

string mySelectQuery = "SELECT 'Part_Time_%','Level',Level_change_reason FROM Employees";
OleDbConnection myConnection = new OleDbConnection(oledbConnectString);
OleDbCommand myCommand = new OleDbCommand(mySelectQuery,myConnection);
myConnection.Open();
OleDbDataReader myReader = myCommand.ExecuteReader();

это работает хорошо, потому что символы '' отменяют специальные символы и значение слова. Хорошо:

if ((myReader["Name"] == DBNull.Value) ....
if ((myReader["Surname"] == DBNull.Value) ....

Но когда я пытаюсь это:

if ((myReader["Macro-activity"] == DBNull.Value) ...
if ((myReader["Level"] == DBNull.Value)....

он переходит к оператору catch. Я также пробовал myReader["\u004cevel"], myReader["'Macro-activity'"] - он полностью игнорирует escape-символы.

Каждый ответ будет очень признателен.

P.S.: Не могу изменить название атрибутов.


person matej148    schedule 28.05.2012    source источник


Ответы (2)


Для экранирования имен столбцов в Access используются фигурные скобки, [ & ], а не одинарные кавычки.

string mySelectQuery = "SELECT '[Part_Time_%],[Level],Level_change_reason FROM Employees";

Одинарные кавычки предназначены для строки, поэтому наличие «Уровня» в операторе выбора вернет текст «Уровень» в качестве безымянного столбца в вашем наборе результатов. Если вы попробуете myReader.GetItem(1), он вернет "Level" для каждой строки.

person shf301    schedule 29.05.2012
comment
Спасибо за ответ, но оператор SELECT работает очень хорошо, но этот myReader[Macro-activity] и этот myReader[Level] терпят неудачу. Впервые я использовал этот myReader.GetItem(1), но когда ячейка была пустой, это не удалось. Поэтому я использую это myReader[Local_Global_Structure] == DBNull.Value для управления. Есть ли здесь myReader.GetItem(1) возможность сделать этот контроль? - person matej148; 29.05.2012
comment
myReader[[Macro-activity]] — это то, что вам нужно - person Micah Armantrout; 29.05.2012
comment
Когда я удаляю оператор catch, IndexOutOfRange не обрабатывается. - person matej148; 29.05.2012

Я нашел это, и он делает то, что я хочу:

if ((myReader.GetValue(18) == DBNull.Value) || string.Compare(myReader.GetValue(18).ToString(), "0") == 0)....
person matej148    schedule 29.05.2012