【问题标题】:Insert into a different Access.accdb select from SQL Server linked table从 SQL Server 链接表中插入不同的 Access.accdb 选择
【发布时间】:2014-02-14 18:34:33
【问题描述】:

我有一个 MS Access 2010 数据库,其中的表链接到 SQL Server 2008R2 后端。

我需要从链接表中选择记录并将它们插入到具有本地表的不同 Access .accdb。

这是我的代码:

Const DbPath = "L:\path\"
Const DbBaseName = "FileTransfer OnSite"
Const DbExt = ".accde"
Const LockDbExt = ".laccdb"
Const ConString = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq="

Dim Con As ADODB.Connection
Dim RS As ADODB.Recordset
Dim DbOutName As String
Dim DbInName As String
Dim Overwrite As Integer
Dim PutStr As String

'do some sanity checking first, then
FileCopy DbInName, DbOutName    'make a physical copy of the blank on-site file
Set Con = New ADODB.Connection
Con.ConnectionString = ConString & DbOutName
Con.Open

PutStr = "INSERT INTO [;Database=" & DbOutName & "].[Loan] (Loan, FromFirm, ToFirm, Borrower, PropStreet, PropCity, PropState, PropZip, Judicial, Examiner) " & _
    "SELECT Loan, FromFirm, ToFirm, Borrower, PropStreet, PropCity, PropState, PropZip, Judicial, Examiner " & _
    "  FROM Loans " & _
    " WHERE FromFirm = '" & Me.cmbFrom & "' " & _
    "   AND ToFirm = '" & Me.cmbTo & "'"
Set RS = Con.Execute(PutStr)

请注意,[;Database=...].[Loan] 是目标数据库的本地表,FROM Loans 引用源数据库(运行此代码的数据库)中的外部链接表。

PutStr 解析为:(为涉及公司的隐私而编辑)

INSERT INTO [;Database=L:\Path\FileTransfer OnSite-E-A.accde].[Loan] (Loan, FromFirm, ToFirm, Borrower, PropStreet, PropCity, PropState, PropZip, Judicial, Examiner)
SELECT Loan, FromFirm, ToFirm, Borrower, PropStreet, PropCity, PropState, PropZip, Judicial, Examiner
  FROM Loans
 WHERE FromFirm = 'E'
   AND ToFirm = 'A'

我在Set RS = 行收到一条错误消息:

Run-time error '-2147217865 (80040e37)':
[Microsoft][ODBC Microsoft Access Driver] The Microsoft Access
database engine cannot find the input table or query 'Loans'. Make
sure it exists and that its name is spelled correctly.

Loans 在 Access 中定义为指向 SQL Server 后端的外部链接表。数据库中的其他代码可以正常访问此表。我想到的一件事是表Loans 不在SQL Server 的默认架构中,但据我所知,Access 目前不在乎。我可以从其他地方的Loans 中进行选择,因为架构信息包含在链接中——Access 只知道它为Loans。我确实尝试将 Loans 引用为 [schema].[Loans],但 Access 也不喜欢这样。

我不确定为什么 Access 找不到在运行代码的数据库中定义的表 Loans。我想我可以把它分解成一个来自 Loans 的 SELECT,然后是一个循环插入到外部 .accdb 中,但如果可能的话,我宁愿在一个查询中干净地完成它。

【问题讨论】:

    标签: ms-access sql-server-2008-r2 vba ms-access-2010


    【解决方案1】:

    在我的 Access 数据库中,我有一个名为 web_links 的链接表,它是一个指向 SQL Server 表的 ODBC 链接。因此,此查询检索该表的所有数据:

    SELECT
        l.link_id,
        l.date_added,
        l.url,
        l.notes
    FROM web_links AS l;
    

    我还有另一个名为 database2.accdb 的 Access db 文件。该数据库包含一个名为 web_links 的本地访问表。

    因此,从我当前的 Access db(我成功运行上述 SELECT 查询的那个),我可以从 SQL Server 检索数据并将这些数据附加到 database2.accdb 中的表中.

    INSERT INTO web_links
        (
            link_id,
            date_added,
            url,
            notes
        ) IN 'C:\share\Access\database2.accdb'
    SELECT
        l.link_id,
        l.date_added,
        l.url,
        l.notes
    FROM web_links AS l;
    

    关键是 Access 让我可以方便地指示将接收附加数据的数据库的位置:

    IN 'C:\share\Access\database2.accdb'
    

    据我所知,此描述与您想要完成的内容相似。如果我猜对了,您就不必为 ADO、连接字符串、对象等而烦恼。只需执行一个查询,告诉数据库引擎在哪里可以找到目标数据库。

    【讨论】:

    • 太棒了,@HansUp!谢谢你。现在,我只需要弄清楚是什么导致 Access 不喜欢我正在写入的文件名,一切都会好起来的。输出名称为:"L:\Default\Default Management\Attorney Oversight\Projects\Firm Transfers\Code\FileTransfer OnSite-Lawye R. Name, P.A.-Other & Firm, P.A..accde"。如果我将输出文件更改为“test.accde”,你的答案就完美了,这个文件名给了我Run-time error '3126': Invalid bracketing of name ...,无论文件是用单引号('')还是括号([])括起来,它都会给我这个错误.
    • 文件名中包含所有这些标点符号,我认为我建议的方法行不通。您必须使用该代码可以处理的不同名称,并在完成后重命名数据库。这应该可以,但不确定你会喜欢多少。
    • 是的,成功了。幸运的是,这是一次性写入,因为我设置了一些数据的异地副本。谢谢,HansUp,正是我需要的指导
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2014-10-05
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多