2012-04-30 9 views
1

OleDbDataAdapterの記入についての質問。OleDbDataAdapterデータの記入

私が持っている:

Dim cmd As OleDbCommand = New OleDbCommand(myQuery), myConnection) 
Dim da As OleDbDataAdapter = New OleDbDataAdapter() 
Dim dtDonnees As DataTable = New DataTable() 
da.Fill(dtDonnees) 

充填は時間がかかりすぎます。
20行は20秒かかります。
また、130   000の場合は、もう少し時間がかかります(ただし、13  000秒はありません)。
しかし、とにかく20秒は多すぎます。

なぜ時間がかかるのですか?


質問パート2:塗りつぶすことはできますか?

私が意味する、データテーブルを充填した後、私は、エンティティにデータテーブルとキャストの行ごとに実行します。

Dim returnList As New List(Of myObject)(dtDonnees.Rows.Count) 
For Each rowDonnee As DataRow In dtDonnees.Rows 
    returnList.Add(New myObject(rowDonnee))'set every data of the row into my new object 
Next 

私はOleDbDataAdapterの各列を渡すことはできますか?

答えて

0

試してみたい場合は、このメソッドでDataAdapterの塗りつぶしをスキップできます(DataTableが不要な場合)。パフォーマンスが大幅に向上するとは確信していません。

Dim cmd As OleDbCommand = New OleDbCommand(myQuery, myConnection) 
Dim reader As OleDbDataReader = cmd.ExecuteReader() 
while reader.Read() 
    returnList.Add(New myObject(reader)) 
end while 

もちろん、あなたobiectのコンストラクタで、あなたはデータを読み、あなたのオブジェクト

Public Class myObject 

    Dim myData As String 
    ' other internal var to keep state of this object instance 

    Public Sub New(ByVal reader as OleDbDataReader) 
     myData = reader.GetString(0) 
     ' read and initialize other internal data. 
    End Sub 
End Class 
+0

ええ、私が得たもののthatsの内部状態を設定する必要があります。コンストラクタはdatarowを取得するので、LocalVar = tryPars(myRow( "columnX"))を設定します。 – forX

+0

私は読者が同じことをすることができると思います。なぜスピードが上がらないと言ったのですか? – forX

+0

あなたの例では、2つのループがあると言えます。 1つはDataSetを埋め、もう1つはオブジェクトを構築します。 DataReaderを使用して、1つのループと、データテーブル内の行のメモリ内のキャッシュを削除します。残念ながら、DataReaderはDataRow内の現在のデータラインを簡単に変換する方法がありません。このメソッドを使用するには、新しいコンストラクタを追加する必要があります。スピードについてデータレディヤーが処理速度を上げるかどうかは言えませんが、ベンチマークが必要です。インスタンスを構築して初期化するコストは、reader.read/adapter.fillのコストよりも関連している可能性があります – Steve

関連する問題