vb.net多个查询一个表

时间:2016-07-21 13:00:48

标签: vb.net access

我正在使用VS构建一个查询访问数据库的应用程序。 在其中一个表单选项卡中有12个按钮,每个按钮附近有一个标签,它显示了按下次数。 当表单加载时,它会查询数据库以显示当天用户按下的次数。

Public Class Form1
Dim connString As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=\\networkdrive\DB_Reg_V01_10.accdb"
Dim da1, da2, da3, da4, da5, da6, da7, da8, da9, da10, da11, da12 As OleDbDataAdapter
Dim ds1, ds2, ds3, ds4, ds5, ds6, ds7, ds8, ds9, ds10, ds11, ds12 As DataSet
Dim tables As DataTableCollection
Dim source1 As New BindingSource
Dim provider, dataFile As String
Dim cmd As OleDbCommand = Nothing
Dim myConnection As OleDbConnection = New OleDbConnection

Private Sub Form1_Load(sender As System.Object, e As EventArgs) Handles MyBase.Load

ds1 = New DataSet
tables = ds1.Tables
da1 = New OleDbDataAdapter("Select Count(*) from TB_Atividades Where ([User] = '" & boxUser.Text & "') AND (Data = DATE()) AND (Prod = 'Cat23')", myConnection)
da1.Fill(ds1, "ID")
Dim view1 As New DataView(tables(0))
DataGridView1.DataSource = view1
lblCount1.Text = DataGridView1.CurrentCell.Value.ToString()

ds2 = New DataSet
tables = ds2.Tables
da2 = New OleDbDataAdapter("Select Count(*) from TB_Atividades Where ([User] = '" & boxUser.Text & "') AND (Data = DATE()) AND (Prod = 'Cat4410')", myConnection)
da2.Fill(ds2, "ID")
Dim view1 As New DataView(tables(0))
DataGridView1.DataSource = view2
lblCount2.Text = DataGridView1.CurrentCell.Value.ToString()

/.../

ds12 = New DataSet
tables = ds12.Tables
da12 = New OleDbDataAdapter("Select Count(*) from TB_Atividades Where ([User] = '" & boxUser.Text & "') AND (Data = DATE()) AND (Prod = 'Cat101')", myConnection)
da12.Fill(ds12, "ID")
Dim view12 As New DataView(tables(0))
DataGridView1.DataSource = view12
lblCount12.Text = DataGridView1.CurrentCell.Value.ToString()

/.../

代码正常运行,但需要一些时间才能启动。我只是想做些什么 高效。

有没有办法减少对数据库的通话次数?

事先提前。

2 个答案:

答案 0 :(得分:1)

您需要学习如何执行功能和parametrize your query。您的连接需要在短时间内打开。如果您只需要计数,则只需调用ExecuteScalar而不是整个数据集。

Function GetCount(ByVal user As String, ByVal product As String) As Integer

    Dim result As Integer
    Dim command As New OleDbCommand("Select Count(*) from TB_Atividades Where ([User] = ?) AND (Data = DATE()) AND (Prod = ?)", connection)

    command.Parameters.Add(user)
    command.Parameters.Add(product)

    myConnection.Open()
    result = command.ExecuteScalar()
    myConnection.Close()

    return result
End Function


lblCount1.Text = GetCount(boxUser.Text, "Cat23")
lblCount2.Text = GetCount(boxUser.Text, "Cat4410")

我无法测试这个,所以不要只是复制/粘贴它。我希望这会给你指导,采取正确的步骤。

如果您需要查询所有类别,则只需返回所有类别的列表并循环显示它们。最好以最少的时间查询数据库。

SELECT Prod, count(*) FROM ... GROUP BY Prod

答案 1 :(得分:0)

如果要在Form_Load事件中使用所有逻辑,则需要一些时间才能完成其操作,从而导致表单加载延迟。

为了避免您需要在应用程序中实现Threading概念。您需要创建一个新线程并在其中编写逻辑。在Form_Load事件中启动线程并在表单中显示加载符号,直到执行线程结束。

您可以从数据库中获取所有记录并将其存储在DataTable中,而不是经常查询数据库。使用DataTable.select(“您的查询”)根据您的要求过滤掉记录。