データ ソースへの接続 (ODBC)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

アプリケーションは、環境ハンドルと接続ハンドルを割り当て、任意の接続属性を設定してから、データ ソースまたはドライバーに接続します。 接続には、次の 3 つの関数を使用できます。

  • SQLConnect

  • SQLDriverConnect

  • SQLBrowseConnect

使用できるさまざまな接続文字列オプションなど、データ ソースへの接続の詳細については、「SQL Server Native Clientでの接続文字列キーワードの使用」を参照してください。

SQLConnect

SQLConnect は最も単純な接続関数です。 この関数は、データ ソース名、ユーザー ID、パスワードの 3 つのパラメーターを受け取ります。 これら 3 つのパラメーターにデータベースへの接続に必要なすべての情報が含まれている場合は 、SQLConnect を使用します。 これを行うには、SQLDataSources を使用してデータ ソースの一覧を作成します。データ ソース、ユーザー ID、パスワードの入力をユーザーに求める。SQLConnect を呼び出します。

SQLConnect では、データ ソース名、ユーザー ID、パスワードでデータ ソースに接続するのに十分であり、ODBC データ ソースには、ODBC ドライバーが接続するために必要なその他のすべての情報が含まれていることを前提としています。 SQLDriverConnectSQLBrowseConnect とは異なり、SQLConnect では接続文字列は使用されません。

SQLDriverConnect

SQLDriverConnect は、データ ソース名、ユーザー ID、パスワードよりも多くの情報が必要な場合に使用されます。 SQLDriverConnect のパラメーターの 1 つは、ドライバー固有の情報を含む接続文字列です。 SQLConnect の代わりに SQLDriverConnect使用する理由は次のとおりです。

  • 接続時にドライバー固有の情報を指定する場合

  • ドライバーがユーザーに対して接続情報を要求する場合

  • ODBC データ ソースを使用せずに接続する場合

SQLDriverConnect 接続文字列には、ODBC ドライバーでサポートされているすべての接続情報を指定する一連のキーワードと値のペアが含まれています。 各ドライバーでは、ドライバーでサポートされるすべての接続情報を表すドライバー固有のキーワード以外に、標準の ODBC キーワード (DSN、FILEDSN, DRIVER、UID、PWD、および SAVEFILE) をサポートします。 SQLDriverConnect は、データ ソースなしで接続するために使用できます。 たとえば、SQL Serverのインスタンスへの "DSN レス" 接続を行うように設計されたアプリケーションでは、ログイン ID、パスワード、ネットワーク ライブラリ、接続先のサーバー名、および使用する既定のデータベースを定義する接続文字列を使用して SQLDriverConnect を呼び出すことができます。

SQLDriverConnect を使用する場合、必要な接続情報をユーザーに求める 2 つのオプションがあります。

  • アプリケーション ダイアログ ボックス

    接続情報を求めるアプリケーション ダイアログ ボックスを作成し、NULL ウィンドウ ハンドルと DriverCompletion を SQL_DRIVER_NOPROMPT に設定して SQLDriverConnect を呼び出すことができます。 このようにパラメーターを設定すると、ODBC ドライバー独自のダイアログ ボックスが開かれなくなります。 この方法は、アプリケーションでユーザー インターフェイスを制御することが重要な場合に使用します。

  • ドライバー ダイアログ ボックス

    有効なウィンドウ ハンドルを SQLDriverConnect に渡すアプリケーションをコーディングし、 DriverCompletion パラメーターを SQL_DRIVER_COMPLETE、SQL_DRIVER_PROMPT、またはSQL_DRIVER_COMPLETE_REQUIREDに設定できます。 この場合、ドライバーがダイアログ ボックスを生成して、ユーザーに接続情報を要求します。 この方法を使用すると、アプリケーション コードが簡素化されます。

SQLBrowseConnect

SQLBrowseConnect はSQLDriverConnect と同様に接続文字列を使用します。 ただし、 SQLBrowseConnect を使用すると、アプリケーションは実行時にデータ ソースを使用して完全な接続文字列を反復的に構築できます。 この方法を使用すると、アプリケーションで次の 2 つのことを行えます。

  • アプリケーション独自のダイアログ ボックスを作成して目的の情報を要求できるので、アプリケーションのユーザー インターフェイスで制御できます。

  • 特定のドライバーが使用できるデータ ソースをシステムから参照できます。これは複数の手順になる場合があります。

    たとえば、ユーザーは最初にネットワークを介してサーバーを参照して、サーバーを選択します。次に、そのサーバーを介して、ドライバーがアクセスできるデータベースを参照するといった手順です。

SQLBrowseConnect は、正常な接続を完了すると、SQLDriverConnect への後続の呼び出しで使用できる接続文字列を返します。

SQL Server Native Client ODBC ドライバーは、成功した SQLConnect、SQLDriverConnect、または SQLBrowseConnect で常にSQL_SUCCESS_WITH_INFOを返します。 ODBC アプリケーションは、SQL_SUCCESS_WITH_INFO取得後に SQLGetDiagRec を 呼び出すと、次のメッセージを受信できます。

5701
SQL Serverデータ ソースで定義されている既定のデータベースに、またはデータ ソースに既定のデータベースがない場合は接続で使用されるログイン ID に定義されている既定のデータベースにユーザーのコンテキストを配置することを示します。

5703
このメッセージは、その言語がサーバーで使用されていることを示します。

次の例では、システム管理者によって接続が正常に確立されたときに返されるメッセージを示します。

szSqlState = "01000", *pfNativeError = 5701,  
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]  
       Changed database context to 'pubs'."  
szSqlState = "01000", *pfNativeError = 5703,  
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]  
       Changed language setting to 'us_english'."  

5701 と 5703 のメッセージは、情報提供だけを目的としているので無視できます。 ただし、SQL_SUCCESS_WITH_INFO リターン コードでは 5701 や 5703 以外のメッセージも返されることがあるので、そのようなリターン コードは無視しないでください。 たとえば、ドライバーが古いカタログ ストアド プロシージャを使用して SQL Server のインスタンスを実行しているサーバーに接続する場合、SQL_SUCCESS_WITH_INFOの後に SQLGetDiagRec を介して返されるエラーの 1 つは次のようになります。

SqlState:   01000  
pfNative:   0  
szErrorMsg: "[Microsoft][SQL Server Native Client]The ODBC  
            catalog stored procedures installed on server  
            my65server are version 06.50.0193; version 07.00.0205  
            or later is required to ensure proper operation.  
            Please contact your system administrator."  

SQL Server接続のアプリケーションのエラー処理関数は、SQL_NO_DATAを返すまで SQLGetDiagRec を呼び出す必要があります。 その後、 pfNative コードが 5701 または 5703 のメッセージ以外のメッセージに対して動作する必要があります。

参照

SQL Server との通信 (ODBC)