3

我目前正在 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 而不是兼容模式是可能的,但并不理想,但是我当前的代码无法访问它。

感谢您的帮助

乔什

4

1 回答 1

2

听起来很荒谬,在 Access 数据库上获得的最佳性能是使用古老的DAO COM 库。使用一个RecordSet对象在循环中一次添加一条记录,并通过它们的索引(序数位置)而不是它们的名称来引用这些字段。你会发现它使用oleDB.ExecuteNonQuery.

有关详细信息,请参阅此处给出的解决方案。它是 C#,但如果您想尝试一下,它很容易遵循并转换为 VB.NET。

编辑
尊重 Remou 在下面的评论:看起来微软实际上一直在使 DAO 技术保持最新——尽管早在 2002 年就宣布它已经过时——但你必须使用Office Access Redistributable而不是更知名的 DAO 3.6图书馆。

于 2012-08-20T16:46:43.763 回答