【问题标题】:Another Way to load multiple queries on multiple textboxes在多个文本框上加载多个查询的另一种方法
【发布时间】:2021-05-20 07:27:48
【问题描述】:

到目前为止,我正在使用此代码。 问题是它在我的文本框上加载时加载速度太慢,还有其他方法吗?我只是在寻找建议或想法。 数据将显示在文本框 procqty.text 上,但加载时间为 10 到 12 秒。

任何想法都会有所帮助。

谢谢。

 Function qtyCheck()


    query = "SELECT SUM(prdInput) AS prdInput FROM ProdOutput WHERE HELPER ='" & txtLot.Text & "-" & txtPartNumber.Text & "-" & txtProcess1.Text & "';"
    retrieveSingleResult(query)

    proc1QTYIn.Text = dt.Rows(0)("prdInput").ToString()

    query = "SELECT SUM(prdOutput) AS prdOutput FROM ProdOutput WHERE HELPER ='" & txtLot.Text & "-" & txtPartNumber.Text & "-" & txtProcess1.Text & "';"
    retrieveSingleResult(query)

    proc1QTYOut.Text = dt.Rows(0)("prdOutput").ToString()
    '/
    query = "SELECT SUM(prdInput) AS prdInput FROM ProdOutput WHERE HELPER ='" & txtLot.Text & "-" & txtPartNumber.Text & "-" & txtProcess2.Text & "';"
    retrieveSingleResult(query)

    proc2QTYIn.Text = dt.Rows(0)("prdInput").ToString()

    query = "SELECT SUM(prdOutput) AS prdOutput FROM ProdOutput WHERE HELPER ='" & txtLot.Text & "-" & txtPartNumber.Text & "-" & txtProcess2.Text & "';"
    retrieveSingleResult(query)

    proc2QTYOut.Text = dt.Rows(0)("prdOutput").ToString()
    '/
    query = "SELECT SUM(prdInput) AS prdInput FROM ProdOutput WHERE HELPER ='" & txtLot.Text & "-" & txtPartNumber.Text & "-" & txtProcess3.Text & "';"
    retrieveSingleResult(query)

    proc3QTYIn.Text = dt.Rows(0)("prdInput").ToString()

    query = "SELECT SUM(prdOutput) AS prdOutput FROM ProdOutput WHERE HELPER ='" & txtLot.Text & "-" & txtPartNumber.Text & "-" & txtProcess3.Text & "';"
    retrieveSingleResult(query)

    proc3QTYOut.Text = dt.Rows(0)("prdOutput").ToString()
    '/
    query = "SELECT SUM(prdInput) AS prdInput FROM ProdOutput WHERE HELPER ='" & txtLot.Text & "-" & txtPartNumber.Text & "-" & txtProcess4.Text & "';"
    retrieveSingleResult(query)

    proc4QTYIn.Text = dt.Rows(0)("prdInput").ToString()

    query = "SELECT SUM(prdOutput) AS prdOutput FROM ProdOutput WHERE HELPER ='" & txtLot.Text & "-" & txtPartNumber.Text & "-" & txtProcess4.Text & "';"
    retrieveSingleResult(query)

    proc4QTYOut.Text = dt.Rows(0)("prdOutput").ToString()
    '/
    query = "SELECT SUM(prdInput) AS prdInput FROM ProdOutput WHERE HELPER ='" & txtLot.Text & "-" & txtPartNumber.Text & "-" & txtProcess5.Text & "';"
    retrieveSingleResult(query)

    proc5QTYIn.Text = dt.Rows(0)("prdInput").ToString()

    query = "SELECT SUM(prdOutput) AS prdOutput FROM ProdOutput WHERE HELPER ='" & txtLot.Text & "-" & txtPartNumber.Text & "-" & txtProcess5.Text & "';"
    retrieveSingleResult(query)

    proc5QTYOut.Text = dt.Rows(0)("prdOutput").ToString()
 
    End Function

【问题讨论】:

  • 您构建查询的方式一开始就不好。您应该研究如何使用参数构建查询。它将帮助您避免各种问题,最重要的是 SQL 注入攻击,这可能会删除您的整个数据库。
  • 至于问题,你很可能在每个查询上打开和关闭连接,这很糟糕。如果您有多个任务要连续对数据库执行,那么您应该打开一次连接,执行所有任务然后关闭它。如果你要抽象你的数据访问代码,那么你需要允许这种事情。
  • 另外,根据您的数据库,您可能可以使用单个查询一次性获取所有数据,因此只需访问数据库即可。
  • 数据库中HELPER字段的数据类型是什么?看起来您正在尝试减去字符串,或者 HELPER 字段是否包含带有破折号的不同字符串?

