データ ソースへの接続 (ODBC)
アプリケーションは、環境ハンドルと接続ハンドルを割り当て、任意の接続属性を設定してから、データ ソースまたはドライバに接続します。接続には、次の 3 つの関数を使用できます。
SQLConnect
SQLDriverConnect
SQLBrowseConnect
データ ソースへの接続と、使用可能なさまざまな接続文字列オプションの詳細については、「SQL Server Native Client での接続文字列キーワードの使用」を参照してください。
SQLConnect
SQLConnect は最も単純な接続関数です。この関数は、データ ソース名、ユーザー ID、パスワードの 3 つのパラメータを受け取ります。データベースへの接続に必要な情報がこれら 3 つのパラメータだけの場合は、SQLConnect を使用してください。この関数を使用するには、SQLDataSources を使用してデータ ソースの一覧を作成し、データ ソース、ユーザー ID、およびパスワードをユーザーに問い合わせます。その後、SQLConnect を呼び出します。
SQLConnect では、データ ソース名、ユーザー ID、およびパスワードだけを使用してデータ ソースに接続することが前提となっています。また、ODBC データ ソースには接続のために ODBC ドライバで必要となるその他すべての情報が含まれている必要があります。SQLDriverConnect や SQLBrowseConnect と異なり、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 が返されます。SQL_SUCCESS_WITH_INFO を取得した後、ODBC アプリケーションで 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 のインスタンスを実行しているサーバーに接続した場合、そのインスタンスのカタログ ストアド プロシージャが古いと、SQLGetDiagRec から SQL_SUCCESS_WITH_INFO に続いて次のエラーが返されます。
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 が呼び出されます。このとき、5701 または 5703 以外の pfNative コードに関するメッセージが返された場合に、それに対応する処置が実行されます。
接続状態の確認
SQL Server 2000 以降の SQL_ATTR_CONNECTION_DEAD と SQL_COPT_SS_CONNECTION_DEAD の動作は、以前のバージョンでの動作と異なります。SQL Server 2000 以降では、SQL_ATTR_CONNECTION_DEAD は接続の最新状態を返しますが、その状態は現在の接続状態と異なる場合があります。また、SQL_COPT_SS_CONNECTION_DEAD は Net-Library をクエリして、常に現在の接続状態を取得します。
これらの動作を区別するために、SQL_COPT_SS_CONNECTION_DEAD には SQL Server 2000 以降のインクルード ファイルで新しい値が指定されています。SQL Server 2000 以降のヘッダー ファイルを使用してビルドされたアプリケーションでこの属性を使用している場合、このアプリケーションを SQL Server 7.0 のドライバを使用して実行するとエラー (HY092、無効な属性またはオプションの ID) が返されます。このようなアプリケーションでは、SQLGetConnectAttr を呼び出す前に、使用しているドライバのバージョンをチェックし、アプリケーションが SQL Server 7.0 のドライバで実行される場合には、SQL_COPT_SS_CONNECTION_DEAD の代わりに SQL_ATTR_CONNECTION_DEAD を使用することをお勧めします。