2009-06-24 8 views
4

データストアとしてSQL Serverを使用するようにアップグレードするアクセスデータベースに問題があります。MS AccessがSQLサーバービューにリンクされています

この特定のデータベースは2つのSQLデータベースにリンクしているので、私は単純化すると思ったので、メインデータベースにはセカンダリデータベースの各テーブルにリンクされたビューがあります。そうすれば、アクセスは1つのSQLデータベースと直接対話するだけで済みます。

データベースビューへのアクセスをリンクすると、どのフィールドがプライマリキーであるかを選択するので、ビューは読み込み専用ではありません。主キー情報が失われたために、データベースが変更を取得してリンクされたビューが読み取り専用になると、すべてのリンクを更新する標準コードがあります。

主キー情報を保持したまま、ビューへのリンクをリフレッシュする方法はありますか?

ジョン

+1

どのようにリンクをリフレッシュしていますか?また、 - そのDB構造(SQLサーバー内)は頻繁にアクセスしてその情報を取得しますか? – shahkalpesh

答えて

4

のようなものを試してみてください。この関数は、再接続を行うために必要なすべての情報を格納するテーブルrtblODBCを持っているという考えに基づいています。この機能を実装すると、複数のSQLデータベースに接続することについて心配する必要はありません。それは、各テーブルが独自の接続文字列を使用して再接続されるようにスムーズに処理されるためです。

あなたは終わりに向かって取得するときに、PRIMARY WITH & sLocalTableName & "(" & sPrimaryKeyField &「) "ON" & sPrimaryKeyName & "CREATE INDEXを" 私はdb.Executeで主キーを再作成するためにDAOを使用していることがわかります。 "

ご不明な点がありましたら、お尋ねください。

Public Function fnReconnectODBC(_ 
    Optional bForceReconnect As Boolean _ 
    ) As Boolean 
    ' Comments : 
    ' Parameters: bForceReconnect - 
    ' Returns : Boolean - 
    ' Modified : 
    ' --------------------------------------------------' 

    On Error GoTo Err_fnReconnectODBC 

    Dim db As DAO.Database 
    Dim rs As DAO.Recordset 
    Dim tdf As DAO.TableDef 
    Dim sPrimaryKeyName As String 
    Dim sPrimaryKeyField As String 
    Dim sLocalTableName As String 
    Dim strConnect As String 
    Dim varRet As Variant 

    Dim con As ADODB.Connection 
    Dim rst As ADODB.Recordset 
    Dim sSQL As String 

    If IsMissing(bForceReconnect) Then 

     bForceReconnect = False 

    End If 

    sSQL = "SELECT rtblODBC.LocalTableName, MSysObjects.Name, MSysObjects.ForeignName, rtblODBC.SourceTableName, MSysObjects.Connect, rtblODBC.ConnectString " _ 
     & "FROM MSysObjects RIGHT JOIN rtblODBC ON MSysObjects.Name = rtblODBC.LocalTableName " _ 
     & "WHERE (((rtblODBC.ConnectString)<>'ODBC;' & [Connect]));" 

    Set con = Access.CurrentProject.Connection 
    Set rst = New ADODB.Recordset 

    rst.Open sSQL, con, adOpenDynamic, adLockOptimistic 

     'Test the recordset to see if any tables in rtblODBC (needed tables) are missing from the MSysObjects (actual tables) 
     If rst.BOF And rst.EOF And bForceReconnect = False Then 

      'No missing tables identified 
      fnReconnectODBC = True 

     Else 

      'Table returned information, we don't have a perfect match, time to relink 
      Set db = CurrentDb 
      Set rs = db.OpenRecordset("rtblODBC", dbOpenSnapshot) 

       'For each table definition in the database collection of tables 
       For Each tdf In db.TableDefs 

        'Set strConnect variable to table connection string 
        strConnect = tdf.Connect 

        If Len(strConnect) > 0 And Left(tdf.Name, 1) <> "~" Then 

         If Left(strConnect, 4) = "ODBC" Then 

          'If there is a connection string, and it's not a temp table, and it IS an odbc table 
          'Delete the table 
          DoCmd.DeleteObject acTable, tdf.Name 

         End If 

        End If 

       Next 

       'Relink tables from rtblODBC 
       With rs 

        .MoveFirst 

        Do While Not .EOF 

         Set tdf = db.CreateTableDef(!localtablename, dbAttachSavePWD, !SourceTableName, !ConnectString) 

         varRet = SysCmd(acSysCmdSetStatus, "Relinking '" & !SourceTableName & "'") 

         db.TableDefs.Append tdf 
         db.TableDefs.Refresh 

         If Len(!PrimaryKeyName & "") > 0 And Len(!PrimaryKeyField & "") > 0 Then 

          sPrimaryKeyName = !PrimaryKeyName 
          sPrimaryKeyField = !PrimaryKeyField 
          sLocalTableName = !localtablename 

          db.Execute "CREATE INDEX " & sPrimaryKeyName & " ON " & sLocalTableName & "(" & sPrimaryKeyField & ")WITH PRIMARY;" 

         End If 

         db.TableDefs.Refresh 

         .MoveNext 

        Loop 

       End With 

      subTurnOffSubDataSheets 

      fnReconnectODBC = True 

     End If 

    rst.Close 
    Set rst = Nothing 

    con.Close 
    Set con = Nothing 


