2014-02-14 8 views
1

SQL Server 2008R2 백엔드에 연결된 테이블이있는 MS Access 2010 데이터베이스가 있습니다.SQL Server의 연결된 테이블에서 다른 Access.accdb를 삽입하십시오.

연결된 테이블에서 레코드를 선택하고 다른 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) 

참고 [; 데이터베이스 = ...] [대출] 대상 데이터베이스에 로컬 테이블이며, FROM Loans 참조 외부에서 연결된 테이블에서 해당. 소스 db (이 코드가 실행되고있는 곳).

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가 외부로 액세스에 정의되어

PutStr는로 확인 연결된 테이블을 SQL Server 백엔드에 연결합니다. db의 다른 코드는이 테이블에 잘 액세스하고 있습니다. 내가 생각한 한 가지는 테이블 Loans이 SQL Server의 기본 스키마에 없지만 지금까지는 액세스가 신경 쓰지 않는다는 것입니다. 스키마 정보가 링크에 포함되어 있으므로 다른 곳에서 Loans에서 선택할 수 있습니다. - 액세스는 단지 Loans으로 알고 있습니다. 나는 Loans[schema].[Loans]으로 참조하려고 시도했지만, Access는 그 중 하나를 좋아하지 않았습니다.

Access가 코드가 실행되는 DB에 정의 된 Loans 테이블을 찾을 수없는 이유가 확실하지 않습니다. 나는 이것을 loans의 SELECT, 그리고 외부 .accdb에 삽입하는 루프로 나눌 수 있다고 생각했지만 가능하다면 단일 쿼리에서이를 깨끗하게 처리하고 싶습니다.

답변

3

내 Access 데이터베이스에서 SQL Server 테이블에 대한 ODBC 링크 인 web_links이라는 연결된 테이블이 있습니다. 그래서이 쿼리는 모든 테이블의 데이터를 검색합니다

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

그리고 database2.accdb라는 이름의 또 다른 액세스 DB 파일이 있습니다. 그 db는 web_links이라는 네이티브 액세스 테이블을 포함하고 있습니다.

그래서 내 현재 액세스 데시벨 (I 성공적으로 위의 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, 연결 문자열, 객체 등을 신경 쓰지 않아도됩니다. db 엔진에 대상 데이터베이스를 찾을 위치를 알려주는 쿼리를 실행하기 만하면됩니다.

+0

우수한 @HansUp! 고맙습니다. 이제는 Access에서 파일 이름을 좋아하지 않게 만드는 원인을 알아 내야합니다. 그러면 모두 잘 될 것입니다. 출력 이름은 다음과 같습니다. "L : \ Default \ Default Management \ 변호사 감독 \ 프로젝트 \ 회사 전송 \ Code \ FileTransfer OnSite-Lawye R. Name, P.A.- Other & Firm, P.A..accde". 출력 파일을 "test.accde"로 변경하면 답변이 완벽하게 작동합니다.이 파일 이름은'런타임 오류 '3126': 이름이 잘못되었습니다 ... '라는 메시지가 나타납니다. 파일이 묶여 있는지 여부를 알려줍니다 작은 따옴표 ('') 또는 대괄호 ([])로 묶습니다. – FreeMan

+1

파일 이름에있는 모든 구두점 문자를 사용하면 제안한 접근 방식이 효과가 있다고 생각하지 않습니다. 그 코드가 처리 할 수있는 다른 이름을 사용해야하고, 완료된 후에 db의 이름을 변경해야합니다. 그게 효과가 있지만 얼마나 좋아할 지 확신 할 수 없습니다. – HansUp

+0

예, 그 트릭을했습니다. 다행히도 일부 데이터의 오프 사이트 사본을 설정하면 이는 일회성 쓰기입니다. 고마워, 한샘, 내가 필요한 지침 – FreeMan

관련 문제