【问题标题】:Can I use the the power of Generics to solve my issue我可以使用泛型的力量来解决我的问题吗
【发布时间】:2010-11-06 01:36:32
【问题描述】:

我有一个奇怪的问题。我正在加载 1k 发票对象,首先是标题,然后是我的 DAL 中的详细信息。我在这个项目上使用 VB.NET。我能够很好地获得发票标题。当我开始加载每张发票的详细信息时,我在 SQL Server 上遇到了超时。我将超时时间增加到 5 分钟,但还是一样。如果我将发票数量减少到 200,它可以正常工作。

这就是我正在做的事情

//我已经加载了发票标题。我现在正在迭代每张发票以获取其详细信息 对于每张发票 As Invoice In invoices drInvoiceItems = DBSqlHelperFactory.ExecuteReader(CONNECTION_STRING,CommandType.StoredProcedure,“dbo.getinvoiceitem”,_ New SqlParameter("@invoicenumber", invoice.InvoiceNumber)) 虽然 drInvoiceItems.Read() invoice.LineItems.Add(New InvoiceLine(drInvoiceItems("id"), drInvoiceItems("inv_id"), drInvoiceItems("prodid"), drInvoiceItems("name"), drInvoiceItems("barcode"), drInvoiceItems("quantity") , drInvoiceItems("costprice"))) 结束时 下一个 退回发票

我知道由于迭代,我正在触发与数据库的 1k 连接。我不能用一个 select 语句加载所有行项目,然后执行类似的操作

For Each invoice As Invoice In invoices

  invoice.Items.Add(invoiceItems.Find(Function(i as InvoiceItem),i.InvoiceNumber = invoice.InvoiceNumber))

Next

使用上面的 lambda 函数时出现错误 错误 1 ​​类型“System.Collections.Generic.List(Of BizComm.InvoiceLine)”的值无法转换为“BizComm.InvoiceLine”。 C:\Projects\BizComm\InvoiceDAL.vb 75 35 BizComm

【问题讨论】:

  • 也许你应该改写标题。我根本看不到这与泛型有关...

标签: sql vb.net data-access-layer


【解决方案1】:

我过去在遍历项目时做过的一件事是对所有必要的读取活动使用相同的 Connection 对象。它似乎大大提高了性能。

我还会查看数据库以查看是否可以改进 dbo.getinvoiceitem 程序,或者是否可以编写另一个程序来为您提供一组发票的所有行项目(可能按日期或客户/供应商),而不是一次只有一个标题。然后,您可以更有效地对发票集合应用迭代并将行添加到标题中。

您还可以查看@invoicenumber参数引用的列是否存在有效索引。

【讨论】:

  • 无论你做什么,如果有问题的算法强制说 10,000 次往返(平均每张发票 10 项),它都会变得很慢。
【解决方案2】:

从您的代码来看,您似乎没有关闭连接和数据读取器。看看是否可以将连接和数据读取器放在 USING 语句中:

Using con As New SqlConnection(connectionString)
    ....
End Using

DBSqlHelperFactory 打开一个连接,但不能关闭它,因为它返回后需要连接。我会修改代码,以便您打开一个连接并将其作为参数传递给 DBSqlHelperFactory。

为了快速解决这些问题,我总是使用以下方式进行调试:

Max Pool Size=1;

添加到连接字符串的末尾。每当您忘记关闭连接时,这将很快引发错误。

【讨论】:

    【解决方案3】:

    为什么要事先加载 InvoiceItems?不能按需加载吗?
    即当您需要获取 Items 时,调用 Invoice 实例上的方法 (myInvoice.GetItems)

    编辑:最好了解您正在尝试做的事情的全貌。
    是否真的需要同时获取所有发票?

    【讨论】:

    • 我需要将完成的列表传递给另一个生成 EDI 文档的函数......漫长的过程。
    • 如果要从中生成文件,为什么要通过 Invoice 和 InvoiceItems?在这种情况下,我认为您应该绕过对象层。
    【解决方案4】:

    为什么不在一个查询中为您需要的所有发票选择所有行项目。然后将结果分成多个发票对象?

    Re:如何在集合之间进行映射?

    一种实现可能是:创建 1000 个贫血的 Invoice 对象,将它们放入从 Id 到 Invoice 的字典中。然后,当您选择包含发票 ID 的行项目时,查找贫血发票并将该行添加到其中。

    【讨论】:

    • 如何在集合之间进行映射?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多