2

MSAccess2007フロントエンドとSQLServerExpressバックエンドがあります。(これは元々、アクセスデータベースからアップサイズされました)。

このデータベースは本番環境からコピーされ、別の場所/ドメインで本番環境サーバーに実行されています。これは開発に使用されます。私が持っているのは2つの接続文字列なので、サーバー/データベースを切り替えることができます。

SQL認証を使用して接続し、ODBC接続文字列を介してMSAccessリンクテーブルを接続します。

SQLユーザーはデータベースへのdbowner権限/アクセス権を持っています

リンクテーブルは正常に更新され、フロントエンドでテーブルを開いてテーブル内のデータを変更できますが、標準のAccessフォームを開こうとすると、ほとんどがテーブルに直接リンクされ、「接続に失敗しました... ..サーバーが存在しないか、アクセスが拒否されました。」次に、テーブルが現在接続されているサーバーではなく、元のサーバー名でSQLServerログオンボックスが表示されます。

参照用の接続文字列は次のとおりです。{DimsLocalNameAs String Dim tdf As TableDef Dim rs As dao.Recordset

''This is a basic connection string, you may need to consider password and so forth
' cn = "ODBC;DSN=aid_dev;Trusted_Connection=No;APP=Microsoft Office 2007;DATABASE=aid_dev;"
cn = "ODBC;DRIVER=SQL Server;SERVER=KAL1\SQLEXPRESS;DATABASE=aid_dev;Uid=User;Pwd=Password"

''All fields fro`enter code here`m tables
strSQL = "SELECT TABLE_CATALOG, " _
& "TABLE_SCHEMA, " _
& "TABLE_NAME, " _
& "TABLE_TYPE " _
& "FROM [" & cn & "].INFORMATION_SCHEMA.tables " _
& "WHERE TABLE_TYPE = 'BASE TABLE'"

Set rs = CurrentDb.OpenRecordset(strSQL)

Do While Not rs.EOF
    sLocalName = rs!TABLE_SCHEMA & "_" & rs!TABLE_NAME

    With CurrentDb
        If DLookup("Name", "MSysObjects", "Name='" & sLocalName & "'") <> vbNullString Then
            If .TableDefs(sLocalName).Connect <> cn Then
                .TableDefs(sLocalName).Connect = cn
                .TableDefs(sLocalName).RefreshLink
            End If
        Else
            ''If the table does not have a unique index, you will neded to create one
            ''if you wish to update.
            Set tdf = .CreateTableDef(sLocalName)
            tdf.Connect = cn
            tdf.SourceTableName = rs!TABLE_NAME
            .TableDefs.Append tdf
            .TableDefs.Refresh

            ''This will produce a message box if the table does not have a unique index
            ''DoCmd.TransferDatabase acLink, "ODBC Database", cn, acTable, rs!TABLE_NAME, sLocalName
        End If
    End With
    rs.MoveNext
Loop}

前もって感謝します

ロジャー

編集-問題を発見しましたが、対処方法 接続を確立すると、実際にはSQLテーブルへのリンクが作成されますが、dbo.Tablenameとして作成されます。フォームはdbo.tablenamesではなくテーブル名のみを指しているため、これですべてのレポートが壊れます。元のリンクは、同じ元の接続プロパティで引き続き存在します。

1)元のテーブル接続プロパティを変更する方法または2)dbo.tablenameの名前をtablenameに変更する方法

または、すべてのフォームクエリなどを変更するだけですか。

これが私を怒らせるのを手伝ってください。

ありがとう

ロジャー

4

3 に答える 3

1

" SQL テーブルへのリンクを作成しますが、dbo.Tablename として"

その点を再確認してください。このコードではTABLE_SCHEMA、 とTABLE_NAMEを使用してリンク名を作成し、アンダースコア (ドットではない) を使用してそれらを結合しています。したがってdbo.Tablename、リンク名の代わりに、 が表示されますdbo_Tablename

Tablenameフォームがリンク名だけを想定している場合、 2 つの選択肢があります。

  1. フォームのデータ ソース プロパティを変更して使用するdbo_Tablename
  2. リンクに名前を付けるようにコードを変更しTablenameますdbo_Tablename

Tablenameこのようなリンク名として使用するコードを変更できます...

'sLocalName = rs!TABLE_SCHEMA & "_" & rs!TABLE_NAME '
sLocalName = rs!TABLE_NAME

この点がそのコードから明らかでない場合、リンクを作成すると、そのリンクされたデータは読み取り専用になります。リンクされたデータを、それを使用するフォームで編集可能にしたい場合は、さらに作業が必要です。

于 2012-08-18T15:44:52.747 に答える
1

これは、テーブル名を変更するために使用する関数です。起動時にこれを実行します:

Public Sub subChangeLinkedTableNames()

    Dim dbCurr As DAO.Database
    Dim tdfCurr As DAO.TableDef

    Set dbCurr = CurrentDb()

    For Each tdfCurr In dbCurr.TableDefs
        If Len(tdfCurr.Connect) > 0 Then
            If Left(tdfCurr.Name, 4) = "dbo_" Then
                tdfCurr.Name = Replace(tdfCurr.Name, "dbo_", "")
            End If
        End If
    Next


    Set tdfCurr = Nothing
    Set dbCurr = Nothing

End Sub

私は今、別の方法に行きました。データベース アプリケーションが読み込まれるたびに、既存のリンク テーブルをすべて削除して再構築します。ADO 接続を使用して SQL Server に接続し、_LinkedTables というテーブルを使用して ADO レコードセットをロードする独自の方法を考案しました。このテーブルには、実際のテーブル名と LinkAs 名を含むすべてのリンクを作成するために必要な情報が含まれています (これにより、別の名前を使用してテーブルにリンクすることができ、ビューなどに役立ちます)。主キー フィールド名を含むフィールドもあります。

SQL Server への最初の ADO 接続を確立するために必要な情報は、tblDatabase のような名前のフロントエンド ファイル内のローカルの静的テーブルに含まれています。ここには、ADO と ODBC の両方の接続文字列があります。開発用と本番用で異なるデータベースを使用できるように、私はそれを書いています。

これは、関連するテーブルとコードのウェブが多すぎてここに投稿するには多すぎるため、実際にはそれほど高度ではありません。

データベースがロードされるたびにリンクを更新するだけの人もいますが、これは問題なく機能します。各テーブルを削除して再リンクしたのには非常に具体的な理由があり、それが何であったかを正確に思い出せません。私はデータベースで多くの作業を行っていたという事実と関係があり、既存のフロントエンドファイルにも変更をできるだけ早く反映させたいと考えていました (エラーが発生した場合に備えて)。既存のテーブル リンクを再リンクするだけでなく、ユーザーが閉じてから再度開いて、ほんの 1 秒前にはリンクされていなかったテーブルにリンクできる機能が必要でした。しかし、それは実際には一種のフリンジ ケースであり、かなりの余分な読み込み時間を引き起こす過剰な可能性が非常に高いです。20台あればOKです。200 あれば、おそらく得策ではありません。

于 2012-08-18T14:44:58.007 に答える
1

コードは次からローカル名を取得しています。

 sLocalName = rs!TABLE_SCHEMA & "_" & rs!TABLE_NAME

rs!TABLE_SCHEMA & "_" &ただし、「dbo_」を取得する場所であるを含める必要はありません。

そう

 sLocalName = rs!TABLE_NAME

実際、ローカル名は多かれ少なかれ好きなものにすることができます。

于 2012-08-18T20:31:36.927 に答える