J_Mohan Ответов: 2

Как я могу использовать более одного условия в предложении WHERE в команде UPDATE?


Привет друзья,

Я построил синтаксис в соответствии с предложением с несколькими критериями WHERE, но он отображает следующее сообщение об ошибке:

Синтаксическая ошибка ( отсутствует операция ) в выражении запроса 'Sap_No = 142 и где MNT = Jan и где YR = 2018'

Что такое проблема с синтаксисом и кто ее исправляет ?

Я попробовал сделать следующее:

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

Частная суб BtnSave_Click(отправителя как объект, а равно EventArgs) обрабатывает значок btnsave.Нажмите
'*******************************************************************************************
BtnSave.Enabled = False : Dbconnection.Close() : Dbconnection.Открыть()
'LEN = LvMasterAdapter.Fill(MasterDataSet, "LeaveMaster")

Dim DesInd As Integer : Dim MN, YRR As String
LvMasterReader = LvMasterCmd.Метода executereader()


LvMasterReader.Читать()

Если LvMasterReader("Mnt") = CmbMonth.Текст И LvMasterReader("Yr") = CmbYear.Text И LvMasterReader("SAP_No") = TxtSapID.Тогда Текст
MN = CmbMonth.Текст : YRR = CmbYear.Text
DesInd = LvMasterReader("DesigIndex")

Если LvMasterReader("LeaveStatus") = "N", То

LvMasterCmd.Свойства commandtext = "обновление LeaveMaster набор Sap_No= @Sap_No, From_Date= @From_Date, даты=@даты, LeaveType=@LeaveType, дн=@дней, LeaveStatus=@LesveType где Sap_No=" &амп; Кинт(TxtSapID.Текст) & "и где МНТ=" &амп; &амп млн; "а где УГ=" &амп; У год


Попробуй
LvMasterCmd.Параметры.AddWithValue("@Sap_No", CInt(TxtSapID.Text))
LvMasterCmd.Параметры.AddWithValue("@From_Date", DtpFrom.Value)
LvMasterCmd.Параметры.AddWithValue("@To_Date", DtpTo.Value)
LvMasterCmd.Параметры.AddWithValue ("@LeaveType", CmbLeaveType.Text)
LvMasterCmd.Параметры.AddWithValue ("@Days", LblDays.Text)
LvMasterCmd.Параметры.AddWithValue ("@MNT", CmbMonth.Text)
LvMasterCmd.Параметры.AddWithValue("@YR", CmbYear.Text)
LvMasterCmd.Параметры.AddWithValue("@LeaveStatus", "Y")


LvMasterReader.Закрывать()

LvMasterCmd.Метод executenonquery()
LvMasterCmd.Параметры.Четкий()
Выход Из Субмарины
Поймать ex как исключение
Ящик для сообщений.Показать(напр.сообщение)
Конец Попытки
Конец, Если

Конец Подводной Лодки

2 Ответов

Рейтинг:
2

Jochen Arndt

Прочитать о SQL (здесь WHERE пункт). Общий синтаксис таков

WHERE <search_condition>
где условие поиска может быть комбинацией с использованием AND или OR и NOT.

Таким образом, ваш SQL-оператор должен содержать что-то вроде
WHERE ap_No = 142 AND MNT = Jan AND YR = 2018

Связанные чтения (здесь для T-SQL):
Где (Transact-SQL) | Microsoft Docs[^]
Условие поиска (Transact-SQL) | Microsoft Docs[^]


J_Mohan

Спасибо Друзья,

Я исправил синтаксис в соответствии с вашим предложением :

LvMasterCmd.Свойства commandtext = "LeaveMaster обновить набор Sap_No= @Sap_No, From_Date= @From_Date, даты=@даты, LeaveType=@LeaveType, дн=@дней, LeaveStatus=LesveType" &амп@;
"Где Sap_No=" &амп; Кинт(TxtSapID.Текст) & "и МНТ=" &амп; &амп млн; "и yr=" &амп; У год

Но он показывает "несоответствие типа данных i критерию выражения"

Я тщательно проверил тип поля таблицы datatype и преобразовал его в Integer перед операцией ExecuteNonQuery (), пока он не покажет сообщение об ошибке.

Что и где неверный шаг? пожалуйста, проводите.

Jochen Arndt

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

Однако в вашем первоначальном вопросе значение месяца было передано как "Jan", которое является строкой. Такие строки должны быть переданы в кавычки, если они хранятся в виде таких строк в базе данных, или преобразованы в соответствующее целое число в противном случае.

Рейтинг:
1

OriginalGriff

Попробуй:

UPDATE LeaveMaster SET Sap_No= @Sap_No, From_Date= @From_Date, To_Date=@To_Date, LeaveType=@LeaveType, Days=@Days, LeaveStatus=@LesveType WHERE Sap_No= " & CInt(TxtSapID.Text) & " AND MNT= " & MN & " AND YR= " & YRR

Но ... не делай этого.
Вы явно знаете, как использовать параметризованные запросы, так зачем же бросать туда конкатенацию строк и оставлять себя широко открытым для SQL-инъекций?

Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки 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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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


J_Mohan

Спасибо за ответ друзья,

Но я не хочу удалять таблицу, я просто хочу найти конкретную запись в таблице и обновить ее значениями параметров. Теперь я изменил свой синтаксис обновления следующим образом:

LvMasterCmd.Свойства commandtext = "LeaveMaster обновить набор Sap_No= @Sap_No, From_Date= @From_Date, даты=@даты, LeaveType=@LeaveType, дн=@дней, LeaveStatus=LesveType" &амп@;
"Где Sap_No=" &амп; Кинт(TxtSapID.Текст) & "и МНТ=" &амп; &амп млн; "и yr=" &амп; У год

Но я получаю сообщение об ошибке "несоответствие типа данных в выражении критериев". Я тщательно проверил поля таблицы и преобразовал параметр в целое число перед командой ExecuteNonQuery ().Пока он не покажет ошибку.

Что и где неверный шаг ? Пожалуйста, проводите.

OriginalGriff

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