2009-06-26 14 views
0

私は問題があります。私は1Kのインボイスオブジェクトをロードしています。ヘッダーは最初にDALに記載されています。私はこのプロジェクトでVB.NETを使用しています。私は請求書のヘッダーをうまく取得できます。各請求書の詳細をロードすると、SQL Serverでタイムアウトが発生します。私はタイムアウトを5分に増やしましたが、それと同じことです。請求書の数を200に減らすと問題なく動作します。ここでジェネリックの力を使って問題を解決することはできますか

は私が原因の反復にDBへの1Kの接続を発射していますことを承知しています私は

 


     //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 

をやっているものです。私は(のいずれかを選択する文ですべてのラインアイテムをロードし、その後、私はSystem.Collections.Generic.List」タイプの エラー1つの値を上回るラムダfuncionをwhenusingエラーが出る

For Each invoice As Invoice In invoices 

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

Next 

ような何かをすることはできませんBizComm.InvoiceLine) 'を' BizComm.InvoiceLine 'に変換することはできません。 C:\ Projects \ BizComm \ InvoiceDAL.vb 75 35 BizComm

+0

タイトルを改訂する必要があります。私はジェネリックスに関連することはまったくありません... –

答えて

0

手元にInvoiceItemをロードするのはなぜですか?要求に応じてロードできませんか?あなたがアイテムを取得する必要があるとき
つまりは、

EDIT(myInvoice.GetItems)請求書インスタンスのメソッドを呼び出します。あなたがやろうとしているかの全体像を理解することが良いでしょう。
すべての請求書を実際に取得する必要がありますか?

+0

完了したリストを完成した別のFunctonに渡して、EDIドキュメント....長いプロセスを渡すことにしました。 –

+0

ファイルを作成する場合、なぜInvoice&InvoiceItemsを通過するのですか?私はあなたがその場合は、オブジェクト層をバイパスする必要がありますと思う。 – shahkalpesh

0

単一のクエリで必要なすべての請求書に対してすべての明細を選択しないでください。結果を複数の請求書オブジェクトに分割しますか?

Re:コレクション間のマッピング方法を教えてください。

1つのインプリメンテーションが可能です:1000の貧血インボイスオブジェクトを作成し、それらをIdからInvoiceに移動するディクショナリでチャックします。次に、請求書IDを含む明細を選択するときに、貧血請求書を調べて、その行を追加します。

+0

コレクション間のマッピング方法を教えてください。 –

1

過去のアイテムを反復処理するときに私がやったことの1つは、すべての必要な読み取りアクティビティに対して同じConnectionオブジェクトを使用することでした。パフォーマンスを大幅に向上させるようです。

また、dbo.getinvoiceitemの手順を改善できるかどうか、または別の手順を書いて、請求書のグループ(おそらく日付または顧客/仕入先別)のすべての明細を書くことができるかどうかを確認します。 )ではなく、一度に1つのヘッダーだけです。その後、インボイスコレクションに対して、より効果的に反復を適用して、ヘッダーに行を追加することができます。

@invoicenumberパラメータが参照する列に有効なインデックスがあるかどうかを確認することもできます。

+0

問題のアルゴリズムが10,000回の往復(請求書あたり10アイテム)を強制的に犬にすると、あなたは何をするにしても、それは遅くなります。 –

1

コードからは、接続とデータレディタを閉じていないようです。

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

DBSqlHelperFactoryが接続を開きますが、接続はその復帰後に必要とされているので、それを閉じることができません:使用して声明の中で、あなたの接続とのDataReadersを置くことができます参照してください。コードを修正して、1つの接続を開き、それをDBSqlHelperFactoryにパラメータとして渡すようにします。すぐに私はいつもとデバッグ、これらの問題をピックアップして

Max Pool Size=1; 

は、接続文字列の末尾に追加しました。接続を閉じるのを忘れると、すぐにエラーがスローされます。

関連する問題