Несоответствие типов данных в выражении критерия ms-access c # - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть 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 голосов
/ 13 февраля 2019

Первое, что вы должны знать, это то, что параметры в OleDbCommand обрабатываются в порядке их определения, вам нужно определять параметры в том же порядке, в каком они появляются в запросе ( OLE DB не поддерживает именованные параметры ).

Во-вторых, используйте Add() вместо AddWithValue(), указав OleDbType для каждого параметра, вы можете увидеть список типов здесь .

Вот пример правильной настройки:

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;
0 голосов
/ 13 февраля 2019

используйте ...Parameters.Add(...) вместо AddWithValue.

Без явного указания типа, как в command.Parameters.Add("@param", SqlDbType.Int);, он попытается неявно преобразовать входные данные в ожидаемые и потерпит неудачу.

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