在vb.net中使用多个复选框为SQL语句生成字符串
我目前正在使用SQL后端和vb.net Windows窗体前端。我试图根据用户将选择的复选框列表从SQL中提取报告 为此,我将在SQL中使用在vb.net中使用多个复选框为SQL语句生成字符串,sql,vb.net,string,if-statement,Sql,Vb.net,String,If Statement,我目前正在使用SQL后端和vb.net Windows窗体前端。我试图根据用户将选择的复选框列表从SQL中提取报告 为此,我将在SQL中使用IN子句。唯一的问题是,如果我在vb.net中使用if语句来构建字符串,那么设置字符串将需要大量的代码 我希望有人知道更好的方法。下面的代码示例仅显示选择第1行,同时选择第1行和第2行。我需要的代码能够选择任何种类的行。字符串必须是行号,行号后面必须有逗号。这样,当我在SQL查询中包含代码时,它就不会出现bug 代码如下: Dim LineString As
IN
子句。唯一的问题是,如果我在vb.net中使用if语句来构建字符串,那么设置字符串将需要大量的代码
我希望有人知道更好的方法。下面的代码示例仅显示选择第1行,同时选择第1行和第2行。我需要的代码能够选择任何种类的行。字符串必须是行号,行号后面必须有逗号。这样,当我在SQL查询中包含代码时,它就不会出现bug
代码如下:
Dim LineString As String
'String set up for line pull
If CBLine1.Checked = False And CBLine2.Checked = False And CBLine3.Checked = False And CBLine4.Checked = False And _
CBLine7.Checked = False And CBLine8.Checked = False And CBLine10.Checked = False And CBLine11.Checked = False And CBLine12.Checked = False Then
MsgBox("No lines selected for download, please select lines for report.")
Exit Sub
End If
If CBLine1.Checked = True And CBLine2.Checked = False And CBLine3.Checked = False And CBLine4.Checked = False And _
CBLine7.Checked = False And CBLine8.Checked = False And CBLine10.Checked = False And CBLine11.Checked = False And CBLine12.Checked = False Then
MsgBox("This will save the string as only line 1")
ElseIf CBLine1.Checked = True And CBLine2.Checked = True And CBLine3.Checked = False And CBLine4.Checked = False And _
CBLine7.Checked = False And CBLine8.Checked = False And CBLine10.Checked = False And CBLine11.Checked = False And CBLine12.Checked = False Then
MsgBox("This will save the string as only line 1 and 2")
End If
最后一个字符串必须插入如下所示的SQL语句:
SELECT *
FROM tabl1
WHERE LineNumber IN (-vb.netString-)
上面的代码需要在字符串中添加逗号。我觉得我对你的问题只了解一半,但我希望这能有所帮助。在VB.net中,我们显示状态为enabled或disabled的表单列表 有一个复选框,选中时仅显示启用的表单
SELECT * FROM forms WHERE (Status = 'Enabled' or @checkbox = 0)
查询实际上有一个较长的where子句,它以相同的方式处理下拉选项。这将帮助您将后端VB传递给一个简单的SQL语句。首先,您需要设置所有复选框,将Tag属性设置为它们所引用的行号。因此,例如,CBLine1复选框将其属性标记设置为值1(对于所有其他复选框如此)
If checkboxes 3...10 = false then
If checkbox 1 = true then
If checkbox 2 is true then
A
Else if checkbox 2 = false then
B
End if
Else
C
End if
这可以使用WinForm designer轻松完成,如果您愿意,也可以在运行时在Form load事件中完成
下一步是检索所有选中的复选框并提取Tag属性以构建所需行的列表。这可以使用一些Linq来完成
Dim linesSelected = new List(Of String)()
For Each chk in Me.Controls.OfType(Of CheckBox)().
Where(Function(c) c.Checked)
linesSelected.Add(chk.Tag.ToString())
Next
现在,您可以开始验证输入
if linesSelected.Count = 0 Then
MessageBox.Show("No lines selected for download, please select lines for report.")
Else If linesSelected.Count = 1 Then
MessageBox.Show("This will save the string only for line " & linesSelected(0))
Else
Dim allLines = string.Join(",", linesSelected)
MessageBox.Show("This will save the string for lins " & allLines)
End If
当然,List(字符串)和String.Join方法也非常适合为查询构建IN子句为什么一次选中所有复选框?如果您通过逐个连续检查每个控件的状态来动态构造结果字符串会怎么样?@RuslanGaripov这样您的说法就有了一个公共字符串,并在复选框更改事件中更改它?否。您可以根据需要重新生成要注入到
where
子句的字符串。用户单击复选框后,您的代码将重建字符串并将其传递给SQL命令。@RuslanGaripov好的,我会尝试一下,但是如何在不运行一百万条if语句的情况下重建字符串呢。如中所示,如何说如果line1.checked=true,则将其添加到字符串中;如果line2.checked=true,则将其添加到字符串中;如果未选中,则如何删除它?不幸的是,我对VB编码没有丰富的经验,但我将尝试解释。假设您有结果字符串:Dim sz As string
。您可以检查第一个复选框的状态:如果(cb1.checked),然后“添加到sz#1”
。然后检查第二个控件的状态,如下所示:“if(cb2.checked)Then”addtosz#2“。等等别忘了删除结果字符串末尾的尾随“,”。我不确定状态是如何工作的。我不熟悉你说的话。让我试一试,这似乎正是我想要的。这似乎在不添加sql语句的情况下工作,但我对代码的工作原理有点困惑。我将不得不对函数和标记代码如何工作进行一些研究。非常感谢steve。中的Linq For Each means,给我一个checkbox类型的控件序列,然后在此序列上应用WHERE方法,并仅使用该方法返回true的复选框过滤序列。WHERE方法在每个复选框上运行匿名函数,该函数逐个接收复选框,如果复选框被选中,则返回true;否则返回false。