C # Access не распознает параметры в запросе - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь написать SQL-запрос в C # для доступа.запрос отлично работает в программном обеспечении Access, но когда я пытался запустить его через C # с параметрами, я получаю исключение, что параметры отсутствуют.это как будто игнорирует параметры, которые я даю.это мой метод:

public DataTable GetRoomStatusByDate(Room RoomItem, TimeRange TimeItem, WeekDay DayItem, DateTime DateItem)
        {
            string cmdStr = "SELECT Subject, AdditionOrCancellation, Description " + 
                            "FROM (SELECT * " + 
                                "FROM TimeTables TT1 LEFT OUTER JOIN SpecialEvents SE1 " + 
                                "ON TT1.RoomNumber = SE1.RoomNumber AND TT1.StructureNumber = SE1.StructureNumber AND " +
                                "TT1.DayNumber = SE1.DayNumber AND TT1.HourNumber = SE1.HourNumber " + 
                                "UNION " + 
                                "SELECT * " + 
                                "FROM TimeTables TT2 RIGHT OUTER JOIN SpecialEvents SE2 " + 
                                "ON TT2.RoomNumber = SE2.RoomNumber AND TT2.StructureNumber = SE2.StructureNumber " + 
                                "AND TT2.DayNumber = SE2.DayNumber AND TT2.HourNumber = SE2.HourNumber) " +
                            "WHERE (TT1.RoomNumber = @TTRoomNumber OR SE1.RoomNumber = @SERoomNumber) AND (TT1.StructureNumber = @TTStructureNumber OR SE1.StructureNumber = @SEStructureNumber) " +
                            "AND(TT1.HourNumber = @TTHourNumber OR SE1.HourNumber = @SEHourNumber) AND (TT1.DayNumber = @TTDayNumber OR SE1.DayNumber = @@SEDayNumber) " +
                            "AND (SE1.EventDate = @SEEventDate OR SE1.EventDate IS NULL)";
            DataSet ds = new DataSet();
            using (OleDbCommand command = new OleDbCommand(cmdStr))
            {
                command.Parameters.AddWithValue("@TTRoomNumber", RoomItem.Number);
                command.Parameters.AddWithValue("@SERoomNumber", RoomItem.Number);
                command.Parameters.AddWithValue("@TTStructureNumber", RoomItem.Structure);
                command.Parameters.AddWithValue("@SEStructureNumber", RoomItem.Structure);
                command.Parameters.AddWithValue("@TTDayNumber", TimeItem.Number);
                command.Parameters.AddWithValue("@SEDayNumber", TimeItem.Number);
                command.Parameters.AddWithValue("@TTDayNumber", DayItem.Number);
                command.Parameters.AddWithValue("@SEDayNumber", DayItem.Number);
                command.Parameters.AddWithValue("@SEEventDate", DateItem);
                ds = GetMultipleQuery(command);
            }
            DataTable dt = new DataTable();
            try
            {
                dt = ds.Tables[0];
            }
            catch
            { }
            return dt;
        }

Я также хочу упомянуть, что я использую OLEDB, и у меня очень хорошее соединение, потому что у меня много методов с запросом и параметрами, и все они работают без проблем.это мой единственный метод с запросом, который не работает.

1 Ответ

0 голосов
/ 09 июня 2018

OleDb использует позиционные параметры, а не именованные параметры.Замените имена параметров на ? в SQL.Вы можете оставить имя параметра без изменений в AddWithValue, поскольку оно игнорируется.

...
"WHERE (TT1.RoomNumber = ? OR SE1.RoomNumber = ?) AND (TT1.StructureNumber = ? OR SE1.StructureNumber = ?) " +
"AND(TT1.HourNumber = ? OR SE1.HourNumber = ?) AND (TT1.DayNumber = ? OR SE1.DayNumber = ?) " +
"AND (SE1.EventDate = ? OR SE1.EventDate IS NULL)";

Убедитесь, что вы добавляете параметры в том же порядке, в котором они появляются в тексте SQL.

Такжезначение, переданное AddWithValue, должно иметь правильный тип.Числовая строка или строка даты не преобразуются автоматически в соответствующий числовой тип или тип DateTime.

...