2014-10-08 4 views
0

У меня есть код INSERT, где переменная s = 4. Помощь была бы весьма оценена.Неправильный синтаксис рядом с '4'

con.Open() 
      Dim cmd As New SqlCommand("INSERT INTO Employee VALUES('" & txtfname.Text & "','" & txtmi.Text & "','" & txtlname.Text & "','" & txtssn.Text & "','" & txtbdate.Text & "','" & txtaddress.Text & "','" & cmbsex.Text.ToUpper & "','" & txtsalary.Text & "','" & DBNull.Value & "','" & s & "'", con) 
      Dim cmd1 As New SqlCommand("INSERT INTO Depndent VALUES('" & txtessn.Text & "','" & txtdepname.Text & "','" & cmbdsex.Text.ToUpper & "','" & txtdbdate.Text & "','" & txtrelationship.Text & "'", con) 

      cmd.ExecuteNonQuery() 
      cmd1.ExecuteNonQuery() 


      cleartxt() 
      con.Close() 
+0

Отсутствует скобка для клонирования после s & "') – Tushar

+0

Еще один вопрос: можно ли поместить эти две команды INSERT вместе с командой UPDATE? – user3744076

+3

http://stackoverflow.com/questions/332365/how-does-the- sql-injection-from-the-bobby-tables-xkcd-comic-work – Plutonix

ответ

2

Вы забыли закрывающий )

... l.Value & " ''" & s & "» )", кон)

1

Противоскользящий закрывающий кронштейн )

con.Open() 
      Dim cmd As New SqlCommand("INSERT INTO Employee VALUES('" & txtfname.Text & "','" & txtmi.Text & "','" & txtlname.Text & "','" & txtssn.Text & "','" & txtbdate.Text & "','" & txtaddress.Text & "','" & cmbsex.Text.ToUpper & "','" & txtsalary.Text & "','" & DBNull.Value & "','" & s & "')", con) 
1

Вы пропустили закрытие круглых скобок. Измените его, как

Dim cmd As New SqlCommand("INSERT INTO Employee VALUES('" & txtfname.Text & "','" & txtmi.Text & "','" & txtlname.Text & "','" & txtssn.Text & "','" & txtbdate.Text & "','" & txtaddress.Text & "','" & cmbsex.Text.ToUpper & "','" & txtsalary.Text & "','" & DBNull.Value & "','" & s & "')", con) 
2

недостающее закрытия Паренс является одним из меньших проблем в том, что у вас есть:

  1. трудно читать и поддерживать
  2. Она широко открыта SQL injection attacks
  3. Он предполагает, что код знает порядок, по которому уровень БД будет обслуживаться по столбцам
  4. Не отображаются одноразовые предметы, которые находятся в распоряжении
  5. Нежелательные преобразования типов данных, как представляется, происходит

лучший способ для создания 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 на входе пользователя, должна иметь (и могла иметь) место намного дальше вверх по течению.

+1

+1 Это ответ – Steve

Смежные вопросы