【问题标题】:How to solve incorrect syntax in sql如何解决sql中的语法错误
【发布时间】:2016-05-16 12:14:37
【问题描述】:

我正在使用此代码

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,我将如何解决这个问题?

【问题讨论】:

  • 您实际上没有正确实施它。查找Prepared Statements的教程
  • @juergen d。请把链接发给我。
  • 只是谷歌:prepared statements example vb
  • 查看this other SO question (and its answers!) 了解第一眼。您正在使用 parameters - 这很好 - 但您没有在 INSERT 语句中使用它们! (这非常糟糕)
  • @将 values 子句中的字符串连接替换为参数名称:VALUES(@AdmissionNumber, @FullName,...)。用于INSERT 的实际值将是参数值。

标签: sql-server vb.net


【解决方案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 注入攻击,很好地处理带有撇号的名称,而且它也会更快! (如果您多次执行相同的插入)

【讨论】:

  • 注意这一行:cmd.Parameters.Add("AnyOtherInformation", SqlDbType.NVarChar).Value = Rtbx1.Text 在参数名称定义中缺少@
  • np。当我发布我的时没有看到你的答案,只有在发布之后。因为它基本上是一样的,所以我删除我的并支持你的。
  • Zohar av 注意到缺少的@。 Av 还向 Marc_S 记录了你的绅士行为。 @Marc_s,竖起大拇指。
  • @StudentPhoto);"; 应该是@StudentPhoto)"
  • @HenryGathigira:实际上,以; 结束您的SQL 语句是良好做法 - 所以分号是故意,并且它也应该在那里
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多