我目前正在Visual Studio中编写一些软件,以使用SQL分析来自Access数据库的大量数据。我有编写一个新的计算变量的代码,但在将数据写回到Access所花费的时间上却很挣扎。
我目前正在使用一些vb com代码与以2002/3可比模式运行的Access数据库进行通信。以下是我当前的代码,该代码在循环中运行一个函数以写入数据库。
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,而不是兼容模式,但这不是很理想,但是我当前的代码无法访问它。
谢谢您的帮助
乔希
听起来 很 荒谬,但是 在Access数据库上获得的最佳性能是使用 古老的 DAO COM库。使用一个RecordSet对象在循环中一次添加一个记录,并通过它们的索引(原始位置)而不是它们的名称来引用这些字段。你会发现很多, _很多_比使用更快oleDB.ExecuteNonQuery。
RecordSet
oleDB.ExecuteNonQuery
编辑 在尊重低于Remou的评论:这样看来,微软 已经 尽管事实上已经保持DAO技术最新的鈥宣布它已经过时他在2002年鈥但你必须使用Office访问再分发,而不是更好地了解DAO 3.6库。