недостающее закрытия Паренс является одним из меньших проблем в том, что у вас есть:
- трудно читать и поддерживать
- Она широко открыта SQL injection attacks
- Он предполагает, что код знает порядок, по которому уровень БД будет обслуживаться по столбцам
- Не отображаются одноразовые предметы, которые находятся в распоряжении
- Нежелательные преобразования типов данных, как представляется, происходит
лучший способ для создания SQL для длинного запроса, который обращается к 1, 2 и 3 что-то вроде этого:
' an XML literal
Dim SQL = <sql>
INSERT INTO Employee
(FirstName, LastName, SocSecNum, BirthDate,
Address, Gender
...)
VALUES
(@firstN, @lastN, @SSN ...)
</sql>
Using cmd As New SqlCommand(sql.Value, con)
...
cmd.Parameters.AddWithValue("@firstN", txtfname.Text)
cmd.Parameters.AddWithValue("@lastN", txtlname.Text)
...
cmd.ExecuteNonQuery()
...
End Using ' disposes of the object when done
Даже если INSERT INTO tablename VALUES ...
является юридический синтаксис, он предполагает, что ваш db будет иметь столбцы в некотором порядке и что он не изменится при изменении db. Вышеуказанный метод явно отображает параметры в столбцы на основе порядка столбцов и заполнителей параметров. Имена («@firstN») позволяют вам узнать, с какими значениями вы работаете.
Использование XML буквальным позволит вам макет текста, однако он наиболее читаемым к вам, но даже строковым может быть проще читать и поддерживать, чем конкатенация:
Dim strSQL As String = "INSERT INTO Employee (FirstName, LastName, SocSecNum, " _
& "BirthDate, Address, Gender ..." _
& " VALUES (@p1, @p2...)"
При использовании любого метода, то недостающие парнеры в ОП были бы гораздо более очевидными и менее вероятно, что они вообще произошли. Далее, некоторые столбцы, как представляется, числовая, такие как зарплата и BirthDate, поэтому SQL, такие как это может быть неправильно:
... & "','" & txtbdate.Text & "','" & txtsalary.Text & "','" ...
Размещение клещей вокруг значение гарантирует, что вы передаете строку в dbLayer. Если Зарплата - это числовая колонка, а DateOfBirth - столбец даты - как и должно быть - тогда вы можете получить ошибку несоответствия типа данных. Параметры облегчают передать правильный тип данных, потому что вы можете увидеть, что вы работаете с:
cmd.Parameters.AddWithValue("@DOB", CDate(txtbdate.Text))
cmd.Parameters.AddWithValue("@Salary", CDec(txtsalary.Text))
(Примечание, при использовании OleDB, параметры просто ординала, поэтому обязательно AddWithValue
в том же порядке, как указано в SQL).Проходя неправильный тип данных может привести к dblayer сделать некоторые предположения, чтобы избежать этого вы можете сделать это длинный путь:
cmd.Parameters.Add("@firstN", SqlDbType.VarChar, 32) ' 32 = column def
cmd.Parameters("@firstN").Value = txtfname.Text
Еще один вопрос заключается в том, что код не выполнять какие-либо проверки данных. Что делать, если они набирают «Мне нравится пирог» в качестве зарплаты? Или введите «02/31/1986» (мм/дд) для BirthDate? Ваш код столкнется с этой процедурой. Таким образом, проверка данных с использованием таких вещей, как DateTime.TryParse
и Integer.TryParse
на входе пользователя, должна иметь (и могла иметь) место намного дальше вверх по течению.
Отсутствует скобка для клонирования после s & "') – Tushar
Еще один вопрос: можно ли поместить эти две команды INSERT вместе с командой UPDATE? – user3744076
http://stackoverflow.com/questions/332365/how-does-the- sql-injection-from-the-bobby-tables-xkcd-comic-work – Plutonix