我目前正在使用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注入攻击是不太可能的。
答案 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
...