当前位置: 首页 > 面试题库 >

编写大量记录以使用VB进行访问

卞浩漫
2023-03-14
问题内容

我目前正在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

编辑
在尊重低于Remou的评论:这样看来,微软 已经
尽管事实上已经保持DAO技术最新的鈥宣布它已经过时他在2002年鈥但你必须使用Office访问再分发,而不是更好地了解DAO 3.6库。



 类似资料:
  • 问题内容: 有一个名为“ student”的数据库表,其中有一个名为“ marks”的列。我希望学生在数学方面得分最高。使用order_by()[0]以下方法可以解决此问题: 但这会排序表,然后为我获取第一条记录。如果我的表很大,这是多余的,因为我只需要最大记录。有没有办法不进行排序就获得最大价值? 我想要整个对象,而不仅仅是最大值。 问题答案: 所需的SQL将如下所示: 要通过Django执行此

  • 问题内容: 我有一个SQL Server 2008数据库和一个asp.net前端。 当用户当前正在编辑记录但不确定哪种是最好的方法时,我想实现一个锁定。 我的想法是为记录创建一列,并在用户拉出该记录时将其设置为true,这意味着所有其他用户都具有只读访问权限,直到第一个用户完成编辑为止。 但是,如果会话超时并且他/她从不保存/更新记录,该记录将保留为,表示其他人无法对其进行编辑,对吗? 如何实现某

  • 问题内容: 我正在尝试使用JAVA解析JFR转储。我关注了这个博客,http://hirt.se/blog/?p=446。但是现在不推荐使用这些方法。JFR到JAVA是否有任何受支持的解析器?如果不能,您能否指出我是否可以从JFR转储中检索数据? 问题答案: 正如Klara提到的那样,没有官方支持的解析器。希望JDK 9将正式支持JFR解析器。现在,您可以使用Hirt博客中提到的API 。不用担心

  • 问题内容: 我想编写一个例程,该例程将允许我在跨越设定时间范围的表中记录日期已久的事件(记录),并且在特定的一天没有发生任何事件的情况下,将创建一个重复次数最多的事件事件DID发生的最近的先前记录。 例如:如果在9月4日,字段1 = X,字段2 = Y,字段3 = Z,然后什么也没有发生,直到9月8日字段1 = Y,字段2 = Z,字段3 = X,该例程将创建记录在表格中说明3天什么都没发生的情况

  • 问题内容: 我正在尝试获取在请求中发送的确切JSON。这是我的代码: 但是我只在日志中看到: 考虑到删除了Retrofit 1 ()以及我们以前使用的Retrofit 1 ,我应该如何正确记录? 问题答案: 在Retrofit 2中,你应该使用HttpLoggingInterceptor。 将依赖项添加到。截至2019年10月的最新版本是: 创建一个Retrofit如下所示的对象: 如果有弃用警告