条件表达式MS-Access C#中的数据类型不匹配

时间:2019-02-13 08:02:38

标签: c# sql ms-access

我有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();
}

在执行我的代码时

  

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

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

2 个答案:

答案 0 :(得分:2)

请使用...Parameters.Add(...)代替AddWithValue

没有显式提供command.Parameters.Add("@param", SqlDbType.Int);中的类型,它将尝试将输入隐式转换为期望的输入,并且失败。

答案 1 :(得分:1)

您应该知道的第一件事是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;