【问题标题】:Command text was not set未设置命令文本
【发布时间】:2017-11-07 14:43:46
【问题描述】:

您好,我遇到了一个错误,指出当我尝试添加数据时没有设置命令文本。

 Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click    
        Try
            connString = (dbsource)
            myConnection.ConnectionString = connString
            myConnection.Open()
            Dim str As String    
            str = "Add [Bill] set [Log_ID] =  ' " & TextBox2.Text & " ' where [Bill_ID] = " & TextBox1.Text & " " 
            Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
        Catch err As Exception
            MsgBox(err.Message)    
        End Try
        Try
            Dim str As String
            Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
            cmd.ExecuteNonQuery()
            cmd.Dispose()
            myConnection.Close()
            TextBox1.Clear()
            TextBox2.Clear()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try 
    End Sub

【问题讨论】:

  • 您的第一个命令已创建但从未执行。您的第二个命令使用空字符串,str 被创建,然后在下一行立即用作命令文本,而没有将其值设置为任何 sql,因此出现“未设置命令文本”错误。
  • 那里有很多错误。永远不要将值连接到 SQL 的字符串中,使用 DB 参数; Add 不是有效的 SQL;当 IDE 像这样缩进时,它会创建一个新的block level scope,所以这两个块正在使用新的变量;处理你的命令。我不知道你在用Add [Bill]...做什么

标签: sql .net vb.net


【解决方案1】:

该代码中有两个 Try/Catch 块。每个 Try/Catch 块都有名为 str 和 cmd 的变量。但是,它们是两个不同 str 变量和两个不同 cmd 变量。每个 Try/Catch 块都定义了自己的范围,并且仅在新范围中重新声明具有相同名称的新变量不会为该变量赋予与先前范围中相同的值。

这里还有一些其他内容表明您可能有使用过 vb6/vbscript 时代代码的经验,或者有使用过旧代码经验的讲师。 VB.Net 是一种全新的动物,具有新的语言习语。你想要更多这样的东西:

'Separate your Database code from your user interface code
Public Sub SetBillLogItem(LogID As String, BillID As String)
    'Don't bother with Try/Catch in this method.
    'Let exceptions bubble up to be handled in the presentation layer

    ' What database are you using? "Add" isn't valid SQL
    ' Also, notice how this string is a constant.
    Dim sql As String = "Add [Bill] set [Log_ID] = ? where [Bill_ID] = ? "

    'Using block guarantees the connection is closed properly even if an exception is thrown
    ' Also, .Net **strongly** prefers you to create a new connection object for most DB operations
    Using cn  As New OleDbConnection(dbsource), _
          cmd As New OleDBCommand(sql, cn)

        'ALWAYS use parameters to set values for your SQL. 
        'Guessing a parameter type and length here, you might want Integer instead
        cmd.Parameters.Add("LogId", OleDbType.VarWChar, 10).Value = LogId
        cmd.Parameters.Add("BillID", OleDbType.VarWChar, 10).Value = BillID

        cn.Open()
        cmd.ExecuteNonQuery()
        'No need to call cn.Close(), Using block takes care of this for us in a safer way
    End Using
End Sub

Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click    
    Try
        SetBillLogItem(TextBox2.Text, TextBox1.Text)
    Catch err As Exception
        MsgBox(err.Message)    
    End Try 
End Sub

再一次没有我所有额外的 cmets,所以你可以看到这并不比你已经拥有的更多代码:

Public Sub SetBillLogItem(LogID As String, BillID As String)
    Dim sql As String = "Add [Bill] set [Log_ID] = ? where [Bill_ID] = ? "
    Using cn  As New OleDbConnection(dbsource), _
          cmd As New OleDBCommand(sql, cn)

        cmd.Parameters.Add("LogId", OleDbType.VarWChar, 10).Value = LogId
        cmd.Parameters.Add("BillID", OleDbType.VarWChar, 10).Value = BillID

        cn.Open()
        cmd.ExecuteNonQuery()
    End Using
End Sub

Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click    
    Try
        SetBillLogItem(TextBox2.Text, TextBox1.Text)
    Catch err As Exception
        MsgBox(err.Message)    
    End Try 
End Sub

【讨论】:

  • Add 不是一个有效的 SQL 命令,应该建议使用Update,如查询所示,他想更新。
  • 是的,这在该代码行上方的 cmets 中有所指示,但我只是在评论中停下来,因为我没有排除 OLE 提供程序可能连接到一些不太常见的类型的想法使用 ADD 语句进行 upserts 的 DB。
  • 我也看到了,你刚刚指出"Add" isn't valid SQL。但你不建议使用Update。否则你的回答会产生另一个错误。
  • 清楚地解释了为什么 sql 语法没有被改变,而且这个答案的质量远不及被描述为值得投反对票here
猜你喜欢
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2021-05-19
  • 2021-02-16
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
相关资源
最近更新 更多