【问题标题】:What's wrong with this SQL Insert statement of mine?我的这个 SQL 插入语句有什么问题?
【发布时间】:2016-11-30 19:39:52
【问题描述】:

我正在尝试向我的表中添加一条记录,但是在它尝试这样做之后我遇到了异常。我能够成功打开连接,(我的第一个消息框出现)但之后我得到了异常。这是我的代码:

Private Sub btnUpdateInfo_Click(sender As Object, e As EventArgs) Handles btnUpdateInfo.Click
    Dim con As New SqlConnection
    Dim cmd As New SqlCommand
    con = New SqlConnection("Data Source=localhost\SQLEXPRESS;Initial Catalog=CISDB;Integrated Security=SSPI;")
    Try
        cmd.CommandText = "INSERT INTO customers (FirstName,LastName) VALUES (txtFirstName.Text, txtLastName.Text)"
        cmd.Connection = con
        con.Open()
        MsgBox("Connection Open ! ")
        cmd.ExecuteNonQuery()
        MsgBox("Record inserted")
        con.Close()
    Catch ex As Exception
        MsgBox("Error!")
    End Try
End Sub

【问题讨论】:

  • 使用参数将值传递到语句中。
  • 您是否想为名字插入文字“txtFirstName.Text”令人怀疑。使用 SQL 参数。删除 Try/Catch - 它隐藏了您的重要信息
  • 幸运的是,这对您来说失败了。它失败了,因为您试图插入字符串文字而不是值。但是,您需要在此处使用参数,而不是像这样添加文本框值,因为它容易受到 sql 注入的影响。正如已经提到的那样,catch 是一个可怕的设计。它几乎比一个空的捕获更好。您知道发生了错误,但由于您没有记录或提供任何有用的信息,因此您无法知道发生了什么。
  • @SeanLange 实际上它失败了,因为 SQL 不知道符号 txtFirstName.TexttxtLastName.Text。它们不是查询中的字符串文字,因此如果 . 将其抛出,它将抛出未知符号错误或语法错误。
  • @DStanley - 实际上它是一个字符串文字,当传递给 sql 引擎时会失败。我们在这里说同样的话。幸运的是,在鲍比桌拜访他们之前,它失败了。 :D

标签: sql .net sql-server vb.net


【解决方案1】:

对于未来的读者 - Sql 参数将为您和您的同事节省大量时间。

Private Sub btnUpdateInfo_Click(sender As Object, e As EventArgs) Handles btnUpdateInfo.Click
    Dim connString = "Data Source=localhost\SQLEXPRESS;Initial Catalog=CISDB;Integrated Security=SSPI;"
    Using connection As New SqlConnection(connString)
        Using command As New SqlCommand(connection)
            command.CommandText = "INSERT INTO customers (FirstName,LastName) VALUES (@FirstName, @Lastname)"
            Dim params As SqlParameter() =
            {
                New SqlParameter With { .ParameterName = "@FirstName", .SqlDbType.VarChar, .Value = txtFirstName.Text },
                New SqlParameter With { .ParameterName = "@LastName", .SqlDbType.VarChar, .Value = txtLastName.Text },
            }
            command.Parameters.AddRange(params)
            connection.Open() 
            command.ExecuteNonQuery()
            ' Inserted
        End Using
    End Using
End Sub 

try.. catch 也是如此(正如 @Plutonix 在 cmets 中注意到的那样)——如果你会得到“真正的”异常,你会更快地找到原因和解决方案

【讨论】:

  • OP 在这里-谢谢!我摆脱了 try/catch,然后我能够看到实际的错误消息并诊断出我的问题。我现在将开始学习许多人建议的参数——这是一个很好的例子。现在一切正常,把 try/catch 放回去是个好习惯吗?
  • @SamLev - 为什么要放置 try... catch 块?
【解决方案2】:

您需要查看异常消息 (ex.Message) 以了解问题所在...如果您遇到类似于 multipart identifier 的错误,请尝试使用此查询字符串而不是您当前的查询字符串进行快速测试。

    cmd.CommandText = "INSERT INTO customers (FirstName,LastName) VALUES ('" & txtFirstName.Text & "', '" & txtLastName.Text & "')"

检查参数化查询,如前所述

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 2019-12-11
    • 2011-08-28
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多