我正在使用此代码
cn.Open()
Using cmd As New SqlClient.SqlCommand("INSERT INTO Students(AdmissionNumber, FullName, DOBirth, Class_Stream, DateAdmitted, Gender, County, KCPEYear, KCPEIndex, Phone1, Phone2, PostalAddress, PostalCode, Town, EmailAddress, AnyOtherInformation, StudentPhoto) VALUES ('" & Tbx12.Text & "','" & Tbx30.Text & "','" & Tbx4.Text & "','" & Tbx31.Text & "','" & Tbx13.Text & "','" & Cbx1.SelectedItem & "','" & Cbx2.SelectedItem & "','" & Cbx4.SelectedItem & "','" & Tbx15.Text & "','" & Tbx6.Text & "','" & Tbx7.Text & "','" & Tbx8.Text & "','" & Tbx9.Text & "','" & Tbx10.Text & "','" & Tbx11.Text & "','" & Rtbx1.Text & "',@StudentPhoto)", cn)
cmd.Parameters.Add("@AdmissionNumber", SqlDbType.NVarChar).Value = Tbx12.Text
cmd.Parameters.Add("@FullName", SqlDbType.NVarChar).Value = Tbx30.Text
cmd.Parameters.Add("@DOBirth", SqlDbType.NVarChar).Value = Tbx4.Text
cmd.Parameters.Add("@Class_Stream", SqlDbType.NVarChar).Value = Tbx31.Text
cmd.Parameters.Add("@DateAdmitted", SqlDbType.NVarChar).Value = Tbx13.Text
cmd.Parameters.Add("@Gender", SqlDbType.NVarChar).Value = Cbx1.Text
cmd.Parameters.Add("@County", SqlDbType.NVarChar).Value = Cbx2.Text
cmd.Parameters.Add("@KCPEYear", SqlDbType.NVarChar).Value = Cbx4.Text
cmd.Parameters.Add("@KCPEIndex", SqlDbType.NVarChar).Value = Tbx15.Text
cmd.Parameters.Add("@Phone1", SqlDbType.NVarChar).Value = Tbx6.Text
cmd.Parameters.Add("@Phone2", SqlDbType.NVarChar).Value = Tbx7.Text
cmd.Parameters.Add("@PostalAddress", SqlDbType.NVarChar).Value = Tbx8.Text
cmd.Parameters.Add("@PostalCode", SqlDbType.NVarChar).Value = Tbx9.Text
cmd.Parameters.Add("@Town", SqlDbType.NVarChar).Value = Tbx10.Text
cmd.Parameters.Add("@EmailAddress", SqlDbType.NVarChar).Value = Tbx11.Text
cmd.Parameters.Add("AnyOtherInformation", SqlDbType.NVarChar).Value = Rtbx1.Text
cmd.Parameters.Add(New SqlClient.SqlParameter("@StudentPhoto", SqlDbType.Image)).Value = IO.File.ReadAllBytes(a.FileName)
i = cmd.ExecuteNonQuery
End Using
将数据保存到SQL Server。我怀疑我得到的错误是因为在Textbox30,Combobox2和Textbox10可以包含带有撇号的用户输入。例如。 Murang'a,Ndung'u,我将如何解决这个问题?
答案 0 :(得分:1)
基本上,你的问题是你连接你的INSERT
语句(这是一个非常糟糕的实践 - 打开了SQL注入攻击的大门 - 仍然#1 攻击网络!),而在下面的语句中,您实际上是在添加参数(以上INSERT
查询中不存在的参数..... )。
所以将代码更改为:
cn.Open()
' use INSERT statement *WITH* parameters!
Dim insertQry as string =
"INSERT INTO Students(AdmissionNumber, FullName, DOBirth, Class_Stream, DateAdmitted, Gender, County, " &
"KCPEYear, KCPEIndex, Phone1, Phone2, PostalAddress, PostalCode, Town, EmailAddress, AnyOtherInformation, StudentPhoto) " &
"VALUES (@AdmissionNumber, @FullName, @DOBirth, @Class_Stream, @DateAdmitted, @Gender, @County, " &
"@KCPEYear, @KCPEIndex, @Phone1, @Phone2, @PostalAddress, @PostalCode, @Town, " &
"@EmailAddress, @AnyOtherInformation, @StudentPhoto);";
Using cmd As New SqlClient.SqlCommand(insertQry, cn)
cmd.Parameters.Add("@AdmissionNumber", SqlDbType.NVarChar).Value = Tbx12.Text
cmd.Parameters.Add("@FullName", SqlDbType.NVarChar).Value = Tbx30.Text
cmd.Parameters.Add("@DOBirth", SqlDbType.NVarChar).Value = Tbx4.Text
cmd.Parameters.Add("@Class_Stream", SqlDbType.NVarChar).Value = Tbx31.Text
cmd.Parameters.Add("@DateAdmitted", SqlDbType.NVarChar).Value = Tbx13.Text
cmd.Parameters.Add("@Gender", SqlDbType.NVarChar).Value = Cbx1.Text
cmd.Parameters.Add("@County", SqlDbType.NVarChar).Value = Cbx2.Text
cmd.Parameters.Add("@KCPEYear", SqlDbType.NVarChar).Value = Cbx4.Text
cmd.Parameters.Add("@KCPEIndex", SqlDbType.NVarChar).Value = Tbx15.Text
cmd.Parameters.Add("@Phone1", SqlDbType.NVarChar).Value = Tbx6.Text
cmd.Parameters.Add("@Phone2", SqlDbType.NVarChar).Value = Tbx7.Text
cmd.Parameters.Add("@PostalAddress", SqlDbType.NVarChar).Value = Tbx8.Text
cmd.Parameters.Add("@PostalCode", SqlDbType.NVarChar).Value = Tbx9.Text
cmd.Parameters.Add("@Town", SqlDbType.NVarChar).Value = Tbx10.Text
cmd.Parameters.Add("@EmailAddress", SqlDbType.NVarChar).Value = Tbx11.Text
cmd.Parameters.Add("@AnyOtherInformation", SqlDbType.NVarChar).Value = Rtbx1.Text
cmd.Parameters.Add("@StudentPhoto", SqlDbType.Image).Value = IO.File.ReadAllBytes(a.FileName)
i = cmd.ExecuteNonQuery
End Using
然后你应该没问题 - 安全地防止SQL注入攻击,使用撇号处理名称非常好,而且它也会更快! (如果多次执行相同的插入)