标签: sql vb.net


【解决方案1】:

用户界面代码和数据库代码是分开独立的。

从按钮单击将参数发送到函数。 vb.net 中的函数必须有一个DataType,它比作用域更可取。 (在这种情况下为Private

函数的结果分配给文本框。

'The first index is the index of the DataTable in the list.
'The second index is the index of the Row in the DataTable
'The third index is the index of the Column in the DataTable

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim lst As List(Of DataTable)
    Try
        lst = qtyCheck(txtLot.Text, txtPartNumber.Text, txtProcess1.Text, txtProcess2.Text, txtProcess3.Text, txtProcess4.Text, txtProcess5.Text)
    Catch ex As Exception
        MessageBox.Show(ex.Message)
        Return
    End Try

    proc1QTYIn.Text = lst(0)(0)(0).ToString
    proc1QTYOut.Text = lst(0)(0)(1).ToString
    proc2QTYIn.Text = lst(1)(0)(0).ToString
    proc2QTYOut.Text = lst(1)(0)(1).ToString
    proc3QTYIn.Text = lst(2)(0)(0).ToString
    proc3QTYOut.Text = lst(2)(0)(1).ToString
    proc4QTYIn.Text = lst(3)(0)(0).ToString
    proc4QTYOut.Text = lst(3)(0)(1).ToString
    proc5QTYIn.Text = lst(4)(0)(0).ToString
    proc5QTYOut.Text = lst(4)(0)(1).ToString
End Sub

数据库对象需要关闭和处置。 Using...End Using 块为我们处理这个问题。 我将查询合并为一个。永远不要连接字符串来构建 sql 字符串。始终使用参数。我们可以对数据库的所有调用使用相同的连接、命令和参数。唯一改变的是参数的值。

Private ConStr As String = "Your connection string"

Private Function qtyCheck(Lot As String, PartNum As String, Process1 As String, Process2 As String, Process3 As String, Process4 As String, Process5 As String) As List(Of DataTable)
    Dim query1 As String = "SELECT SUM(prdInput) AS prdInput,SUM(prdOutput) AS prdOutput  FROM ProdOutput WHERE HELPER = @HELPER;"
    Dim dt1 As New DataTable
    Dim dt2 As New DataTable
    Dim dt3 As New DataTable
    Dim dt4 As New DataTable
    Dim dt5 As New DataTable
    Dim lst As New List(Of DataTable)
    Using cn As New SqlConnection(ConStr),
            cmd As New SqlCommand(query1, cn)
        cmd.Parameters.Add("@HELPER", SqlDbType.VarChar).Value = $"{Lot}-{PartNum}-{Process1}"
        cn.Open()
        Using reader = cmd.ExecuteReader
            dt1.Load(reader)
        End Using
        lst.Add(dt1)
        cmd.Parameters("@HELPER").Value = $"{Lot}-{PartNum}-{Process2}"
        Using reader = cmd.ExecuteReader
            dt2.Load(reader)
        End Using
        lst.Add(dt2)
        cmd.Parameters("@HELPER").Value = $"{Lot}-{PartNum}-{Process3}"
        Using reader = cmd.ExecuteReader
            dt3.Load(reader)
        End Using
        lst.Add(dt3)
        cmd.Parameters("@HELPER").Value = $"{Lot}-{PartNum}-{Process4}"
        Using reader = cmd.ExecuteReader
            dt4.Load(reader)
        End Using
        lst.Add(dt4)
        cmd.Parameters("@HELPER").Value = $"{Lot}-{PartNum}-{Process5}"
        Using reader = cmd.ExecuteReader
            dt5.Load(reader)
        End Using
        lst.Add(dt5)
    End Using
    Return lst
End Function

【讨论】:

  • 谢谢。我现在正在研究代码,我正在掌握它。只是一个简单的问题,这段代码是用于 sql 连接的,对吗?为了在 ms 访问上使用它,我将 sqlconnection、sqlcommand 和 sqldbtype 更改为 oledbconnection、oledbcommand 和 oledbtype。它有效但没有错误,它没有得到总和。
  • 现在一切都好。有用!谢谢。我现在将所有以前的查询转换为参数。
  • 加载时间从 13-15 秒到 3 秒。谢谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
相关资源
最近更新 更多