私は現在、SQLを使用してAccessデータベースからの大量のデータを分析するためにVisualStudioでいくつかのソフトウェアを作成しています。新しい計算変数を作成するコードがありますが、データをAccessに書き戻すのにかかる時間に苦労しています。
現在、2002/3比較可能モードで実行されているAccessデータベースと通信するためにいくつかのvbcomコードを使用しています。以下は、データベースに書き込むためにループ内で関数を実行する私の現在のコードです。
cnnOLEDB = New OleDbConnection
cnnOLEDB.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DataDirectoryName & DatabaseFileName
cnnOLEDB.Open()
'cmdOLEDB = New OleDbCommand
cmdOLEDB.Connection = cnnOLEDB
ColumnString = "ID_VAR, ID_PAR, TimeValue, strValue, ID_UPL"
For RecordCounter = 0 To CalcData.GetLength(1) - 1
Var_ID = Var_ID + 1
ValueString = Format(Var_ID, "0") & ", " & Format(Parameter, "0") & ", #" & Date2String(CDate(CalcData(0, RecordCounter))) & "#, " & CalcData(CalcData.GetLength(0) - 1, RecordCounter) & ", " & Format(AsUpload, "0")
If DatabaseConnectionInsert("INSERT INTO " & TableName & " (" & ColumnString & ") VALUES (" & ValueString & ")", "Non-Query") = "Error" Then GoTo Close
Next
cnnOLEDB.Close()
関数は次のとおりです。
Public Function DatabaseConnectioninsert(ByVal Query As String, ByVal Task As String) As String
'On Error GoTo Err
'If cnnOLEDB.State = ConnectionState.Open Then cnnOLEDB.Close()
cmdOLEDB.CommandText = Query
Select Case Task
Case "Read Recordset"
rdrOLEDB = cmdOLEDB.ExecuteReader()
DatabaseConnectioninsert = "Read Recordset"
Case "Read Scalar"
DatabaseConnectioninsert = cmdOLEDB.ExecuteScalar
Case "Non-Query"
cmdOLEDB.ExecuteNonQuery()
DatabaseConnectioninsert = "Non-Query"
End Select
Exit Function
Err:
MsgBox("Database connection error.")
DatabaseConnectioninsert = "Error"
End Function
私は現在、パラメータごとにアクセスデータベースに最大4500レコードを挿入しようとしています。これには最大3分かかります。ただし、プロジェクトが稼働すると、パラメータごとに100000を超えるレコードを処理する必要があるため、十分な速度ではありません。
この問題を解決するために、コードを.netに更新するか、レコードセットを作成して、Accessのすべてのデータを一度に移動できるようにすることを考えています。インサートの速度を向上させるのに最も大きな影響を与えるものについて、誰かにアドバイスをいただけますか。Visual Studio2005とAccess2007を実行しています。互換モードではなく、データベースを2007に更新することは可能ですが、理想的ではありませんが、現在のコードではアクセスできません。
ご協力ありがとうございました
ジョシュ