Произошло необработанное исключение типа «System.Data.OleDb.OleDbException» в запросе выбора C # - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть таблица в базе данных MS Access (.mdb), в которой есть несколько столбцов.Я запустил следующий SQL-запрос, и он вернул все данные из таблицы в мое приложение C # (Visual Studio 2012 Express).

Select OperatorNo, DateTime, FuelIssued, PreviousCredit, Term 
From TransAll 
Where Term = 'Invalid'

Теперь я пытаюсь добавить дополнительные критерии в предложение where.Я пытаюсь сделать диапазон дат в имени таблицы DateTime, чтобы быть между определенным диапазоном.

Вот оператор выбора SQL, который я создал с помощью кода:

Select OperatorNo, DateTime, FuelIssued, PreviousCredit, Term 
From TransAll  
Where Term = 'Invalid' 
  And DateTime Between '2018/6/24 00:00:00' and '2018/6/30 23:59:59'

Я импортировал базу данных доступа в SQL Server Express, чтобы я мог вручную определить команду выбора SQL, а затем исправил код.Код работает в базе данных SQL Server.Но в коде C # я сейчас получаю сообщение об ошибке:

Произошло необработанное исключение типа system.data.oledb.oledbexception в system.data.dll.Дополнительная информация: Несоответствие типов данных в выражении критериев.

Вот мой код:

string tmpString = strSelectQuery + strWhereClause;
private DataSet myDS = new DataSet();
oledbDataAdapter MyAdapter = new oledbDataAdapter(tmpString, MyConnection);
MyAdapter.Fill(myDS); //this is where the error happens when I run my code
dgvResults.AutoGenerateColumns = true;
dgvResults.AutoSize = true;
dgvResults.DataSource = myDS;
dgvResults.DataMember = "Table";
dgvResults.ReadOnly = true;

if (dgvResults.RowCount == 0)
     MessageBox.Show("No Data for that Date Range/Week");

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Чтобы ваш SQL работал, используйте синтаксис Access SQL для строковых выражений для значений даты:

Select 
    OperatorNo, DateTime, FuelIssued, PreviousCredit, Term 
From 
    TransAll  
Where 
    Term = 'Invalid' 
    And 
    DateTime Between #2018/6/24 00:00:00# And #2018/6/30 23:59:59#

Но, как уже отмечалось, используйте параметры.Гораздо проще отлаживать.

0 голосов
/ 19 сентября 2018

Как уже говорилось @Plutonix, использование параметров вместо строки concat для создания вашего оператора очень поможет.Это также позволит избежать атак с использованием SQL-инъекций.

string query = "Select OperatorNo, DateTime, FuelIssued, PreviousCredit, Term from TransAll where Term = @Term And DateTime Between @Startdate and @Enddate";

var cmd = new OleDbCommand();
cmd.CommandText = query;
cmd.Connection = sqlConnection;

cmd.Parameters.Add("@Term", OleDbType.VarChar).Value = termString;
cmd.Parameters.Add("@Startdate", OleDbType.DBTimeStamp).Value = startDate; // of type date
cmd.Parameters.Add("@Enddate", OleDbType.DBTimeStamp).Value = endDate; // of type date

Таким образом, вы можете указать, где также может произойти ошибка.Пожалуйста, попробуйте избавиться от sqlconnection и т. Д.

...