在 Access 中执行 qdf.Execute dbFailOnError 时出现运行时错误“3049”

Posted

技术标签:

【中文标题】在 Access 中执行 qdf.Execute dbFailOnError 时出现运行时错误“3049”【英文标题】:Run-time error '3049' when qdf.Execute dbFailOnError in Access 【发布时间】:2015-06-19 02:50:09 【问题描述】:

我正在尝试将新数据提交到各种数据库中,当我在一段时间后继续提交数据时,它显示了这个错误:

提交语句如下所示:

sql "INSERT INTO  Bond Values("","HK0000122334","CNH",8447.5357732363,8447.5357732400,0.0000000037,109913,"01Jun15")". 

数据库也达到 2.09Gb。我的代码如下所示:

Sub commit(dbName As String, tableName As String, commitString As String, reportDate As String)
    Dim ws As DAO.Workspace
    Dim db As DAO.Database
    Dim sSQL As String
    Dim qdf As QueryDef

    sDb = dbName & ".accdb"
    Set ws = DBEngine.Workspaces(0)
    Set db = ws.OpenDatabase(sDb)
    sqlStatementList = Split(commitString, ";")

    For Each sqlStatement In sqlStatementList
        sqlStatement = Replace(sqlStatement, ")" & vbLf, reportDate)

        If InStr(tableName, "EIS") <> 0 Then
            sqlStatement = Replace(sqlStatement, "EIS", tableName)
        End If

        sSQL = sqlStatement
        Set qdf = db.CreateQueryDef("", sSQL)
        qdf.Execute dbFailOnError
    Next sqlStatement
End Sub

到目前为止我所尝试的:

1)

Set qdf = Nothing 
Set db = Nothing

这没有帮助。还是同样的问题。

2) 尝试删除该特定数据库并继续提交到其余数据库,但仍然遇到同样的问题。

需要一些指导来解决这个问题。

【问题讨论】:

看起来传递给函数的dbName参数是NULL 事实并非如此。我正在传递一个 dbName。我也检查了sql语句。 应该是 2 个单独的单词。债券和价值观 bond是表名,values是要插入数据库的值 【参考方案1】:

maximum size of an Access database is 2GB(链接是 2010 年的,但 2013 年似乎是一样的)。所以是的,当数据库变得那么大时,您的插入将失败。您的选择是将数据拆分到另一个数据库文件或切换到 SQL Server 或其他数据库类型。

【讨论】:

或压缩和修复,之后可能只有 100mb 大 ;) 如何压缩和修复?能解释一下吗? 实际上,luk2302 可能意味着压缩和修复(在功能区上的数据库工具下可用)或VBA:Application.compactRepair sourecFile, destinationFile。您可以在每次插入后包含此内容。或者,将您的大文件分成多个 Access 文件,作为链接表、ODBC 或 DAO 连接。

以上是关于在 Access 中执行 qdf.Execute dbFailOnError 时出现运行时错误“3049”的主要内容,如果未能解决你的问题,请参考以下文章

从 .NET 应用程序在 Access 的打开实例中执行函数

立即执行 SELECT,然后通过 .NET 在 Access 中执行 UPDATE

如何在 VBA 代码中的 ms-access 中执行查询?

在 Access DB 上执行 sql 脚本

从 MS Access 执行存储过程导致超时

是否可以在 Access 中执行触发器,在 SqlServer 数据库的表中插入新行?