我正在尝试创建一个从数据库加载项目的系统。有两个组合框; combobox1从数据库表1和combox2加载项目,从数据库表2加载项目。
两个表都在同一个数据库中。
以下是我尝试但是当我运行系统时出现此错误:
(从字符串“SELECT * FROM dbo.Dishes”转换为“Long”类型无效。)
以下是我正在使用的代码:
Dim connection As New SqlConnection("Server = DESKTOP-1373H91; Initial Catalog = MealPreOrderSystem; Integrated Security = True")
connection.Open()
Dim query As String = "SELECT * FROM dbo.Dishes" And "SELECT * FROM dbo.Desserts"
Dim cmd As SqlCommand
cmd = New SqlCommand(query, connection)
Dim reader As SqlDataReader
reader = cmd.ExecuteReader
While reader.Read
cbxType.Items.Add(reader.Item("MealName"))
cbxType.Items.Add(reader.Item("DessertName"))
End While
connection.Close()
答案 0 :(得分:1)
在VB.NET中,AND
是一个运算符。它用于在Boolean
或Integers/Doubles/any numeric expression
之间执行连接。让我们以query
字符串为例:
Dim query As String = "SELECT * FROM dbo.Dishes" And "SELECT * FROM dbo.Desserts"
您在这里使用AND
加入2个句子/字符串,这些句子/字符串不会产生任何结果,而是试图将其转换为Long
。
尝试在SQL中执行此命令,您将找不到任何运气:(。
您的陈述是正确的:
SELECT * FROM dbo.Dishes
SELECT * FROM dbo.Desserts
但是你试图实现目标的方式是错误的:(。
要将数据库中的数据导入组合框,您可以使用两个组合框和分离的SQL查询/ SQL命令,或者您可以使用一个组合框从两个数据库中添加数据但是将它们分开逗号,
示例可能如下所示:
使用一个组合框
Dim cmd1 as new SqlCommand("SELECT * FROM dbo.Dishes",connection)
Dim dr as SqlDatareader = cmd1.ExecuteReader
While dr.Read
mycombo1.Items.Add(dr(0)) ' Here 0 is the column count,change it as required
End while
Dim cmd2 as new SqlCommand("SELECT * FROM dbo.Desserts",connection)
Dim dr2 as SqlDatareader = cmd2.ExecuteReader
While dr2.Read
mycombo2.Items.Add(dr2(0)) ' Here 0 is the column count,change it as required
End while
使用1个组合框
这里有点复杂。首先,你需要从第一个dataReader收到的数据中填充你的组合框。然后,当第二个datareader正在读取数据时,你需要更新{{的现有数据/项。 1}}保留现有数据/项目,但为每个现有数据/项目添加新数据/项目(用combobox
分隔)。
示例:
,
现在,请注意,我使用具有相同连接的多个DATANADADERS,因此您可能需要在 Dim i as Integer
Dim cmd1 as new SqlCommand("SELECT * FROM dbo.Dishes",connection)
Dim dr as SqlDatareader = cmd1.ExecuteReader
While dr.Read
mycombo1.Items.Add(dr(0))
End while
Dim cmd2 as new SqlCommand("SELECT * FROM dbo.Desserts",connection)
Dim dr2 as SqlDatareader = cmd2.ExecuteReader
While dr2.Read
mycombo1.Items(i) = myconbo1.Items(i) & "," & dr2(0)
i = i + 1
End while
语句或呼叫中MultipleActiveResultSets=True
在您的连接中包含或封闭DATAREADERS USING
1}}每个DATAREADER从数据库中读完后
这将解决您的问题:)
答案 1 :(得分:0)
看起来你不知道如何编写SQL查询(你的VB语法本身看起来有问题 - 字符串和字符串?)。
Dim connection As New SqlConnection("Server = DESKTOP-1373H91; Initial Catalog = MealPreOrderSystem; Integrated Security = True")
Dim query As String = <cmdString>
SELECT MealName as Name FROM dbo.Dishes
union
SELECT DessertName as Name FROM dbo.Desserts
</cmdString>
Dim cmd As SqlCommand
Dim reader As SqlDataReader
connection.Open()
cmd = New SqlCommand(query, connection)
reader = cmd.ExecuteReader
While reader.Read
cbxType.Items.Add(reader.Item("Name"))
End While
connection.Close()
注意:您说2个组合框,但您的代码似乎是将所有项目加载到单个组合框中。如果你确实需要2个组合框,那么使用2个SqlCommand和Reader循环(实际上,如果你只是使用了Linq就会更好)。
答案 2 :(得分:0)
您应该更加具体地了解从2个表中提取的列。如果它们相似,你可以用一个简单的控件向UNION ALL
字段写一个sql查询,以识别哪个记录来自哪个表。
SQL命令字符串示例:
"SELECT 'M' AS Ctl, MealName AS aName FROM dbo.Dishes " &
"UNION ALL " &
"SELECT 'D' AS Ctl, DessertName AS aName FROM dbo.Desserts"
正如许多人已经提到的那样,您似乎只引用了一个ControlBox
来列出返回的字段cbxType
下面是读者(适用于2 ComboBoxes
):
While reader.Read
Select Case reader.Item("Ctl")
Case "M"
cbxMType.Items.Add(reader.Item("aName"))
Case "D"
cbxDType.Items.Add(reader.Item("aName"))
End Select
End While
希望这有帮助