【问题标题】:Data type mismatch in criteria expression ms-access c#条件表达式中的数据类型不匹配 ms-access c#
【发布时间】:2019-02-13 08:02:37
【问题描述】:

我有 MS Access 数据库有包含以下数据的表。

    TradeDate   TradeType   TicketNo    PassengerName   
    11-Feb-19   SALE         1234       ABC
    12-Feb-19   PURCHASE     0345       XYZ

我想用 TradeType 获取两个日期之间的数据,下面是我的 C# 代码

public static DataTable GetSale(DateTime FromDate, DateTime ToDate, string TradeType)
{    
    DataTable dt = new DataTable();    
    OleDbConnection con = new OleDbConnection(Utility.GetConnectionString());
    OleDbCommand cmd = new OleDbCommand("SELECT A.AgencyName, T.TradeDate, T.InvoiceNo, T.TicketNo, T.PassengerName, T.FatherName, T.TicketAmount, T.RefundAmount FROM Agencies AS A, Trade AS T WHERE T.Account_ID=A.Account_ID and T.TradeType=@TradeType And T.TradeDate>=@FromDate And T.TradeDate<@ToDate", con);
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("@FromDate", FromDate);
    cmd.Parameters.AddWithValue("@ToDate", ToDate);
    cmd.Parameters.AddWithValue("@TradeType", TradeType);
    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    con.Open();
    da.Fill(dt);
    con.Close();
}

在执行我的代码时

条件表达式中的数据类型不匹配。

抛出异常。我做错了什么?

【问题讨论】:

  • 什么是FromDateToDateTradeType?您是否传递了字符串而不是 DateTime 值?最后,请不要使用两位数的年份。这是历史上最in著名的错误。

标签: c# sql ms-access


【解决方案1】:

请使用...Parameters.Add(...) 而不是AddWithValue

如果不显式提供 command.Parameters.Add("@param", SqlDbType.Int); 中的类型,它将尝试将输入隐式转换为预期的内容,但失败了。

【讨论】:

    【解决方案2】:

    首先你应该知道OleDbCommand 中的参数是按照它们的定义顺序处理的,你需要按照它们在查询中出现的顺序来定义参数(OLE DB doesn't support named parameters)。

    其次,使用Add()而不是AddWithValue(),通过为每个参数指定OleDbType,可以看到here的类型列表。

    以下是正确设置的示例:

    OleDbConnection con = new OleDbConnection(Utility.GetConnectionString());
    OleDbCommand cmd = new OleDbCommand(@"SELECT A.AgencyName, T.TradeDate, T.InvoiceNo, T.TicketNo, T.PassengerName, T.FatherName, T.TicketAmount, T.RefundAmount 
                                        FROM Agencies AS A, Trade AS T 
                                        WHERE T.Account_ID=A.Account_ID 
                                        and T.TradeType = @TradeType And T.TradeDate >= @FromDate And T.TradeDate < @ToDate", con);
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.Add("@TradeType", OleDbType.VarWChar).Value = TradeType;
    cmd.Parameters.Add("@FromDate", OleDbType.Date).Value = FromDate;
    cmd.Parameters.Add("@ToDate", OleDbType.Date).Value = ToDate;
    

    【讨论】:

    • 参数的顺序必须与Access数据库中的表顺序一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    相关资源
    最近更新 更多