插入到不同的Access.accdb中,从SQL Server链接表中选择

时间:2014-02-14 18:34:33

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

我有一个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的循环,但是如果可能的话,我宁愿在一个查询中干净地完成它。

1 个答案:

答案 0 :(得分:3)

在我的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表。

因此,从我当前的Access数据库(我成功运行上面的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,连接字符串,对象等等。只需执行一个查询,告诉db引擎在哪里找到目标数据库。

相关问题