Exit_fnReconnectODBC: 

    Set tdf = Nothing 
    Set rs = Nothing 
    Set db = Nothing 

    varRet = SysCmd(acSysCmdClearStatus) 

    Exit Function 

Err_fnReconnectODBC: 

    fnReconnectODBC = False 

    sPrompt = "Press OK to continue." 
    vbMsg = MsgBox(sPrompt, vbOKOnly, "Error Reconnecting") 
    If vbMsg = vbOK Then 

     Resume Exit_fnReconnectODBC 

    End If 

End Function 
+0

David、 コードでコードを追加しようとするとエラー3264が発生します。 John –

+1

David、 若干の修正を加えて、テーブルを削除して再作成する代わりに、DAO refreshlinkを使用してインデックスを作成し、非常にうまく動作します。助けをありがとう –

+0

私はあなたのために働いてうれしいです。 –

1

SQLサーバーへのアクセスのテーブルリンクの再DSN以下のコードの良い取引を頻繁にして、リンクを再作成し、最初のリンクを削除します。コードは接続文字列を設定します。したがって、それは主キーがあったものを失う原因となる削除です。

実際には、テーブルリンクを削除しないようにリリンクコードを変更することをお勧めします。私は以下の私の全体のODBC再接続機能が含まれている

For Each tdfCurrent In dbCurrent.TableDefs 
    If Len(tdfCurrent.Connect) > 0 Then 
     If Left$(tdfCurrent.Connect, 5) = "ODBC;" Then 
     strCon = "ODBC;DRIVER={sql server};" & _ 
      "SERVER=" & ServerName & ";" & _ 
      "DATABASE=" & DatabaseName & ";" & _ 
      "UID=" & UserID & ";" & _ 
      "PWD=" & USERpw & ";" & _ 
      "APP=Microsoft Office 2003;" & _ 
      "WSID=" & WSID & ";" 
     End If 
    End If 
    tdfCurrent.Connect = strCon 
    tdfCurrent.RefreshLink 
    End If 
Next tdfCurrent 
0

これは、(の場合は移動し最後に注意してください)私のためリッテ良い作品:

Dim dbCurrent As Database 
Set dbCurrent = CurrentDb() 

StatusList.SetFocus 
StatusList.AddItem ("starting... ") 
I = DoEvents() 
Dim tdfCurrent As DAO.TableDef 
For Each tdfCurrent In dbCurrent.TableDefs 
    If Len(tdfCurrent.Connect) > 0 Then 
     If Left$(tdfCurrent.Connect, 5) = "ODBC;" Then 
     strCon = "ODBC;DRIVER={sql server};" & _ 
      "SERVER=" & ServerName & ";" & _ 
      "DATABASE=" & DatabaseName & ";" & _ 
      "UID=" & UserID & ";" & _ 
      "PWD=" & USERpw & ";" & _ 
      "APP=Microsoft Office 2003;" & _ 
      "WSID=" & WSID & ";" 

      StatusList.AddItem ("fixing " & tdfCurrent.Name) 
     tdfCurrent.Connect = strCon 
     tdfCurrent.RefreshLink 
    End If 
    End If 
    I = DoEvents() 
Next tdfCurrent 

    StatusList.AddItem ("----Done.") 

ODBCチェックは、正しいされていても "ODBC;"一部はMSysObjectsビューに表示されません。

関連する問題