1

アクティビティ テーブルのコピーを SQL Server Express テーブルと Access の実稼働バージョンの間で同期させようとしています。他のテーブルでは、SQL Server テーブルの内容を消去し、混乱全体を挿入してすべての変更をキャプチャすることができます。ただし、このテーブルでそれを実行しようとすると、情報が得られますが、Autonumber フィールドは、前回の繰り返しの最後の未使用の番号から増加します。十数回の「同期」操作の後、危険なほどこのフィールドの自動番号が足りなくなりそうです。

Microsoft Access フロント エンド アプリケーションから 'DBCC CHECKIDENT' を発行しようとしましたが、ステートメントが SELECT、DELETE、PROCEDURE、DROP、ALTER などで始まっていないというエラーがスローされます。このコマンドは、SQL Server 管理コンソール (現在のテスト環境ではアクセスできるツールですが、アプリケーションが運用環境になると機能しません) から発行すると機能します。

次に、DoCmd.RunSQL コマンドを使用して 'TRUNCATE TABLE' クエリを試してみましたが、リンクされたテーブルでは操作がサポートされていないというエラーがスローされました (概算)。このテーブルは Microsoft Access フロントエンドにリンクされています (バックエンド テーブルは SQL Server Express 上にあります)。

簡単に要約すると、次のようになります。

  • フロント エンドは、Microsoft Access VBA アプリケーションです。
  • データはリモート マシンの SQL Server Express に保存されます
  • データ テーブルはフロント エンド アプリケーションでリンクされています
  • このアプリケーションが本番環境になると、SQL Server 管理コンソールのコマンドを使用できなくなります。独自にハウスキーピングを実行する必要があります。
  • DoCmd.RunSQL および CurrentDB.Execute は、TRUNCATE TABLE または 'DBCC CHECKIDENT' コマンドの使用を許可していないようです。
  • 前述の関数は両方とも -DO- SQL Server 管理コンソールから発行された場合に機能します - これが実行可能なオプションではない理由については、上記を参照してください。
  • -すべて- 他のテーブルは、このテーブル以外に期待どおりに動作し、必要に応じてインデント フィールドをリセットします。

-- 2011 年 8 月 8 日 15:08 に編集 --

わかりました - VBA ベースのパススルー クエリを何度も試みましたが、いずれも ODBC -- call failed エラーが発生しました。パススルーを処理するために作成したモジュールのコードを次に示します (dbforums.com からコードを借用)。

Function RunPassThrough(ByVal ConnectionString As String, ByVal SQL As String, Optional ByVal QueryName As String)

    Dim dbs As DAO.Database
    Dim qdf As DAO.QueryDef

    Set dbs = CurrentDb
    Set qdf = dbs.CreateQueryDef
    With qdf
        .Name = QueryName
        .Connect = ConnectionString
        .SQL = SQL
        .ReturnsRecords = (Len(QueryName) > 0)
        If .ReturnsRecords = False Then
            .Execute
        Else
            If Not IsNull(dbs.QueryDefs(QueryName).Name) Then dbs.QueryDefs.Delete QueryName
            dbs.QueryDefs.Append qdf
        End If
        .Close
    End With
    Set qdf = Nothing
    Set dbs = Nothing

End Function

そのため、データベースへの接続文字列を指定する必要があります。以下のすべてが失敗しました:

strConnect = "ODBC;DRIVER={SQL Server};SERVER=ENV980-067\ENVIRON_TEST;DATABASE=instkeeper_test;Uid=<my username>;Pwd=<my password>;"

結果: 実行時エラー ODBC -- 呼び出しに失敗しました (エラー #3146)

strConnect = "ODBC;DRIVER={SQL Server};SERVER=ENV980-067\ENVIRON_TEST;DATABASE=instkeeper_test;TRUSTED_CONNECTION=YES;"

結果: 実行時エラー ODBC -- 呼び出しに失敗しました (エラー #3146)

strConnect = "ODBC;DSN=instkeeper_beta;"

結果: データ ソース名を尋ねられます。データ ソース管理パネルで指定すると、Run-time error ODBC -- call failed (error #3146) が表示されます。

strConnect = "ODBC;Server=ENV980-067\ENVIRON_TEST;Database=instkeeper_test;User ID=<my user name>;Password=<my password>;Trusted_Connection=False;"

結果: 実行時エラー ODBC -- 呼び出しに失敗しました (エラー #3146)

-- 2011 年 8 月 8 日 16:41 に編集 --

接続文字列の繰り返しでさらに多くの失敗がありました。この獣を機能させる方法について、私は正式にアイデアがありません。前の方法を試した後、DSN を要求した後、インターフェイスで作成されたパススルーが失敗します。リンクされたテーブルを呼び出して JET を実行するには、修復する必要があります。

strConnect = "ODBC;DATA SOURCE=instkeeper_test;"

結果: 実行時エラー ODBC -- 呼び出しに失敗しました (エラー #3146)

strConnect = "ODBC;DRIVER=SQL Server;SERVER=ENV980-067\ENVIRON_TEST;"

結果: 実行時エラー ODBC -- 呼び出しに失敗しました (エラー #3146)

strConnect = "ODBC;DRIVER=SQL Server;Server=ENV980-067\ENVIRON_TEST;Database=instkeeper_test;User ID=<my user name>;Password=<my password>;"

結果: 実行時エラー ODBC -- 呼び出しに失敗しました (エラー #3146)

4

3 に答える 3

1

SQL Server 側では、次のことができます。

  1. 別のDBCCコマンドを使用する

    DBCC CHECKIDENT ('MyTable', RESEED, 1)

  2. または、TRUNCATE TABLE ...を使用します。

テーブルに ID 列が含まれている場合、その列のカウンターは列に定義されたシード値にリセットされます。シードが定義されていない場合、デフォルト値 1 が使用されます。

だからあなたは走るだろう

TRUNCATE TABLE MyTable
于 2011-08-08T16:42:58.173 に答える
0

すべてのコードを確認し、ローカルの VBA 専門家に確認したところ、パススルー クエリを実行しようとしたときにテーブルの名前付けに誤りがあったことが指摘されました。私は基本的に、バックエンドの SQL Server にある実際のテーブル名ではなく、フロントエンドでリンクとして持っている名前でテーブルを参照していました。

これが修正されると、次の接続文字列が機能しました。

strConnect = "ODBC;DRIVER={SQL Server};SERVER=ENV980-067\ENVIRON_TEST;DATABASE=instkeeper_test;TRUSTED_CONNECTION=YES;"

これにより、リモート テーブルで TRUNCATE TABLE コマンドを実行し、DoCmd.RunSQL ステートメントを実行して、運用ソースからテーブルを再作成することができました。

最終的な結果として、アクティビティを更新するオプションが選択されると、リモート テーブルの内容が消去され、自動番号のリセット中に使用するために本番テーブルの内容がテスト テーブルに読み込まれます。

于 2011-08-09T21:02:22.170 に答える