我目前正在visual studio中编写一些软件,使用SQL分析来自Access数据库的大量数据。我有一个代码来创建一个新的计算变量,但我正在努力将数据写回Access。
我目前正在使用一些vb com代码与我的Access数据库进行通信,该数据库在2002/3可比性模式下运行。以下是我当前的代码,它在循环中运行函数以写入数据库。
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条记录插入到每个参数的Access数据库中,这需要大约3分钟。然而,当项目上线时,每个参数将需要处理超过100000条记录,因此它不够快。
要解决此问题,我正在考虑将代码更新为.net或创建记录集,这样我就可以立即移动Access中的所有数据。谁能给我一些建议,哪些会对提高插件的速度产生最大的影响。我正在运行visual studio 2005和Access 2007,将数据库更新到2007而不是兼容模式是可能的但不理想,但是我当前的代码无法访问它。
感谢您的帮助
约什
答案 0 :(得分:2)
听起来很荒谬,在Access数据库中获得的最佳性能是使用古代 DAO COM库。使用RecordSet
对象在循环中一次添加一个记录,并按索引(序号位置)而不是其名称引用字段。你会发现它比使用oleDB.ExecuteNonQuery
更快,很多。
有关详细信息,请参阅the solution given here。这是C#但是如果你想尝试一下,它很容易跟随并转换成VB.NET。
修改强>
尊重Remou在下面的评论:看来Microsoft 实际上已经保持DAO技术的最新状态 - 尽管2002年declaring it obsolete回来了 - 但你必须使用{{ 3}}而不是更为人熟知的DAO 3.6库。