选择查询C#中发生类型为'System.Data.OleDb.OleDbException'的未处理异常

时间:2018-09-18 23:16:12

标签: c# ms-access oledb

我在MS Access数据库(.mdb)中有一个表,该表中有一堆列。我运行了以下SQL查询,它将表中的所有内容都返回给了我的C#应用​​程序(Visual Studio 2012 Express)。

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

现在,我正在尝试向where子句添加更多条件。我试图在表名称DateTime上做一个日期范围,使其介于特定范围之间。

这是我通过代码创建的SQL select语句:

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 select命令,然后修复代码。该代码正在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 :(得分:0)

正如@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等。

答案 1 :(得分:0)

要使您的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#

但是,如上所述,请使用参数。调试起来容易得多。