dibdab Ответов: 1

Может ли кто-нибудь просветить меня по этим кодам?


string sqlCM = @"INSERT INTO Cancelled_Meeting (meeting_id, date, room_id, attendees_pax, start_time, end_time)
                           (SELECT * from meeting WHERE meeting_id = {1})";
           int db = DBUtl.ExecSQL(sqlCM, TxtMeetingID.Text, TxtDate.Text, DrpRoom.SelectedValue, DrpPax.SelectedValue, ti.Value, to.Value);

           if (db == 1)
           {
               LtlMsg.Text = "Added into Cancelled Meeting";
           }
           else
           {
               LtlMsg.Text = "Error " + DBUtl.DB_Message;
           }


Что я уже пробовал:

он продолжает говорить, что "столкновение операндов, int несовместимо с датой", дело в том, что я еще не установил формат для этой даты.

j snooze

здесь недостаточно информации. очевидно, что какой-то код где-то, который не был предоставлен, пытается поместить дату, которую вы отправили, в целочисленное поле где-то.
Мы не знаем расположение таблицы cancelled_meeting или таблицы собраний. Согласно вашему SQL, все, что вам нужно, - это идентификатор встречи в качестве параметра {1}, но ваш Dbutl.Exec вы отправляете каждое значение ? Этот код вообще не имеет смысла в его нынешнем состоянии.

1 Ответов

Рейтинг:
8

OriginalGriff

Начните с того, что никогда не используйте SELECT * FROM как SQL - запрос-особенно когда вам нужен определенный порядок ваших значений. Всегда перечисляйте имена столбцов, иначе возвращаемые строки могут быть не в том порядке, в котором вы ожидаете, и тогда вы получите конфликты типов.
Попробуй:

INSERT INTO Cancelled_Meeting (meeting_id, date, room_id, attendees_pax, start_time, end_time)
SELECT meeting_id, date, room_id, attendees_pax, start_time, end_time from meeting 
WHERE ...
Но... Я беспокоюсь о том, что "{0}" в конце - это означает, что вы собираетесь объединить строки, чтобы сформировать окончательный оператор SQL в вашем методе ExecSQL, и это очень опасно - он оставляет ваш код широко открытым для SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?