Могу ли я использовать силу Generics для решения моей проблемы - PullRequest
0 голосов
/ 26 июня 2009

У меня странная проблема. Я загружаю объекты счета 1k, сначала заголовок, а затем детали в моем DAL. Я использую VB.NET в этом проекте. Я в состоянии получить заголовки счета просто отлично. Когда я загружаю детали для каждого счета, я получаю тайм-аут на SQL Server. Я увеличил время ожидания до 5 минут, но все равно. Если я уменьшу счет до 200, он будет работать нормально.

Вот что я делаю



        //I already loaded the invoice headers. I am now iterating each invoice to get    it's detail
        For Each invoice As Invoice In invoices
            drInvoiceItems = DBSqlHelperFactory.ExecuteReader(CONNECTION_STRING, CommandType.StoredProcedure, "dbo.getinvoiceitem", _
                                                                                                       New SqlParameter("@invoicenumber", invoice.InvoiceNumber))
            While drInvoiceItems.Read()
                invoice.LineItems.Add(New InvoiceLine(drInvoiceItems("id"), drInvoiceItems("inv_id"), drInvoiceItems("prodid"), drInvoiceItems("name"), drInvoiceItems("barcode"), drInvoiceItems("quantity"), drInvoiceItems("costprice")))
            End While

        Next

        Return invoices

Мне известно, что я запускаю 1k соединений с БД из-за итераций. Не могу ли я загрузить все позиции одним оператором select, а затем сделать что-то вроде

For Each invoice As Invoice In invoices

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

Next

Я получаю ошибку при использовании лямбда-функции выше Ошибка 1 Значение типа «System.Collections.Generic.List (Of BizComm.InvoiceLine)» не может быть преобразовано в «BizComm.InvoiceLine». C: \ Projects \ BizComm \ InvoiceDAL.vb 75 35 BizComm

Ответы [ 4 ]

1 голос
/ 26 июня 2009

Судя по вашему коду, вы не закрываете соединения и устройства чтения данных. Посмотрите, можете ли вы поместить свои соединения и устройства чтения данных в оператор USING:

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

DBSqlHelperFactory открывает соединение, но не может закрыть его, так как соединение необходимо после его возврата. Я бы изменил код, чтобы вы открывали одно соединение и передавали его в DBSqlHelperFactory в качестве параметра.

Чтобы быстро решить эти проблемы, я всегда отлаживаю с помощью:

Max Pool Size=1;

добавлено в конец строки подключения. Это быстро выдаст ошибку, если вы забудете закрыть соединение.

1 голос
/ 26 июня 2009

Одна вещь, которую я сделал, когда перебирал элементы в прошлом, - это использование одного и того же объекта Connection для всех необходимых операций чтения. Кажется, это значительно повышает производительность.

Я бы также посмотрел на базу данных, чтобы увидеть, можно ли улучшить процедуру dbo.getinvoiceitem или можно ли написать другую процедуру, которая даст вам все позиции для группы счетов (возможно, по дате или по клиенту поставщик), а не только один заголовок за раз. Тогда вы сможете более эффективно применять итерацию к коллекции счетов и добавлять строки в заголовки.

Также можно проверить, есть ли эффективный индекс для столбца, на который ссылается параметр @invoicenumber.

0 голосов
/ 26 июня 2009

Почему бы не выбрать все позиции для всех счетов-фактур, которые вам нужны в одном запросе. затем разделить результаты на несколько объектов счета?

Re: как мне сопоставить коллекции?

Одной из реализаций может быть: создать 1000 анемичных объектов Invoice, поместить их в словарь, который идет от Id к Invoice. Затем, когда вы выбираете позиции, в которые вы включаете идентификатор счета-фактуры, ищите анемичный счет-фактуру и добавляете строку к нему.

0 голосов
/ 26 июня 2009

Зачем загружать InvoiceItems перед рукой? Не можете ли вы загрузить его по требованию?
то есть, когда вам нужно получить товары, вызовите метод для экземпляра счета-фактуры (myInvoice.GetItems)

РЕДАКТИРОВАТЬ: Будет лучше понять полную картину того, что вы пытаетесь сделать.
Действительно ли необходимо получить все счета-фактуры?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...