如何从两个不同的SQL Server数据库表填充组合框

时间:2018-04-11 14:56:37

标签: vb.net visual-studio

我正在尝试创建一个从数据库加载项目的系统。有两个组合框; 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()

3 个答案:

答案 0 :(得分:1)

在VB.NET中,AND是一个运算符。它用于在BooleanIntegers/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

希望这有帮助