【问题标题】:multiple SQL queries stored as vb.net variable存储为 vb.net 变量的多个 SQL 查询
【发布时间】:2014-10-04 21:51:43
【问题描述】:

我知道还有其他一些关于将 sql 结果放入 vb.net 变量的帖子,但我无法理解他们是如何做到的,以及我如何在我的项目中做到这一点。

所以我要做的是在我的数据库中查询 4 ​​个不同的值,然后在表单的某个部分显示每个值。我打算将每个值存储到一个变量中,然后执行 textbox1.text = i

2014 年 10 月 5 日更新代码

 Private Sub LBmembers_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LBmembers.SelectedIndexChanged

    Dim i As String = LBmembers.SelectedItem
    Dim dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
    Dim dbSource = "Data Source= C:\members.mdb "
    Dim SqlQuery As String = "SELECT StartTime, EndTime, ShipCode, CycleTime, WorkPercent, Share FROM tblMembers WHERE Member = @ID;"
    Using con = New OleDb.OleDbConnection(dbProvider & dbSource)
        Using cmd = New OleDb.OleDbCommand(SqlQuery, con)
            con.Open()
            cmd.Parameters.AddWithValue("@ID", OleDb.OleDbType.VarWChar).Value = i
            Using reader = cmd.ExecuteReader()
                If reader.Read() Then
                    TBtimestart.Text = reader.ToString(0)
                    TBtimeend.Text = reader.ToString(1)
                    Dim j = Convert.ToInt32(reader.ToString(2))
                    TBtimecycle.Text = reader.GetInt32(3).ToString
                    TBmemberpercent.Text = reader.GetInt32(4)
                    TBmembershare.Text = reader.GetInt32(5)
                    If j = 1 Then
                        RBpro.Checked = True
                    ElseIf j = 2 Then
                        RBret.Checked = True
                    ElseIf j = 3 Then
                        RBcov.Checked = True
                    ElseIf j = 4 Then
                        RBskiff.Checked = True
                    ElseIf j = 5 Then
                        RBmack.Checked = True
                    ElseIf j = 6 Then
                        RBhulk.Checked = True
                    Else
                        RBpro.Checked = False
                        RBret.Checked = False
                        RBcov.Checked = False
                        RBskiff.Checked = False
                        RBmack.Checked = False
                        RBhulk.Checked = False
                        Exit Sub
                    End If
                End If
            End Using
            con.Close()
        End Using
    End Using
End Sub

例外

InvalidCastException 未处理 指定的强制转换无效。

弹出就行 T​​Btimecycle.text = reader.GetInt32(3).ToString

当我在 using 语句中插入测试代码“TBgrossisk.Text = reader.ToString()”时,阅读器也在读取“System.Data.OleDb.OleDbDataReader”

【问题讨论】:

    标签: sql vb.net variables ms-access-2007


    【解决方案1】:

    如果您仔细查看SELECT 语句的语法,您会发现只需一个查询即可请求表的任何列。

    Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LBmembers.SelectedIndexChanged
        if string.IsNullOrWitheSpace(ListBox1.SelectedItem.ToString()) Then
            MessageBox.Show("Select an item from the Listbox")
        End If
    
        Dim member As String = ListBox1.SelectedItem
        Dim dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
        Dim dbSource = "Data Source= C:\members.mdb "
        Dim SqlQuery As String = "SELECT StartTime, EndTime, ShipCode, CycleTime " & _ 
                                 "FROM tblMembers WHERE Member = @ID;"
        Using con = New OleDb.OleDbConnection(dbProvider & dbSource)
            Using cmd = New OleDb.OleDbCommand(SqlQuery, con)
                con.Open()
                cmd.Parameters.AddWithValue("@ID", OleDb.OleDbType.VarWChar).Value = member
                Using reader = cmd.ExecuteReader
                   if reader.Read() Then
                      TextBox1.Text = reader.GetString(0)
                      TextBox2.Text = reader.GetString(1)
                      Dim j = reader.GetInt32(2)
                      If j = 1 Then
                          Radio1.Checked = True
                      ElseIf j = 2 Then
                          Radio2.Checked = True
                      ElseIf j = 3 Then
                          Radio3.Checked = True
                      ElseIf j = 4 Then
                          Radio4.Checked = True
                      ElseIf j = 5 Then
                          Radio5.Checked = True
                      ElseIf j = 6 Then
                          Radio6.Checked = True
                      Else
                          Exit Sub
                      End If
                      TextBox4.Text = reader.GetInt32(3).ToString()
                   Else
                      MessageBox.Show("The search for '" & member & "' doesn't find any data")
                   End If
               End Using
            End Using
        End Using
    End Sub
    

    您可以使用ExecuteReader 方法返回的OleDbDataReader,而不是使用仅返回检索到的第一行的第一列的 ExecuteScalar。该对象允许使用索引(或列名)访问当前记录中的各个列。在 MSDN 中阅读有关 OleDbDataReader 的更多信息

    【讨论】:

    • “使用 reader = cmd.executereader”行中的“没有为一个或多个必需参数提供值”
    • 您确定您的 tblMembers 有这 5 列吗?它们应准确命名为 Column1 到 Column5。
    • 出于安全原因,我省略了它们的专有名称,但它确实有 5 列。第 1 列是成员的名称(唯一且主键)如果说第 2-4 列中没有数据,我会收到错误消息吗?
    • 不,你会得到一个不同的错误。这通常意味着 Access 引擎找不到具有您在查询中编写的名称的列或表。因此,例如,如果您的 column1 名为 IDMember,则在查询中使用该名称,对于其他列也是如此。请用真实姓名更新您的问题,以便我可以尝试更新我的答案
    • 哇,我刚刚发现我的错误选择语句中的第一列是向后的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多