如果SQL不返回任何内容,则将预定义的行返回到组合框中
我正在运行以下SQL查询以从数据表填充组合框 如果查询不返回任何内容,那么我想返回一个预定义的3行列表 我尝试在如果SQL不返回任何内容,则将预定义的行返回到组合框中,sql,vb.net,Sql,Vb.net,我正在运行以下SQL查询以从数据表填充组合框 如果查询不返回任何内容,那么我想返回一个预定义的3行列表 我尝试在刷新行之后以及da.fill(dt)之后插入以下内容,但它只返回空白字段 If da.fill(dt) = nothing then dt.rows.add("list1") dt.rows.add("list2") dt.rows.add("list3") end if 关于GotFocus事件的SQL代码 Private Sub Op1_GotFocus(sender As
刷新
行之后以及da.fill(dt)
之后插入以下内容,但它只返回空白字段
If da.fill(dt) = nothing then
dt.rows.add("list1")
dt.rows.add("list2")
dt.rows.add("list3")
end if
关于GotFocus事件的SQL代码
Private Sub Op1_GotFocus(sender As Object, e As EventArgs) Handles Op1.GotFocus
Dim search As String = txtUnitCode.Text
Dim da As New OleDb.OleDbDataAdapter("", "")
Dim dt As New DataTable
Dim conn As String
conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Main.aClients & ""
da.SelectCommand.Connection.ConnectionString = conn
da.SelectCommand.CommandText = "SELECT Name FROM Operations WHERE (UnitCode = " & search & ") AND (OpIsDead = False)"
da.Fill(dt)
Op1.DataSource = dt
Op1.DisplayMember = "Name"
Op1.Refresh()
End Sub
返回一个整数,该整数是您的命令检索到的行数。如果没有行,则其值为零。所以也许你应该编码
If da.fill(dt) = 0 then
dt.rows.add("list1")
dt.rows.add("list2")
dt.rows.add("list3")
end if
作为旁注,我不知道为什么要在GotFocus事件中执行这样的操作。通常情况下,对于从数据库加载数据这样的可能较慢的活动来说,这不是一个好地方
最后,我建议不要使用字符串连接来创建查询文本。即使您不必担心Sql注入,参数化查询始终是最好的解决方案
da.SelectCommand.Connection.ConnectionString = conn
da.SelectCommand.CommandText = "SELECT Name FROM Operations " & _
"WHERE (UnitCode = ?) AND (OpIsDead = False)"
da.SelectCommand.Parameters.AddWithValue("@p1", Convert.ToInt32(search))
If da.fill(dt) = 0 then
dt.rows.add("list1")
dt.rows.add("list2")
dt.rows.add("list3")
end if
太棒了,谢谢。不过,如果SQL确实从查询返回值并复制结果,那么这似乎是可行的。我目前正在将代码添加到
da.fill(dt)
行之前,但我也在之后尝试过。您好,您可以向我解释这一行da.SelectCommand.Parameters.AddWithValue(@p1),search)
我不确定“@p1”
位来自何处。它是参数的名称。在OleDb中,参数通过其在命令文本中的显示顺序(占位符)进行识别。但是,当您向任何DbCommand.Parameters集合添加参数时,您应该提供一个名称(集合的键),因此我编写了@p1
,但我可以编写任何内容,但不能尊重占位符的顺序。谢谢您,这一点更清楚。由于添加If
statement如果UnitCode
是数据库表上的整数,我们需要将search
转换为整数,才能使用AddWithValue