在 VB.NET 中结合了这两个 sql 查询

Posted

技术标签:

【中文标题】在 VB.NET 中结合了这两个 sql 查询【英文标题】:combined these 2 sql queries in VB.NET 【发布时间】:2021-05-22 10:49:37 【问题描述】:

我有这 2 个 sql 查询,第一个是将数据从 sql 加载到 vb.net 中的 DGV,然后我必须逐行执行第二个查询以获取一些基于一些附加数据(newprice)每条记录的条件(“newprice”在第一个查询中的同一个表中),一切都按我的意愿正常工作,但是由于代码正在遍历所有行,并且使用大数据,问题花费了太长时间需要很多时间,有没有办法通过组合这两个查询来优化这段代码以更快地工作?我已经尝试过,但不知道该怎么做。谢谢

查询 1:

                Dim sqqq as string = "select products.psize,producth.pcode,producth.pname,coalesce(sum(cast(case when producth.details = 'اذن اضافة مشتريات' or producth.details = 'اذن تسوية جردية مدينة' or  producth.details = 'إضافة رصيد افتتاحي' or producth.details ='اذن اضافة مرتجعات مبيعات' then cast(producth.quanitity as money) else 0 end as money)),0) as tadd,coalesce(sum(cast(case when producth.details = 'اذن صرف مبيعات' or producth.details = 'اذن تسوية جردية دائنة' or  producth.details = 'اذن ترجيع مشتريات' then cast(producth.quanitity as money) else 0 end as money)),0) as tremove from producth inner join products on products.parcode=producth.pcode where producth.pdate <= '" + ad + "' group by producth.pcode,producth.pname,products.psize"
                Dim cmdd As New SqlCommand(sqqq, con)
                Dim dddr As SqlDataReader = cmdd.ExecuteReader
                While dddr.Read
                   
                    DataGridView1.Rows.Add(DataGridView1.Rows.Count + 1, dddr("pcode"), dddr("pname"), dddr("psize"), "0.000", "NEWPRICE", "0.000")
                End While
                dddr.Close()   

查询 2

                For i As Integer = 0 To DataGridView1.RowCount - 1
                    Dim sq3 As String = "select newprice from producth where pp=(SELECT coalesce(MAX(CAST(pp AS int)),'00') AS pp FROm producth WHERE (pcode = '" + DataGridView1.Rows(i).Cells(1).Value + "') AND (details = 'اذن اضافة مشتريات' OR details = 'اذن تسوية جردية مدينة' OR  details = 'إضافة رصيد افتتاحي') AND (pdate = ( SELECT coalesce(MAX(CAST(pdate AS date)),'01/01/1911') AS pp FROm producth WHERE (pcode = '" + DataGridView1.Rows(i).Cells(1).Value + "') AND (details = 'اذن اضافة مشتريات' OR details = 'اذن تسوية جردية مدينة' OR  details = 'إضافة رصيد افتتاحي') AND (pdate <= '" + ad + "')  ))) and pcode='" + DataGridView1.Rows(i).Cells(1).Value + "'"
                    Dim cmd3 As New SqlCommand(sq3, con)
                    Dim dr3 As SqlDataReader = cmd3.ExecuteReader
                    If dr3.Read Then
                        DataGridView1.Rows(i).Cells(5).Value = dr3("newprice")
                    End If
                    dr3.Close()
                Next

【问题讨论】:

【参考方案1】:

要提高性能,您应该执行以下操作:

创建一个 DataTable 并使用 DataAdapter 而不是使用 DataReader 填充数据表。然后,您可以将 DataTable 与 DataGridView 绑定。然后,您遍历 DataTable 的行并执行您喜欢的任何更新。在更新 DataTable 时,您可以暂停 UI 刷新以避免在 DataTable 中的每次更改时更新 UI。

如果您想进一步加快速度,请创建一个包含单个记录的类,并为每个字段使用属性 get 和 set。使用 DataReader 为每条记录创建一个实例,并将其添加到 YourClass 类型的 List 中,其中 YourClass 是您创建的类。将列表绑定到 DataGridView。

额外建议:

使用参数化查询 为表示交易类型的字符串创建常量。 不要为事务类型重复相同的字符串,而是使用事务类型表,并为每种类型提供一个整数以及一个简短和详细的描述。在任何地方都使用此代码,而不是硬编码的字符串。 在 (a, b, c, d) 中使用 x 而不是 x = a 或 x = b...

【讨论】:

DataTable 技巧完成了这项工作,非常感谢,它比以前花费的时间更少,现在如何在 DT 中添加编号列? 您可以在数据表中添加一列。您可以指定数据类型。

以上是关于在 VB.NET 中结合了这两个 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL:在超过 1500 万行查询中结合 WHERE、ORDER 和 LIMIT

在 BigQuery 中将两个查询与 case 语句相结合

Sql中的WHERE,结合两个快速条件会成倍增加成本

在 SQL Server 中结合 dbplyr 和 case_when

在 T-SQL 中结合存储过程和查询

将 sql 查询填充到 vb.net 上的 datagridview 中