根据if语句中的公共变量更改sql参数

时间:2015-04-23 13:31:47

标签: sql vba if-statement

我目前正在使用sql后端的vb.net windows表单应用程序中工作。我目前在尝试精简某些代码时遇到问题。我有一个组合框到sql查询的组合框。我正在尝试为提交的选择更改设置一个事件,该事件将运行sql查询并插入一个依赖于组合框所选值的字符串。我知道一种方法,这将迫使我重复实际的sql语句6次,但我想在更短的版本中做到这一点。这是我的代码:

  Dim MachineEnd as string
        'declare machine end string
    If Combobox.SelectedValue = 5 Then
        MachineEnd = "StringA"
    ElseIf Combobox.SelectedValue = 6 Then
        MachineEnd = "StringB"
    ElseIf Combobox.SelectedValue = 7 Then
        MachineEnd = "StringC"
    ElseIf Combobox.SelectedValue = 8 Then
        MachineEnd = "StringD"
    ElseIf Combobox.SelectedValue = 18 Then
        MachineEnd = "StringE"
    ElseIf Combobox.SelectedValue = 15 Then
         MachineEnd = "StringF"
        End if

        'load quick view
        Using conn1 As New SqlConnection(connstring)
            conn1.Open()
            Using comm1 As New SqlCommand("SELECT " _
                                            & "RIGHT('0' + CAST(DATEPART(M, ColA) AS varchar), 2) " _
                                            & "+ RIGHT ('0' + Cast(DATEPART(DD, ColA) AS varchar), 2) " _
                                            & "+ RIGHT('0' + CAST(DATEPART(HH, ColA) AS varchar), 2) " _
                                            & "+ RIGHT('0' + CAST(DATEPART(MINUTE, ColA) AS varchar), 2) AS 'ColNumber', BuildOrder, TimeStamp " _
                                            & "from table1 Where Machine = @Machine AND @MachineFinish IS NULL " _
                                            & "AND Col1 IS NOT NULL", conn1)
            comm1.Parameters.AddWithValue("@Machine", CBMachine.SelectedValue)
            comm1.Parameters.AddWithValue("@MachinEFinish", MachineEnd)
            Dim dt As New DataTable
            Dim sql As New SqlDataAdapter(comm1)
            sql.Fill(dt)
            Datagridview.DataSource = dt
        End Using
            conn1.Close()
        End Using

我的问题在于“MachineEnd”变量。由于结束if语句不包括sql查询,我将在参数语句undefined中留下“MachineEnd”变量。但是,如果我移动我的结束if语句包含sql查询我将不得不复制sql语句6次,我想尝试用更少的行来做。我想我需要让MachineEnd成为公共的vapable或使用不同类型的vb.net命令,也许是一个select case语句。我这样做的原因是因为我有不同的列名称匹配stringA,stringB等等。我需要在加载datagridview时将它们声明为null。

--------------发布编辑------------------------- 做出改变以符合dan的想法。我尝试了这个,看起来它的工作,但是,我得到一个错误,说“machineEnd”变量在被赋值之前被使用,并可能导致dbnull。但是,当我运行代码并向变量添加监视时,它表示正确的字符串与变量绑定。但是我的datagridview没有正确填充。我把我的sql代码放到sql server管理工作室,代码运行正常。我不确定这是怎么回事。

-------------------编辑2 -------------------------- -------- 我发现使用addwithvalue参数语句会导致datagridview返回空白。如果我使用& MachineEnd&在我的sql语句中,代码实际上是有效的。考虑到组合框是数据绑定的,我很确定sql注入攻击是不太可能的。

1 个答案:

答案 0 :(得分:1)

您应该在IF构造之外实例化变量,以使其处于适当的范围内。然后在if语句中使用赋值语句var = "val"

Dim MachineEnd As String
    'declare machine end string
If Combobox.SelectedValue = 5 Then
    MachineEnd = "StringA"
ElseIf Combobox.SelectedValue = 6 Then
    MachineEnd = "StringB"
ElseIf Combobox.SelectedValue = 7 Then
    MachineEnd = "StringC"
...
    End if
...