2014-02-14 73 views
1

我有一个MS Access 2010数据库,并且链接到SQL Server 2008R2后端的表。插入到不同的Access.accdb从SQL Server链接表中选择

我需要从链接表中选择记录并将它们插入不同访问.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) 

注意[;数据库= ...] [贷款]是一个本地表到目标数据库,并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在访问定义为外部链接表到SQL Server后端。数据库中的其他代码正在正常工作访问此表。我想到的一件事是,表Loans不在SQL Server的默认架构中,但据我所知,Access在这一点上并不在意。我可以从其他地方的Loans中进行选择,因为模式信息包含在链接中--Access只知道它为Loans。我确实尝试了Loans作为[schema].[Loans],但是Access也不喜欢那样。

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

回答

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数据库文件。该数据库包含一个名为的本机访问表web_links

所以从我目前的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; 

关键的一点是,访问让我方便地表示将接收的附加数据的数据库的位置:

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

尽我所知,这说明类似于你”重新努力完成。如果我得到了正确的结果,你就不需要打扰ADO,连接字符串,对象等等。只需执行一个查询,告诉数据库引擎在哪里可以找到目标数据库。

+0

非常好,@HansUp!谢谢。现在,我只需要弄清楚什么原因导致Access不喜欢我正在写的文件名,并且一切都会很好。输出名称为:“L:\ Default \ Default Management \ Attorney Oversight \ Projects \公司转移\代码\ FileTransfer OnSite-Lawye R.名称,P.A.-其他&公司,P.A..accde”'。如果我将输出文件更改为“test.accde”,则您的答案完美工作,此文件名给我发出'运行时错误'3126':无效的名称包围......'无论文件是否包含用单引号('')或括号([])表示。 – FreeMan

+1

在文件名中包含所有标点字符的情况下,我不认为我建议的方法可以工作。您必须使用该代码可以处理的其他名称,并在完成后重命名数据库。这应该有效,但不知道你会喜欢多少。 – HansUp

+0

是的,这是诀窍。幸运的是,这是一次性写入,因为我建立了一些数据的非现场副本。谢谢,HansUp,正是我需要的指导 – FreeMan

相关问题