2016-07-01 5 views
2

현재 VBA 모듈을 통해 동적으로 사용자 서식을 작성하는 액세스 응용 프로그램을 개발 중입니다. 양식을 작성하려면 MS SQL DB에서 데이터가 필요합니다. https://support.microsoft.com/en-us/kb/892490연결된 테이블 연결을 편집 할 수 없기 때문에 내 userform이 비어있게됩니다.

userinputs

가 다른 연결된 테이블로 정의 폼에 수집하고,이어서 삽입 (: I는 AttachDSNlessTable 방법을 사용하여, 전체 출원의 개시시에 확립 연결된 테이블 연결을 통해 데이터를 수집 : ResultTables)를 동일한 SQL Server에 저장합니다.

내 문제 VB 기반 연결 테이블 연결을 사용하면 사용자 정의 입력을 결과 테이블에 삽입 할 수 없습니다. FormView에서 양식을 볼 때 대신 완전히 비어 있습니다. DesignView에서는 모든 컨트롤을 볼 수 있습니다.

테이블에 새 행을 채울 수있는 인덱스를 선택할 수 있기 때문에 수동으로 연결된 테이블을 만들 때 문제가 존재하지 않습니다.

나는 사용자가 업데이트/삽입/삭제 절차를 수행하기 위해 SQL Server에 대한 올바른 액세스 권한을 가지고 있음을 확신합니다. 서버에서 테이블의 인덱스를 만들려고 시도했지만 인덱스는 Access에서 고유하지 않습니다. 표가 연결되면 연결을 수정할 수 없습니다. 자동으로 기본 키를 감지합니다는 SQL Server 테이블을 연결
https://support.microsoft.com/en-us/kb/93261

Option Compare Database 

'//Name  : AttachDSNLessTable 
'//Purpose : Create a linked table to SQL Server without using a DSN 
'//Parameters 
'//  stLocalTableName: Name of the table that you are creating in the current database 
'//  stRemoteTableName: Name of the table that you are linking to on the SQL Server database 
'//  stServer: Name of the SQL Server that you are linking to 
'//  stDatabase: Name of the SQL Server database that you are linking to 
'//  stUsername: Name of the SQL Server user who can connect to SQL Server, leave blank to use a Trusted Connection 
'//  stPassword: SQL Server user password 
Function AttachDSNLessTable(stLocalTableName As String, stRemoteTableName As String, stServer As String, stDatabase As String, Optional stUsername As String, Optional stPassword As String) 
    On Error GoTo AttachDSNLessTable_Err 
    Dim td As TableDef 
    Dim stConnect As String 

    For Each td In CurrentDb.TableDefs 
     If td.Name = stLocalTableName Then 
      CurrentDb.TableDefs.Delete stLocalTableName 
     End If 
    Next 

    If Len(stUsername) = 0 Then 
     '//Use trusted authentication if stUsername is not supplied. 
     stConnect = "ODBC;DRIVER=SQL Server;SERVER=" & stServer & ";DATABASE=" & stDatabase & ";Trusted_Connection=Yes" 
    Else 
     '//WARNING: This will save the username and the password with the linked table information. 
     stConnect = "ODBC;DRIVER=SQL Server;SERVER=" & stServer & ";DATABASE=" & stDatabase & ";UID=" & stUsername & ";PWD=" & stPassword 
    End If 
    Set td = CurrentDb.CreateTableDef(stLocalTableName, dbAttachSavePWD, stRemoteTableName, stConnect) 
    CurrentDb.TableDefs.Append td 
    CurrentDb.TableDefs.Refresh 
    'td.CreateIndex (ID2) 
    AttachDSNLessTable = True 
    Exit Function 

AttachDSNLessTable_Err: 

    AttachDSNLessTable = False 
    MsgBox "AttachDSNLessTable encountered an unexpected error: " & Err.Description 

End Function 

답변

1

: 나는 또한 빈 정의 폼에 대한 제안 방법을 시도했습니다. 그것은 나를 위해 DoCmd.TransferDatabase TransferType:=acLink을 사용하여 작동합니다.

분명히 CurrentDb.CreateTableDef 방법에서는 작동하지 않습니다.

그래서 나는 테이블에 연결하려면이 명령을 사용하는 것이 좋습니다 : 좀 더 DSN없는 연결된 테이블 here를 만드는 방법에 대해 쓴

DoCmd.TransferDatabase TransferType:=acLink, _ 
    DatabaseType:="ODBC", _ 
    DatabaseName:=stConnect, _ 
    ObjectType:=acTable, _ 
    Source:=stRemoteTableName, _ 
    Destination:=stLocalTableName, _ 
    StructureOnly:=False, _ 
    StoreLogin:=True 

을하지만, 대부분의 연결 SQL 서버보기는 PK의 ISN을 다루고 자동으로 감지하지 못했습니다.

0

답장을 보내 주셔서 감사합니다. 결국 기본 키에 대한 create-sql-statement를 만들었습니다. 원활하게 작동합니다.

SQL_PrimaryKey = "CREATE INDEX PrimaryKey ON " & QMT_QMTmonitoring_TransactionFact & _ 
       " (ID) WITH PRIMARY" 
Database_Link.Execute SQL_PrimaryKey