sql >> データベース >  >> RDS >> Sqlserver

パススルー/パススルークエリを編集可能にするにはどうすればよいですか?

    上記の私のコメントとYawarの回答に沿って、パススルークエリが編集/更新可能であることに気づいていません。保存パススルークエリオブジェクトを編集できるという意味で編集可能ですが、パススルークエリで編集可能なレコードセットを作成することはできないと思います。

    AccessをAccess以外のデータソースに接続するには、基本的に2つの方法があります。

    最初の方法で最も一般的な方法は、何らかの形式のリンクテーブル、通常はODBCリンクテーブルを使用することです。 MS AccessでODBCリンクテーブルを使用するにはさまざまな方法がありますが、ほとんどの開発者は、アプリケーションの起動時に更新または再構築(削除および再接続)されるDSN-Less接続を使用することを好みます。 ODBCを使用する場合は、DAOも使用していることに注意してください。 DAOはMSAccessに組み込まれているデフォルトのデータアクセスオブジェクトであり、DAOコードを特に記述していなくても、MS Accessはフォーム、レポート、クエリをデータソースにリンクするために内部でDAOを使用しています。 ODBCの場合、実際には、DAOとODBCの2つのデータアクセスレイヤーが機能することになります。ただし、ODBC / DAOは、コードを記述せずに(ODBCリンクテーブルを維持する以外に)かなり適切なパフォーマンスで使用できます。

    2番目の方法は、ADOを使用することです。一般に信じられていることとは反対に、これはバインドされていないフォームを使用する必要があるという意味ではありません。ただし、JET / DAO/MSAccessまたはDAO/ODBC /SSQLServerを使用するよりも多くのコードを作成する必要があることを意味します。データベースからADORecordsetにレコードを取り込むコードを記述してから、コードを使用してフォームをそのRecordsetにバインドする必要があります。子フォームを親フォームと同期させたり、新しいレコードが作成されたときに外部キーを子フォームに挿入したり、フォームに組み込まれているフィルタリングや並べ替えとしてのフィルタリングや並べ替えなど、さまざまなコードを記述したりする必要があります。オプションは通常、ADOレコードセットでは機能しません。 ADOは、SQL Serverと通信するための優れた方法です。これは、実際に多くの制御を提供するためですが、コードが集中し、ODBCリンクテーブルが非常にうまく機能するため、他に方法がない場合を除いて、ほとんどの開発者はADOの使用を推奨しません。あなたがしたい。この一例は、ストアドプロシージャの呼び出しです。パススルークエリを使用してストアドプロシージャを呼び出すことができると思いますが、そこにはいくつかの制限もあると思います(パラメータの使用など)。ほとんどの場合、開発者はADOを使用してストアドプロシージャを呼び出すと思います。私はADOをよく使用しますが、ストアドプロシージャはあまり使用しないので(まだ)、それに関する情報はあまりありません。

    言及する価値のあるもう1つのことは、ODBCを使用するDAOは「遅延読み込み」を使用しますが、ADOはすべてのデータをプルすることを強制します。これは、非常に時間がかかり、数百万を超える行がある場合に大量のメモリを消費する可能性があります。そうしないと、ある種のページングを実装する必要があります。

    単一のDSN-LessODBCリンクテーブルを作成するための私自身の関数を以下に示します。 AccessとVBAを初めて使用する場合、これはおそらくあまり意味がありません。このコードは、リンクしようとしているテーブルにすでに存在するテーブル定義を削除します。これは、リンクされていないローカルのテーブルを削除する可能性があるため、少し危険です。ここでのエラー処理も実際には高速ではありませんが、ほとんどのオンラインサンプルコードでは、複雑な問題が発生するため、適切なエラー処理が行われていません。リンクテーブルに主キーインデックスを作成する必要は必ずしもありません。特定のプロジェクトで一度必要だったので、関数に組み込んだだけなので、今はそのままにして、良くも悪くも使用しています。

    このコードを適切に使用するには、リンクされているすべてのテーブルのリストをどこかに置き、そのリストを繰り返し処理して、テーブルごとにこの関数を呼び出す必要があります。この関数を使用すると、SQLServerでの実際の名前とは異なる名前を使用してテーブルをリンクできます。また、この関数にも渡す必要がある有効なODBC接続文字列を作成する方法が必要です。

    Private Sub LinkODBCTable(sSourceTableName As String, _
                            sLocalTableName As String, _
                            sPrimaryKeyField As String, _
                            sConString As String)
    
        Dim dbCurrent As DAO.Database
        Dim tdfCurrent As DAO.TableDef
        Set dbCurrent = DBEngine.Workspaces(0).Databases(0)
    
        On Error Resume Next
        'Be Careful, this could delete a local, non-linked table.
        dbCurrent.TableDefs.Delete sLocalTableName
        If Err.Number <> 0 Then
            If Err.Number = 3011 Then
                'Table does not exist
            Else
                MsgBox "Error in LinkODBCTable" & vbCrLf & vbCrLf & Err.Number & " " & Err.Description
            End If
            Err.Clear
        End If
    
        On Error GoTo 0
    
        Set tdfCurrent = dbCurrent.CreateTableDef(sLocalTableName)
        tdfCurrent.Connect = sConString
        tdfCurrent.sourceTableName = sSourceTableName
        dbCurrent.TableDefs.Append tdfCurrent
    
        On Error Resume Next
        If sPrimaryKeyField <> "" Then
            dbCurrent.Execute "CREATE INDEX __UniqueIndex ON [" & sLocalTableName & "] (" & sPrimaryKeyField & ")", dbFailOnError
            If Err.Number <> 0 Then
                If Err.Number = 3283 Then
                    'Primary Key Already Exists
                Else
                    MsgBox "Error in LinkODBCTable" & vbCrLf & vbCrLf & Err.Number & " " & Err.Description
                End If
                Err.Clear
            End If
        End If
    
        Set tdfCurrent = Nothing
        Set dbCurrent = Nothing
    End Sub
    

    DAO、ADO、パススルークエリ、SQLServerなどに関して確認する必要のある非常に優れたリソースがいくつかあります。

    http://technet.microsoft.com /en-us/library/bb188204%28v=sql.90%29.aspx
    http://www.utteraccess.com/wiki/Choosing_between_DAO_and_ADO

    フォームをADORecordsetにバインドする例を次に示します。ただし、アプリケーションの実行時に開いたままのグローバル接続オブジェクトを用意するのが最善であるため、少し誤解を招く可能性があります。これにより、自動的に更新可能なADOレコードセットを使用できます。この方法を使用すると、レコードセットがフォームレベルのオブジェクトになる場合もあります。

    http://msdn.microsoft .com / en-us / library / office / bb243828%28v =office.12%29.aspx



    1. オブジェクト配列をnodejs/pg/unnestと互換性のある配列に変換します

    2. ユーザーの友達と友達の友達を取得するSQL

    3. mysqlで使用されている接続を監視して「接続が多すぎます」をデバッグします

    4. Zend_Auth_Adapter_DbTableに指定されたパラメーターは、有効なSQLステートメントを生成できませんでした