MS Access Query "ГДЕ" Исключение - PullRequest
       1

MS Access Query "ГДЕ" Исключение

1 голос
/ 24 сентября 2010

Я пишу приложение на C #, которое считывает информацию из файла .mdb, используя пространство имен System.Data.OleDb. Таблица, из которой я читаю, содержит информацию об образце (номер, индекс, дата и т. Д.). Число и дата являются обязательными записями, когда новый элемент добавляется в таблицу, но индекс является необязательным, поэтому некоторые образцы не имеют индекса. Я могу просто выполнить запрос, используя следующий код:

string id = "99";
OleDbConnection myConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\...\Database\data.mdb");
myConnection.Open();
OleDbCommand myCommand = myConnection.CreateCommand();
myCommand.CommandText = "SELECT SampNo, Index, DateTime FROM Sample WHERE SampNo=" + id;
OleDbDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
    Console.WriteLine("\t{0}\t{1}\t{2}", myReader["SampRef"], myReader["Index"], myReader["DateTime"]);
}

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

myCommand.CommandText = "SELECT SampNo, Index, DateTime FROM Sample WHERE Index=" + id;

Но когда я запускаю его, он генерирует исключение OleDbException в строке "myCommand.ExecuteReader ()", которая говорит "Несоответствие типов данных в выражении критериев".

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

Ответы [ 3 ]

4 голосов
/ 24 сентября 2010

Является ли поле Index числом или текстовым полем?

Если это текстовое поле, вам нужно сделать следующее:

myCommand.CommandText = "SELECT SampNo, Index, DateTime FROM Sample WHERE Index='" + id + "'";

Вместо этого вам лучше использовать параметризованный запрос, поскольку это открывает вам проблемы с индексами, содержащими апострофы, или, что еще хуже, атаками с использованием инъекций.

2 голосов
/ 24 сентября 2010

Index и DateTime являются зарезервированными словами. Если имена полей (столбцов) действительно существуют, вы должны, даже должны, заключить их в квадратные скобки ([]) и попытаться изменить их при первой же возможности.

2 голосов
/ 24 сентября 2010

Ошибка «Несоответствие типов данных в выражении критериев» означает, что в запросе имеется тип данных, который не соответствует типу поля.

Если поле имеет тип Text (и произнесите егосодержит цифры), и у вас был запрос:

SELECT * FROM myTable WHERE myField=2;

... вы получите эту ошибку.вам придется запускать его с кавычками вокруг числа:

SELECT * FROM myTable WHERE myField='2';

Обратный случай (поиск текста в поле типа Number) выдаст вам ту же ошибку.

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