ODBC SQL Server ﾄﾞﾗｲﾊﾞ
ODBC SQL Server ドライバ

概要

インストール

データ ソースのセットアップと接続

プログラミング

インプリメント

SQL 文法

ODBC カーソル

関数

ドライバ属性

データ型のマッピングと使い方

エラー


第 1 章  概要
概要

Microsoft(R) SQL Server(TM) (以下 SQL Server) は、Microsoft(R) Windows NT(R) (以下 Windows NT) 上で動作するマルチユーザー リレーショナル データベース管理システム (DBMS) です。SQL (構造化照会言語) を使用して、SQL Server データベースのデータにアクセスします。クライアント ワークステーションは、Windows NT Server、Novell(R) NetWare(R)、Banyan(R) VINES(R)、または TCP/IP ネットワークなどの、ネットワークを経由して SQL Server と通信します。

SQL Server ドライバは、アプリケーションが ODBC (Open Database Connectivity) インターフェイスを使用して Microsoft SQL Server データベースのデータにアクセスすることを可能にします。

使用できる ODBC SQL Server ドライバには、16 ビット版と 32 ビット版の両方があります。

32 ビット ODBC SQL Server ドライバは、スレッド セーフです。ドライバは、複数のスレッドが共有しているアクセスを、hstmt、hdbc、および henv 共有オブジェクトに順番に送ります。ただし、ODBC プログラムが複数のスレッドを使用しているときでも、プログラムがステートメント内や接続領域内での操作を正しい順序に保つようにする必要があります。

以下に、16 ビット環境での、アプリケーション/ドライバのアーキテクチャを示します。

注意  "サンク" とは、関数呼び出しを横取りし、16 ビット コードと 32 ビット コード間の特殊な変換処理を行い、その後目的の関数に制御を戻すことです。

                アプリケーション (16 ビット)      アプリケーション (Win32s の 32 ビット)
|	|
32 ビット サンク ドライバ マネージャ
(ODBC32.DLL)
|	|
ODBC ユニバーサル サンク DLL
(ODBC16UT.DLL)
|	|
ODBC ドライバ マネージャ
(ODBC.DLL)
|
ODBC カーソル ライブラリ (オプション)
(ODBCCURS.DLL)
|
SQL Server ドライバ (16 ビット)
(SQLSRVR.DLL)
|
Net-Library
(DBNMP3.DLL、DBMSSPX3.DLL など)
|
ネットワーク ソフトウェア
(Windows NT、Windows for Workgroups、Novell NetWare など)
|
Microsoft SQL Server

以下に、32 ビット環境での、アプリケーション/ドライバのアーキテクチャを示します。

アプリケーション (16 ビット)                        アプリケーション (32 ビット)
|	|
ODBC ドライバ マネージャ	ODBC ドライバ マネージャ
(ODBC.DLL)	(ODBC32.DLL)
|	|
ODBC カーソル ライブラリ	ODBC カーソル ライブラリ
 (オプション)	 (オプション)
(ODBCCURS.DLL)	(ODBCCR32.DLL)
|	|
16 ビット ODBC ジェネリック サンク DLL
(ODBC16GT.DLL)
|	|
32 ビット ODBC ジェネリック サンク DLL
(ODBC32GT.DLL)
|	|
SQL Server ドライバ (32 ビット)
(SQLSRV32.DLL)
|
Net-Library
(DBNMPNTW.DLL、DBMSSPXN.DLL など)
|
ネットワーク ソフトウェア
(Windows NT、Windows for Workgroups、Novell NetWare など)
|
Microsoft SQL Server


第 2 章   インストール
インストール

この章では、ODBC SQL Server ドライバを実行するために、システムで必要なものの概要を説明します。さらに、インストールの手順およびカタログ ストアド プロシージャのアップグレードの手順も説明しています。


システムで必要なもの

Microsoft(R) SQL Server(TM) Version 6.5 (以下 SQL Server 6.5 または SQL Server) のデータにアクセスするには、以下のソフトウェアが必要です。

●	ODBC SQL Server ドライバ

●	Microsoft SQL Server

●	ドライバと SQL Server が常駐するコンピュータ上にネットワーク ソフトウェアが必要です。ただし、ネットワークに接続されていない、ローカルなデスクトップ SQL Server に接続するときは、必要ありません。

上記の各構成要素が必要とするハードウェアとソフトウェアを次に示します。


ODBC SQL Server ドライバ

必要なハードウェア

●	Microsoft(R) Windows NT(R) (以下 Windows NT) オペレーティング システム、Microsoft(R) Windows(R) 95 (以下 Windows 95) オペレーティング システム、および Microsoft(R) Windows(R) オペレーティング システムが動作するコンピュータ。

●	SQL Server ドライバおよび ODBC ドライバ マネージャ用に約 300KB のディスク領域を持つハード ディスク。

必要なオペレーティング システム ソフトウェア

●	16 ビット ドライバ―Microsoft Windows(R) Version 3.1 以降。

●	32 ビット ドライバ―Microsoft Windows 95 または Windows NT Version 3.5 以降。

SQL Server が必要とするハードウェアとソフトウェアの詳細については、『SQL Server 6.5 の新機能のご紹介』と『セットアップ ガイド』を参照してください。


SQL Server

SQL Server ドライバを使用して、Microsoft SQL Server データベースのデータにアクセスするには、Microsoft(R) SQL Server(TM) Version 4.21a 以降が必要です。また、SQL Server にカタログ ストアド プロシージャをインストールする必要があります。Microsoft SQL Server Version 4.21a を使用しているときには、このドライバに同梱しているカタログ ストアド プロシージャをインストールする必要がある場合があります。このことについては、カタログ ストアド プロシージャのアップグレード トピックを参照してください。SQL Server が必要とするハードウェアとソフトウェアの詳細については、『セットアップ ガイド』を参照してください。


ネットワーク ソフトウェア

SQL Server ドライバと SQL Server が常駐するコンピュータに接続するには、ネットワーク ソフトウェアが必要です。SQL Server に接続するために、Microsoft Windows NT、Microsoft Windows for Workgroups、またはこれらと互換性のある IBM(R) LAN Server、DEC(TM) PATHWORKS(TM)、Novell(R) NetWare(R)、または Banyan(R) VINES(R) などのネットワークを使用できます。各ネットワークが必要とするハードウェアとソフトウェアの詳細については、ネットワークのマニュアルを参照してください。

SQL Server ドライバは、SQL Server Net-Library インターフェイスを使用して、ネットワーク ソフトウェアと通信します。このために、Net-Library ダイナミック リンク ライブラリ (DLL) が必要になります。ネットワークの環境設定のサポートの詳細については、『セットアップ ガイド』を参照してください。


SQL Server ドライバのインストール

Windows NT、Windows 95、または Windows 3.1 が動作しているコンピュータに、SQL Server 6.5 クライアント ソフトウェアをインストールすると、ODBC SQL Server ドライバが自動的にインストールされます。SQL Server 6.5 クライアント ソフトウェアのインストールの詳細については、『セットアップ ガイド』を参照してください。

ODBC SQL Server ドライバを再インストールする必要がある場合は、適切なクライアント インストール ディレクトリの ODBC サブディレクトリから、ODBC setup プログラムを実行できます。

SQL Server ドライバを使用するには、通常アクセスしたいデータを持つ SQL Server のインストールごとに、データ ソースを追加します。データ ソースの追加については、SQL Server データ ソースへの接続を参照してください。

Microsoft SQL Server Version 4.21a または Microsoft SQL Server Version 6.0 を使用しているときは、このドライバと同梱されている INSTCAT.SQL ファイルに、カタログ ストアド プロシージャの小さな変更が含まれています。更新されたカタログ ストアド プロシージャのインストールの詳細については、次のセクションを参照してください。


カタログ ストアド プロシージャのアップグレード

SQL Server ドライバは、カタログ ストアド プロシージャと呼ばれる、一連のシステム ストアド プロシージャを使用して、SQL Server システム カタログから情報を取得します。Microsoft SQL Server はインストールまたはアップグレード時に、カタログ ストアド プロシージャを自動的にインストールします。このドライバと同梱されている INSTCAT.SQL ファイルに、カタログ ストアド プロシージャの小さな変更が含まれています。Microsoft SQL Server Version 4.21a または Microsoft SQL Server Version 6.0 が動作しているサーバーでは、システム管理者がこのカタログ ストアド プロシージャをアップグレードする必要があります。

カタログ ストアド プロシージャをアップグレードするには、システム管理者が以下の手順で isql ユーティリティを使用してスクリプトを実行します。master データベースが変更されるので、システム管理者は master データベースをバックアップしておく必要があります。isql を実行するには、コンピュータが Microsoft SQL Server のクライアント ワークステーションとしてインストールされている必要があります。

カタログ ストアド プロシージャをアップグレードするには

●	コマンド プロンプトで、isql ユーティリティを使用して INSTCAT.SQL スクリプトを次のように実行します。

C:> ISQL /Usa /Psa_password /Sserver_name /ilocation\INSTCAT.SQL

パラメータの説明

sa_password

システム管理者のパスワード。

server_name

SQL Server が常駐しているサーバー名。

location

INSTCAT.SQL が存在する位置のフルパス。INSTCAT.SQL は SQL Server 6.5 がインストールされているディレクトリ (デフォルト C:\MSSQL\INSTALL) または SQL Server 6.5 CD (デフォルト D:\platform。D は CD のドライブ記号で、platform は I386 などの、サーバーに適合したプラットホーム ディレクトリ) から使用できます。

INSTCAT.SQL スクリプトはメッセージを表示しますが、無視してもかまいません。

master データベースに空き領域がなく、カタログ ストアド プロシージャを格納できなかった場合、または既存のプロシージャの変更をログに記録できなかった場合は、INSTCAT.SQL スクリプトは失敗します。INSTCAT.SQL スクリプトが失敗した場合は、システム管理者に相談してください。

SQL Server ドライバは、以下のカタログ ストアド プロシージャを使用します。

ストアド プロシージャ	戻り値
sp_column_privileges	指定したテーブルの列権限に関する情報
sp_columns	指定したテーブルの列に関する情報
sp_databases	データベースの一覧
sp_datatype_info	サポートされているデータベースに関する情報
sp_fkeys	論理外部キーに関する情報
sp_pkeys	主キーに関する情報
sp_server_info	サーバーの属性名と対応する値
sp_special_columns	特別な属性を持つテーブル内の列に関する 1 つのテーブルの情報
sp_sproc_columns	ストアド プロシージャの列情報
sp_statistics	1 つのテーブルのインデックスの一覧
sp_stored_procedures	ストアド プロシージャの一覧
sp_table_privileges	指定したテーブルのテーブル権限に関する情報
sp_tables	クエリーできるオブジェクトの一覧
カタログ ストアド プロシージャの詳細については、『SQL Server 6.5 の新機能のご紹介』および『Transact-SQL リファレンス』を参照してください。


第 3 章   データ ソースのセットアップと接続
データ ソースのセットアップと接続

この章では、Microsoft(R) SQL Server(TM) Version 6.5 (以下 SQL Server 6.5 または SQL Server) データ ソースの作成と環境設定について説明します。SQL Server データ ソースが作成されると、ODBC アプリケーションはこのデータ ソースを使用して SQL Server に接続できるようになります。

ODBC SQL Server のセットアップ

SQL Server データ ソースへの接続

ドライバ固有の接続オプション

データ ソースの削除

データ ソース

データ ソースには、ユーザーがアクセスしたいデータ、およびデータにアクセスするために必要な情報が含まれます。ODBC SQL Server ドライバの場合、データ ソースは Microsoft SQL Server データベース、データベースが存在するサーバー、およびそのサーバーがアクセスするネットワークです。


ODBC SQL Server のセットアップ

[ODBC SQL Server セットアップ] ダイアログ ボックスにアクセスするには

1.	コントロール パネルの [ODBC] アイコンをダブルクリックします。

注意  Microsoft(R) Windows NT(R) (以下 Windows NT) または Microsoft(R) Windows(R) 95 (以下 Windows 95) で 16 ビット ドライバを使用しているときは、[プログラム マネージャ] ウィンドウで、[Microsoft ODBC] グループを開き、[Microsoft ODBC 管理] アイコンをダブルクリックします。

[データ ソース] ダイアログ ボックスが表示されます。

2.	[追加] をクリックします。

[データ ソースの追加] ダイアログ ボックスが表示されます。

3.	[使用可能な ODBC ドライバ] のリストから [SQL Server] を選択し、[OK] をクリックします。

[ODBC SQL Server セットアップ] ダイアログ ボックスが表示されます。

[ODBC SQL Server セットアップ] ダイアログ ボックスには、以下のオプションがあります。

データ ソース名

データ ソースの名前。たとえば "人事データ" などです。

説明

データ ソース内のデータの説明。たとえば "雇用日付、給与の履歴、および全従業員の現状" というように入力します。

サーバー

ネットワーク上の SQL Server 名です。リストからサーバーを選択するか、またはサーバー名を入力します。指定したサーバー名が、別のデータ ソースまたは SQL クライアント設定ユーティリティで設定されている場合は、[ネットワーク アドレス] および [ネットワーク ライブラリ] フィールドには既存のネットワーク情報が自動的に表示されます。

Microsoft Windows NT コンピュータでは、サーバーとして "(ローカル)" を入力できます。ユーザーは、ネットワークを使用しない SQL Server を実行しているときでも、名前付きパイプで受信待ちする SQL Server のローカル コピーを使用できます。16 ビット SQL Server ドライバがネットワークなしで "(ローカル)" を使用しているときは、Microsoft Loopback Adapter がインストールされている必要があります。

別の種類のネットワークでのサーバー名の詳細については、『セットアップ ガイド』を参照してください。

ネットワーク アドレス

ドライバがデータを取得する SQL Server データベース管理システム (DBMS) のアドレスです。Microsoft SQL Server では、通常この値は (デフォルト) に設定したままにしておきます。

ネットワーク ライブラリ

SQL Server ドライバがネットワーク ソフトウェアと通信するときに使用する SQL Server Net-Library DLL の名前です。このオプションの値が (デフォルト) の場合は、SQL Server ドライバはクライアント コンピュータのデフォルトの Net Library を使用します。クライアント コンピュータのデフォルトの Net Library は、[SQL Server クライアント設定ユーティリティ] ダイアログ ボックスで指定します。

(デフォルト) 以外のネットワーク ライブラリおよびネットワーク アドレス (オプション) を使用してデータ ソースを作成する場合は、ODBC SQL Server setup はサーバー名のエントリを作成します。このエントリは、[SQL Server クライアント設定ユーティリティ] ダイアログ ボックスの [拡張] タブで表示できます。このサーバー名エントリは、DB-Library(TM) アプリケーションでも使用できます。

信頼関係接続を使用

ODBC SQL Server ドライバが SQL Server に対して、安全で信頼性のある接続を要求するかどうかを指定します。つまり、サーバーの現在のログイン セキュリティ モードとは無関係に、SQL Server はこのデータ ソースを使用している接続を確立するために、統合ログイン セキュリティを使用します。指定したログイン ID またはパスワードは無視されます。

[オプション] をクリックして、以下のフィールドにアクセスできます。

データベース名

SQL Server データベースの名前。

言語名

SQL Server が使用するその国の言語。

用意されたステートメントでストアド プロシージャを作成

オンにすると、用意されたステートメントでストアド プロシージャを作成します (デフォルト)。SQL Server ドライバは、ステートメントをプロシージャに格納し、そのプロシージャをコンパイルすることにより、ステートメントを準備します。

用意されたステートメントでストアド プロシージャを作成しないようにするには、このチェック ボックスをオフにします。この場合は、用意されたステートメントは実行時に格納され、実行されます。

トランスレータ

現在のトランスレータの説明。別のトランスレータを選択するには、[選択] をクリックします。表示される [トランスレータの選択] ダイアログ ボックスで、リストからトランスレータを選択します。

OEM 文字から ANSI 文字への変換

オンにすると、データベースに格納された拡張文字を、Windows ベースのアプリケーションが使用する ANSI 文字に変換します。SQL Server クライアント コンピュータと SQL Server が同じ ANSI 以外の文字セットを使用している場合は、このオプションをオンにします。たとえば、SQL Server がコード ページ 850 を、クライアント コンピュータが OEM コード ページのコード ページ 850 を使用する場合などです。

このオプションをオフにし、SQL Server クライアント コンピュータと SQL Server が別の文字セットを使用している場合は、文字セット トランスレータを指定する必要があります。

[オプション] をクリック後、[プロファイリング] をクリックして、[プロファイリング オプション] ダイアログ ボックスを表示することにより、以下のプロファイリング設定を使用できます。

実行時間がかかるクエリーを保存する

[クエリーのロギングしきい値] よりも時間がかかるクエリーをログに記録します。[クエリー ログ] をクリックして、実行時間がかかるクエリーのログ ファイルを指定します。

クエリーのロギングしきい値 (ミリ秒)

実行時間がかかるクエリーのロギングのしきい値をミリ秒単位で指定します。ここで指定したミリ秒単位の数値よりも、実行時間が長くかかるクエリーはログに記録されます。

ドライバの統計をログに記録する

ドライバの統計をログに記録します。[統計用 ログ] をクリックして、ドライバ統計ログ ファイルを指定します。

接続オプションの詳細については、ドライバ固有の接続オプションを参照してください。


SQL Server データ ソースへの接続

アプリケーションが SQLDriverConnect を使用して、SQL Server に接続するときに、アプリケーションはデータ ソース情報のプロンプトを作成できます。このプロンプトの形式は、データ ソース クエリー、またはダイアログ ボックスです。データ ソース クエリーでは、データ ソース名を入力します。ダイアログ ボックスでは、以下の手順で必要な値を設定します。

1.	データ ソース名を入力または選択します。

2.	[ログイン ID] 入力フィールドに、SQL Server のログイン ID を入力します。

3.	[パスワード] 入力フィールドに、SQL Server のパスワードを入力します。

4.	[OK] をクリックします。

SQL Server ログイン セキュリティ モードと安全な接続の詳細については、『システム管理者ガイド』を参照してください。

アクセスするデータベースや SQL Server が使用する言語などの、オプションの接続情報を入力するには、[オプション] をクリックします。

1.	[データベース] リスト ボックスで、アクセスしたいデータベースを選択します。SQL Server でデフォルトのデータベース、およびログイン ID 用の言語を設定しておく方が、DSN オプションとして指定するよりも効果的です。

リスト ボックスを開くと、ユーザーのデフォルトのデータベースが選択されています。

2.	[言語] ボックスで、SQL Server で使用する言語を選択します。SQL Server でデフォルトのデータベース、およびログイン ID 用の言語を設定しておく方が、DSN オプションとして指定するよりも効果的です。

リスト ボックスを開くと、ユーザーのデフォルトの言語が選択されています。

3.	表示されるアプリケーション名が正しくない場合は、正しいアプリケーション名を入力します。

アプリケーション名とは、SQL Server ドライバを呼び出しているアプリケーションの名前です。

4.	表示されるワークステーション ID が正しくない場合は、現在のワークステーション ID を入力します。

通常は、アプリケーションが常駐するコンピュータのネットワーク名です。

5.	[OK] をクリックします。


odbcping を使用した接続の確認

odbcping ユーティリティを使用して、ODBC SQL Server ドライバを使用しているサーバーに接続し、ODBC が正しくインストールされているかどうかを確認できます。このユーティリティは \MSSQL\BINN ディレクトリに格納されている 32 ビット アプリケーションです。ODBC 接続を確認するには、コマンド プロンプトから以下のように入力します。

odbcping /Sservername /Ulogin_id /Ppassword

パラメータの説明

servername

接続するサーバー名。

login_id

そのサーバーに対して有効なログイン ID。

password

そのログイン ID のパスワード。

ODBC 接続が確立されると、以下のメッセージが表示されます。

CONNECTED TO SQL SERVER

ODBC 接続が確立できないと、以下のメッセージが表示されます。

COULD NOT CONNECT TO SQL SERVER

データ ソースへの接続の詳細については、第 8 章の関数を参照してください。

SQLBrowseConnect

SQLConnect

SQLDriverConnect


ドライバ固有の接続オプション

ODBC SQL Server ドライバは、SQLSetConnectOption および SQLGetConnectOption 用に以下のドライバ固有の接続オプションをサポートします。

オプション	説明
SQL_COPT_SS_ANSI_OEM	SQL_AO_OFF。ANSI から OEM への変換および OEM から ANSI への変換を実行しません (デフォルト)。 SQL_AO_ON。ANSI から OEM への変換および OEM から ANSI への変換を実行します。 (DBANSItoOEM | DBOEMtoANSI を使用した dbsetopt および dbclropt と同様です。)
SQL_COPT_SS_CONNECTION    _DEAD (SQLGetConnectOption のみ)	SQL_CD_TRUE。接続が解除されたか、 使用できません。 SQL_CD_FALSE。接続がアクティブで、使用できます。 (dbdead と同様です。)
SQL_COPT_SS_ENLIST_IN_DTC	SQL Server にエクスポートするために、トランザクションを指定する、MS DTC OLE トランザクション オブジェクト。クライアントは MS DTC OLE ITransactionDispenser::BeginTransaction メソッドを呼び出し、MS DTC トランザクションを開始し、そのトランザクションを表すトランザクション オブジェクトを作成します。その後、アプリケーションは SQL_COPT_SS_ENLIST_IN_DTC オプションを指定して SQLSetConnectOption 関数を呼び出し、トランザクション オブジェクトを ODBC 接続に関連付けます。関連するすべてのデータベースの利用状況は、MS DTC トランザクションの保護下で実行されます。 SQL_DTC_DONE。ODBC 接続に関連付けられた MS DTC を終了します。その後、アプリケーションは、ローカルな SQL Server トランザクションに対して、同じ ODBC 接続を使用できます。 (詳細については、『分散トランザクション コーディネータ ユーザーズ ガイド』を参照してください。)
SQL_COPT_SS_ENLIST_IN_XA	XA 準拠の TP (Transaction Processor) を使用して、XA トランザクションを開始するには、クライアントは X/Open tx_begin 関数を呼び出します。その後、アプリケーションは SQL_COPT_SS_ENLIST_IN_XA パラメータを TRUE に設定して SQLSetConnectOption 関数を呼び出し、XA トランザクションを ODBC 接続に関連付けます。関連するすべてのデータベースの利用状況は、XA トランザクションの保護下で実行されます。 ODBC 接続に関係付けられた XA を終了するには、クライアントは SQL_COPT_SS_ENLIST_IN_XA パラメータを FALSE に設定して、SQLSetConnectOption 関数を呼び出す必要があります。その後、アプリケーションは、ローカルな SQL Server トランザクションに対して、同じ ODBC 接続を使用できます。 (詳細については、『分散トランザクション コーディネータ ユーザーズ ガイド』を参照してください。)
SQL_COPT_SS_PERF_DATA (SQLGetConnectOption のみ)	SQLPERF 構造体へのポインタのアドレス。SQL Server ドライバは、現在のパフォーマンス データを保持する SQLPERF 構造体へのポインタを返します。NULL が返された場合は、パフォーマンス データのロギングが無効です。
SQL_COPT_SS_PERF_DATA (SQLSetConnectOption のみ)	SQL_PERF_START。パフォーマンス データのログ記録を開始します。 SQL_PERF_STOP。パフォーマンス データのログ記録を停止します。
SQL_COPT_SS_PERF_DATA_LOG	パフォーマンス データ ログ ファイルのフルパスとファイル名。
SQL_COPT_SS_PERF_DATA_LOG    _NOW (SQLSetConnectOption のみ)	パフォーマンス データをタブで区切ったレコードとして、指定されたログ ファイルに書き込みます。vParam パラメータを使用して、このログ レコードのコメントを保持する null 文字で終わる文字列を指すことができます。
SQL_COPT_SS_PERF_QUERY (SQLGetConnectOption のみ)	NULL が返された場合は、実行時間がかかるクエリーのロギングは無効です。それ以外は、実行時間がかかるクエリーのロギングは有効です。
SQL_COPT_SS_PERF_QUERY (SQLSetConnectOption のみ)	SQL_PERF_START。実行時間がかかるクエリーのロギングを開始します。 SQL_PERF_STOP。実行時間がかかるクエリーのロギングを停止します。
SQL_COPT_SS_PERF_QUERY    _INTERVAL	実行時間がかかるクエリーのロギングに対する、ミリ秒単位のしきい値。ここで指定したミリ秒単位の時間よりも実行時間がかかるクエリーはログに記録されます。
SQL_COPT_SS_PERF_QUERY_LOG	実行時間がかかるクエリーのログ ファイルのフルパスとファイル名。
SQL_COPT_SS_USER_DATA	ユーザー データ ポインタを設定または取得します。 設定されていない場合は、SQLGetConnectOption は SQL_UD_NOTSET を返します。 (dbsetuserdata および dbgetuserdata と同様です。)
SQL_FALLBACK_CONNECT	SQL_FALLBACK_CONNECT_OFF。フォールバック サポートは無効です (デフォルト)。 SQL_FALLBACK_CONNECT_ON。プライマリ サーバーに正常に接続されたときは、ODBC SQL Server ドライバは、自動的に現在のフォールバック サーバーを調べ、フォールバック情報がレジストリに格納されていることを確認します。プライマリ サーバーへの接続試行が失敗した場合 (接続タイムアウトが 0 より大きいときこの状況が発生します)、ODBC SQL Server ドライバはフォールバック サーバーへの接続を試行します。このオプションは、SQLConnect、SQLDriverConnect、または SQLBrowseConnect を呼び出す前に設定する必要があります。
SQL_INTEGRATED_SECURITY	SQL_IS_OFF。SQL Server への通常の接続を要求します。SQL Server 統合セキュリティを使用した信頼関係接続は要求しません (デフォルト)。 SQL_IS_ON。サーバーのセキュリティ モードとは無関係に、SQL Server への信頼関係接続を要求します。 SQL Server ログイン セキュリティ モードと信頼関係接続の詳細については、『システム管理者ガイド』を参照してください。
SQL_PRESERVE_CURSORS	SQL_PC_OFF。SQLTransact ですべてのカーソルがクローズされます (デフォルト)。 SQL_PC_ON。SQLTransact でサーバー カーソルがオープンされたまま残ります。
SQL_USE_PROCEDURE    _FOR_PREPARE	SQL_UP_ON。SQLPrepare 用に一時的なストアド プロシージャが生成されます (デフォルト)。 SQL_UP_OFF。SQLPrepare 用に一時的なストアド プロシージャが生成されません。ステートメントは、実行時に格納、コンパイルされ、実行されます。すべての構文エラーのチェックは、実行時まで延期されます。 SQL_UP_ON_DROP。SQLPrepare を呼び出した後、または hstmt が解放されたとき、一時的なストアド プロシージャが明示的に削除されます。


ドライバ固有のオプションの #Define

SQL Server ドライバ固有のオプション値は、ODBCSS.H ヘッダー ファイルで定義されています。


データ ソースの削除

データ ソースを削除するために、[データ ソース] ダイアログ ボックスを使用できます。

[データ ソース] ダイアログ ボックスを使用するには

1.	[データ ソース] リストから削除するデータ ソースを選択します。

2.	[削除] をクリックし、その後削除の確認に対して [はい] をクリックします。

データ ソース名およびその関連情報を WIN.INI またはレジストリから削除するかどうかの問い合わせを受ける場合があります。SQL Server を呼び出すその他のアプリケーションが、この情報を使用して SQL Server データ ソースに接続する可能性があります。

その他のアプリケーションが、そのデータ ソースに関する情報を使用していないことが確実な場合は [はい] をクリックします。それ以外は [いいえ] をクリックします。


データ ソース

SQLConfigDataSource 関数を呼び出して、データ ソースを動的に追加、変更、または削除できます。この関数はキーワードを使用して、通常 [ODBC SQL Server セットアップ] ダイアログ ボックスで設定する、接続オプションを指定できます。[ODBC SQL Server セットアップ] ダイアログ ボックスを表示しないで、データ ソースを追加、変更、または削除する場合は、この関数を使用します。


第 4 章   ODBC のプログラミング
 ODBC のプログラミング

この章では、Microsoft(R) SQL Server(TM) Version 6.5 (以下 SQL Server 6.5 または SQL Server) での ODBC のプログラミング手順を段階をおって説明しています。

この章では、text および image データを処理するための実行時データ パラメータと実行時データ列の使用について説明しています。これらは、任意の型と長さで使用できます。


ODBC の使用

ODBC を使用するには

1.	SQLAllocEnv を呼び出して、ODBC を初期化し、環境ハンドルを割り当てます。

2.	接続を使用します。詳細については、接続の使用を参照してください。

3.	SQLFreeEnv を呼び出し、環境ハンドルを開放します。


接続の使用

接続を使用するには

1.	SQLAllocConnect を呼び出して、接続ハンドルを割り当てます。

2.	オプションで、SQLSetConnectOption を呼び出して、接続オプションを設定するか、または SQLGetConnectOption を呼び出して、接続オプションを取得します。

3.	SQLConnect を呼び出して、既存のデータ ソースを使用して SQL Server に接続します。

または

SQLDriverConnect を呼び出して、接続文字列を使用して SQL Server に接続します。

完全な SQL Server 接続文字列で最小のものは、次の 2 つの形式です。

DSN=dsnname;UID=loginid;PWD=password;

DRIVER={SQL Server};SERVER=server;UID=loginid;PWD=password;

接続文字列が完全でないと、SQLDriverConnect は必要な情報を問い合わせます。

または

SQLBrowseConnect を繰り返し、複数回呼び出して、接続文字列をビルドし、SQL Server に接続します。

4.	オプションで、SQLGetInfo を呼び出して、ドライバ属性および SQL Server データ ソースの動作を取得します。

5.	ステートメントを使用します。詳細については、ステートメントの使用を参照してください。

6.	SQLDisconnect を呼び出して、SQL Server から接続解除し、新しい接続が接続ハンドルを使用できるようにします。

7.	SQLFreeConnect を呼び出し、接続ハンドルを開放します。


ステートメントの使用

ステートメントの使用

1.	SQLAllocStmt を呼び出し、ステートメント ハンドルを割り当てます。

2.	オプションで、SQLSetStmtOption を呼び出し、ステートメント オプションを設定するか、または SQLGetStmtOption を呼び出して、ステートメント オプションを取得します。

サーバー カーソルを使用するには、カーソル オプションをデフォルト以外の値に設定する必要があります。詳細については、カーソル オプションの設定を参照してください。

3.	ステートメントを直接実行します。詳細については、ステートメントの直接実行を参照してください。

または

ステートメントを用意した後、それを複数回実行します。詳細については、ステートメントの準備と実行を参照してください。

または

結果を返すカタログ関数を呼び出します。

4.	一度に 1 行ずつステートメントの結果を処理します。詳細については、『プログラマーズ リファレンス for Visual Basic』q「第 2 章  Visual Basic 用の DB-Library によるプログラミング」の「結果の処理」を参照してください。

または

スクロール可能なカーソルを使用して、ステートメントの結果を処理します。詳細については、スクロール可能なカーソルの使用を参照してください。

または

SQLRowCount を呼び出して、挿入、更新、または削除ステートメントで影響した行数を調べます。

5.	結果が返される場合は、fOption に SQL_CLOSE を指定して SQLFreeStmt を呼び出し、保留されている結果をクリアし、新しいカーソルでステートメント ハンドルを使用できるようにします。

ステートメント ハンドルを再使用するには、手順 2. に戻ります。

6.	fOption に SQL_DROP を指定して SQLFreeStmt を呼び出し、ステートメント ハンドルを開放します。


カーソル オプションの設定

カーソル オプションを設定するには

1.	SQLSetStmtOption を呼び出して、カーソルの動作を制御するステートメント オプションを設定します。または SQLGetStmtOption を呼び出して、ステートメント オプションを取得します。

fOption	指定
SQL_CURSOR_TYPE	カーソルの型を前方のみ、静的、動的、またはキーセットに設定します。
SQL_CONCURRENCY	同時実行制御オプションを、読み取り専用、ロック、タイムスタンプを使用したオプティミスティック、または値を使用したオプティミスティックに設定します。
SQL_ROWSET_SIZE	行セット内の行数を指定します。
これらのオプションのデフォルト値 (前方のみ、読み取り専用、行セットのサイズ 1) は、サーバー カーソルを使用しません。サーバー カーソルを使用するには、これらのオプションの少なくとも 1 つをデフォルト以外の値に設定する必要があります。さらに実行するステートメントは 1 つの SELECT ステートメント、または 1 つの SELECT ステートメントを持つストアド プロシージャでなければなりません。


 ステートメントの直接実行

ステートメントを一度だけ直接実行するには

1.	ステートメントがパラメータ マーカーを持つ場合は、パラメータごとに以下の処理を行います。

1.	SQLBindParameter を呼び出し、プログラム バッファをステートメント パラメータにバインドします。

パラメータが実行時データ text パラメータまたは image パラメータの場合は、それをセットアップします。詳細については、実行時データ パラメータの使用を参照してください。

2.	データ値をバインドしたプログラム バッファに格納します。

2.	SQLExecDirect を呼び出して、ステートメントを実行します。

3.	実行時データ text パラメータまたは image パラメータを使用した場合は、それらを処理します。詳細については、実行時データ パラメータの使用を参照してください。

複数のセットのパラメータを使用してステートメントを実行するには

1.	SQLParamOptions を呼び出して、パラメータのセット数 (S) を設定します。

2.	パラメータ マーカーごとに、以下の処理を行います。

1.	データ値を格納するために、S 個のパラメータ バッファの配列を割り当てます。

2.	データ長を格納するための、S 個のパラメータ バッファの配列を割り当てます。

3.	SQLBindParameter を呼び出し、パラメータのデータ値の配列とデータ長の配列をステートメント パラメータにバインドします。

パラメータが実行時データ text パラメータまたは image パラメータの場合は、それをセットアップします。詳細については、実行時データ パラメータの使用を参照してください。

4.	S 個のデータ値と S 個のデータ長をバインドされたパラメータ配列に格納します。

3.	SQLExecDirect を呼び出して、ステートメントを複数回実行します。パラメータ セットごとに、ステートメントを S 回、効率よく実行します。

4.	実行時データ text パラメータまたは image パラメータを使用した場合は、それらを処理します。詳細については、実行時データ パラメータの使用を参照してください。


ステートメントの準備と実行

ステートメントを一度準備し、その後複数回実行するには

1.	SQLPrepare を呼び出して、ステートメントを準備します。

2.	オプションで、SQLNumParams を呼び出して、準備したステートメント内のパラメータ数を調べます。

3.	オプションで、準備したステートメント内のパラメータごとに以下の処理を行います。

●	SQLDescribeParam を呼び出して、パラメータ情報を取得します。

4.	オプションで、結果セット情報を取得します。詳細については、結果セット情報の取得を参照してください。

5.	ステートメントがパラメータ マーカーを持つ場合は、パラメータごとに以下の処理を行います。

●	SQLBindParameter を呼び出し、プログラム バッファをステートメント パラメータにバインドします。

パラメータが実行時データ text パラメータまたは image パラメータの場合は、それをセットアップします。詳細については、実行時データ パラメータの使用を参照してください。

6.	準備されたステートメントの実行ごとに、以下の処理を行います。

1.	ステートメントがパラメータ マーカーを持つ場合は、データ値をバインドしたプログラム バッファに格納します。

2.	SQLExecute を呼び出して、準備したステートメントを実行します。

3.	パラメータが実行時データ text パラメータまたは image パラメータの場合は、それをセットアップします。詳細については、実行時データ パラメータの使用を参照してください。

7.	fOption に SQL_RESET_PARAMS を指定して SQLFreeStmt を呼び出し、バインドされたパラメータ バッファを開放します。


結果の処理

結果を取得するには

1.	結果セット情報を取得します。詳細については、結果セット情報の取得を参照してください。

2.	バインドされた列を使用する場合は、バインドする列ごとに以下の処理を行います。

●	SQLBindCol を呼び出して、列にプログラム バッファをバインドします。

3.	結果セット内の行ごとに、以下の処理を行います。

1.	SQLFetch を呼び出して、次の行を取得します。

2.	バインドされた列を使用する場合は、バインドされた列バッファ内で現在利用できるデータを使用します。

3.	バインドされていない列を使用する場合は、1 回以上 SQLGetData を呼び出して、最後のバインドされた列以後の、バインドされていない列のデータを取得します。SQLGetData は、列番号を順番に増加しながら呼び出す必要があります。

SQLGetData を複数回呼び出して、text 列または image 列からデータを取得します。

4.	SQLMoreResults を呼び出して、使用できる別の結果セットがあるかどうかを調べます。

SQL_SUCCESS が返された場合は、別に使用できる結果セットがあります。

SQL_NO_DATA_FOUND が返された場合は、使用できる結果セットはありません。

SQL_SUCCESS_WITH_INFO または SQL_ERROR が返された場合は、SQLError を呼び出して、PRINT ステートメントまたは RAISEERROR ステートメントからの出力を使用できるかどうかを調べます。

出力パラメータまたはストアド プロシージャの戻り値で、バインドされたステートメント パラメータを使用する場合は、バインドされたパラメータ バッファ内で現在利用できるデータを使用します。

結果セットが計算行を含んでいるときは、各計算行は別の結果セットとして使用できるようになっています。これらの計算結果セットは、通常の行内に散在していて、通常の行を複数の結果セットに分割しています。

5.	fOption に SQL_UNBIND を指定して SQLFreeStmt を呼び出し、バインドされたすべての列バッファを開放します。

6.	別の結果セットが使用できる場合は、手順 1. に戻ります。


結果セット情報の取得

結果セット内の列に関する情報を取得するには

1.	SQLNumResultCols を呼び出し、結果セット内の列数を取得します。

2.	結果セット内の列ごとに、以下の処理を行います。

●	SQLDescribeCol を呼び出して、結果列に関する情報を取得します。

または

●	SQLColAttributes を呼び出して、結果列に関する特定の記述子の information を取得します。


スクロール可能なカーソルの使用

カーソルを使用するには

1.	SQLNumResultCols を呼び出して、行セット内の列数 (C) を取得します。

2.	fOption に SQL_ROWSET_SIZE を指定して SQLSetStmtOption を呼び出し、行セット内の行数 (R) を取得します。

3.	オプションで、SQLSetCursorName を呼び出し、カーソル名を設定するか、または SQLGetCursorName を呼び出して、カーソル名を取得します。

4.	列方向のバインドを使用します。

または

行方向のバインドを使用します。詳細については、行セット バインドの使用を参照してください。

5.	カーソルから希望する行セットをフェッチします。詳細については、行セットのフェッチと更新を参照してください。

6.	SQLMoreResults を呼び出して、使用できる別の結果セットがあるかどうかを調べます。

SQL_SUCCESS が返された場合は、別に使用できる結果セットがあります。

SQL_NO_DATA_FOUND が返された場合は、使用できる結果セットはありません。

SQL_SUCCESS_WITH_INFO または SQL_ERROR が返された場合は、SQLError を呼び出して、PRINT ステートメントまたは RAISEERROR ステートメントからの出力を使用できるかどうかを調べます。

出力パラメータまたはストアド プロシージャの戻り値で、バインドされたステートメント パラメータを使用する場合は、バインドされたパラメータ バッファ内で現在利用できるデータを使用します。

結果セットが計算行を含んでいるときは、各計算行は別の結果セットとして使用できるようになっています。これらの計算結果セットは、通常の行内に散在していて、通常の行を複数の結果セットに分割しています。

7.	fOption に SQL_UNBIND を指定して SQLFreeStmt を呼び出し、バインドされたすべての列バッファを開放します。

8.	別の結果セットが使用できる場合は、手順 1. に戻ります。


行セット バインドの使用

列方向のバインドを使用するには

1.	バインドされた列ごとに、以下の処理を行います。

1.	データ値を格納するために、R 個 (以上) の列バッファの配列を割り当てます。

2.	データ長を格納するために、R 個 (以上) の列バッファの配列を割り当てます。

3.	SQLBindCol を呼び出して、列のデータ値とデータ長を行セットの列にバインドします。

2.	fOption に SQL_BIND_TYPE を、vParam に SQL_BIND_BY_COLUMN を指定して SQLSetStmtOption を呼び出し、列方向のバインドを使用します。

行方向のバインドを使用するには

1.	R 個 (以上) の行バッファの配列を割り当てます。各行バッファには、C 個のデータ値と C 個のデータ長を要素として持つ必要があります。

2.	バインドされた列ごとに、以下の処理を行います。

●	SQLBindCol を呼び出して、行バッファの配列内の列のデータ値とデータ長バッファを行セットの列にバインドします。

3.	fOption に SQL_BIND_TYPE を、vParam に 1 行の要素のサイズを指定して SQLSetStmtOption を呼び出し、行方向のバインドを使用します。


 行セットのフェッチと更新

カーソルから行セットのフェッチおよび更新を行うには

1.	オプションで、fOption に SQL_ROWSET_SIZE を指定して SQLSetStmtOption を呼び出し、行セット内の行数 (R) を変更します。

2.	SQLExtendedFetch を呼び出して、行セットを取得します。

3.	バインドされた列を使用する場合は、行セットのバインドされた列バッファ内で現在利用できるデータ値とデータ長を使用します。

4.	バインドされていない列を使用する場合は、SQLSetPos を呼び出して、カーソル位置を設定後、バインドされていない列ごとに、以下の処理を行います。

●	1 回以上 SQLGetData を呼び出して、行セットの最後のバインドされた列以後の、バインドされていない列のデータを取得します。SQLGetData は、列番号を順番に増加しながら呼び出す必要があります。

●	SQLGetData を複数回呼び出して、text 列または image 列からデータを取得します。

5.	パラメータが実行時データ text 列または image 列の場合は、それをセットアップします。詳細については、実行時データ列の使用を参照してください。

6.	SQLSetPos を呼び出して、カーソル位置の設定、行セット内の行の再取得、更新、削除、または追加を行います。

実行時データ text 列または image 列を使用した場合は、それらを処理します。詳細については、実行時データ列の使用を参照してください。

7.	オプションで、SQLGetCursorName から取得した使用できるカーソル名を指定し、同じ接続上で別のステートメント ハンドルを使用して、位置指定 UPDATE または DELETE ステートメントを実行します。


実行時データ パラメータの使用

実行時データ text パラメータまたは image パラメータを処理するには

1.	プログラム バッファをステートメント パラメータにバインドするために、SQLBindParameter を呼び出すときに、以下のことを行います。

●	pcbValue に SQL_LEN_DATA_AT_EXEC(length) を指定します。length には、text または image パラメータ データの合計の長さを指定します。

●	rgbValue にプログラムで定義したパラメータ識別子を指定します。

2.	呼び出した SQLExecDirect または SQLExecute が SQL_NEED_DATA を返した場合は、実行時データ パラメータは既に処理されていることを示します。

3.	実行時データ パラメータごとに、以下の処理を行います。

1.	SQLParamData を呼び出し、プログラムで定義したパラメータ ID を取得します。別の実行時データ パラメータがある場合は、SQL_NEED_DATA が返ります。

2.	1 回以上 SQLPutData を呼び出し、length 分を送信するまで、パラメータ データを送信します。

4.	SQLParamData を呼び出し、最後の実行時データ パラメータの全データの送信が完了したことを示します。SQL_NEED_DATA は返りません。


実行時データ列の使用

実行時データ text または image 列を処理するには

1.	実行時データ列ごとに、以下の処理を行います。

●	SQLBindCol を呼び出してバインドする前に、特別な値をバッファに格納します。

pcbValue データ値バッファに SQL_LEN_DATA_AT_EXEC(length) を格納します。length には text 列データまたは image 列データの合計の長さを指定します。

rgbValue データ長バッファに、プログラムで定義した列識別子を格納します。

2.	SQLSetPos の呼び出しで SQL_NEED_DATA が返された場合は、実行時データ列が既に処理されたことを示します。

3.	実行時データ列ごとに、以下の処理を行います。

1.	SQLParamData を呼び出して、プログラムで定義した列 ID を取得します。別の実行時データ列がある場合は、SQL_NEED_DATA が返ります。

2.	1 回以上 SQLPutData を呼び出し、length 分を送信するまで、列データを送信します。

4.	SQLParamData を呼び出し、最後の実行時データ パラメータの全データの送信が完了したことを示します。SQL_NEED_DATA は返りません。


第 5 章   インプリメント
インプリメント

この章では、まずインプリメントされる以下の機能を説明します。その後、ほかにインプリメントされる項目を説明します。

●	Level-2 に完全に準拠

●	サーバー カーソル

●	Decimal および Numeric データ型

●	バッチ RPC

●	Prepare/execute ステートメント

●	SQL Server 機能の使用

●	ID 属性

●	Text/image 処理

●	パフォーマンスの向上

●	統合セキュリティ

●	Microsoft(R) SQL Server(TM) Version 4.21a の SQLExtendedFetch

●	DSN

●	DayOfWeek

●	プロシージャのリテラル パラメータ

●	SQLGetInfo の変更

●	INSTCAT.SQL

●	DBCS

●	算術エラー

●	ODBC SDK


 バージョン 2.5 の機能

ODBC SQL Server ドライバでは、バージョン 2.5 以降で使用できるようになった機能があります。それぞれの機能に関して、これ以降のトピックで説明されています。


  Level-2 に完全に準拠

SQL Server ドライバは、Level-2 ODBC API をすべてサポートします。以下の API がバージョン 2.5 で新しくサポートされるようになりました。

SQLParamOptions
SQLDescribeParam
SQLSetPos
SQLExtendFetch

これらの API の詳細については、関数と、『ODBC API Reference』を参照してください。


  サーバー カーソル

ODBC SQL Server ドライバは、Microsoft(R) SQL Server(TM) Version 6.0 (以下 SQL Server 6.0) でインプリメントされるサーバー カーソル (静的、キーセット、および動的) を自動的に使用します。この結果、パフォーマンスが向上し、以前のカーソル ライブラリと比較してカーソルの意味がわかりやすくなり、さらにクライアントでのメモリの使用がより効果的になりました。サーバー カーソルは以下の場合には使用されません。

●	ユーザーが ODBC_CURSORS を SQL_CUR_USE_ODBC に設定している場合。

●	ユーザーが、カーソルを前方のみ、読み取り専用、行セット = 1 で宣言している場合。

●	ユーザーが、カーソルを静的かつ更新可能で宣言している場合。

サーバー カーソルを使用する主な利点のひとつは、同じ接続上で、複数のカーソルをオープンして、複数のアクティブなステートメントを持つことができることです。ODBC 関数を使用したサーバー カーソルの詳細については、ODBC カーソルを参照してください。


  Decimal および Numeric データ型

ドライバでは、decimal データ型と numeric データ型を完全に使用できます。ほかのデータ型との適切な変換関数を用意しています。

以下の ODBC 関数はデータ型情報を返します。

SQLGetInfo	SQLDescribeCol
SQLGetTypeInfo	SQLProcedureColumns
SQLColumns	SQLSpecialColumns
以下の ODBC 関数は、ODBC SQL データ型と ODBC C データ型の変換を含んでいます。

SQLBindCol	SQLGetData
SQLBindParameter	SQLPutData


Batched RPCs
  バッチ RPC

ドライバは、サーバーに対するリモート ストアド プロシージャ (RPC) 要求を、適切な時点でバッチ処理します。この結果サーバーとの往復が大幅に減少し、多くの場合に大きなパフォーマンスの向上が得られます。ドライバが RPC 要求をバッチ処理するのは、ユーザーが標準的なストアド プロシージャ起動のバッチを実行したとき、または SQLPrepare/SQLExecute あるいは標準的なプロシージャ起動と SQLParamOptions を組み合わせて使用したときです。


Prepare/Execute Statements
  Prepare/Execute ステートメント

ドライバは、以前のバージョンのストアド プロシージャとは対照的に、SQLPrepare で一時的なストアド プロシージャを作成します。一時的なプロシージャは、接続が異常終了したときに、自動的に削除されます。以前は接続が異常終了した場合、SQLPrepare で作成したストアド プロシージャは状態が不明のまま取り残されてしまいました。さらに、ドライバはユーザーにドライバ固有の接続オプション (SQL_USE_PROCEDURE_FOR_PREPARE) を提供し、一時的なストアド プロシージャを削除する時点を管理できるようになりました。デフォルトでは、接続が開放されるときに削除されます。1 つの接続上で複数の prepare/execute ステートメントを実行していて、tempDB の使用を節約する必要があるときは、hstmt が閉じられたときに一時的なプロシージャを削除するようにドライバに指示できます。


 SQL Server 機能の使用

ドライバは SQL Server の以下の新機能を使用できます。

●	ドライバは SET TRANSACTION ISOLATION LEVEL ステートメントを使用して、次のことを行うことができます。

●	READ UNCOMMITTED 分離レベルの公開

●	厳密な直列化の設定

以前のバージョンでは、ユーザーが直列化できるオプションを要求した場合、ドライバは SELECT ステートメントの FROM 句に "手作業" で HOLDLOCK を挿入していました。

●	ドライバは SET FMTONLY ステートメントを使用して、SQLDescribeCol API と SQLColAttributes API をインプリメントします。以前のバージョンでは、これらの API をインプリメントするために、結果を返さない "ダミー" のクエリーを実行していました。

●	ドライバは ANSI の引用符で囲まれた識別子を採用し、スタートアップ シーケンスで SET QUOTED_IDENTIFIER ON ステートメントを実行します。

●	ドライバは、SQLPrimaryKeys および SQLForeignKeys API を使用して SQL Server の IEF を公開しています。

●	ドライバは SET ANSI_NULL_DFLT_ON ステートメントを使用して、列に対して ANSI 準拠のデフォルトの NULL 許可属性を設定します。以前のバージョンでは、列を指定後、ドライバが "手作業" で NULL キーワードを挿入していました。

●	ドライバは、ストアド プロシージャの text パラメータおよび image パラメータを有効にします。これらのストアド プロシージャの起動は、以前のバージョンの言語イベントとは対照的に、RPC 要求として処理されます。

●	ODBC SQLSetConnectOption を使用してパケット サイズが指定されていないときは、ドライバがサーバーに設定されているデフォルトのパケット サイズを自動的に使用します。


  ID 属性

ドライバは、SQLColAttributes の SQL_COLUMN_AUTO_INCREMENT ディスクリプタおよび SQLGetTypeInfo 結果セットの AUTO_INCREMENT 列を使用して、SQL Server の ID 属性を公開しています。ODBC が ID をデータ型として扱うのに対し、SQL Server は ID を属性として扱います。この不一致を解決するために、SQLGetTypeInfo は以下の新しいデータ型を返します。

●	int identity

●	smallint identity

●	tinyint identity

●	decimal identity

●	numeric identity


  Text/Image 処理

ドライバでは、text および image データの処理がいくつか強化されています。

●	SQL Server に接続しているとき、UPDATE ステートメントが複数の行に影響する場合に、ドライバは UPDATETEXT 関数を使用して、影響するすべての行の text 列および image 列の更新をサポートします。

SQL Server 4.2x に接続しているときは、UPDATE ステートメントが複数の行に影響する場合、最初の行の text 列および image 列が更新されます。

●	ドライバは、ドライバ固有のステートメント オプション (SQL_TEXTPTR_LOGGING) を公開して、text 列および image 列の操作のログへの記録を禁止できるようにしています。

●	サーバー カーソルを使用している場合は、ユーザーが明示的に SQLGetData を呼び出さない限りは、ドライバはバインドされていない列の text データおよび image データは取得しません。

●	SQL Server に接続しているとき、SQLExecDirect および SQLExecute は SQL_LEN_DATA_AT_EXEC を必要としませんが、使用した方がより効果的です。


  パフォーマンスの向上

ドライバには、パフォーマンスに関連する以下の新機能があります。

●	接続時間の向上―ドライバは接続を行うときの情報のクエリーをバッチ処理します。これによりサーバーとの往復が減少します。高速接続オプションは不要になり、サポートされなくなりました。

●	ドライバは、コピー操作をなくし、メモリの使用を効率的にしました。これにより、結果を高速に処理できるようになりました。

●	64 ビット算術演算―32 ビット ドライバは 64 ビット算術演算を使用して money、decimal、および numeric データ型との間のデータ変換を行います。


  統合セキュリティ

ドライバは、SQL Server からの安全な接続を要求するために、ドライバ固有のオプション (SQL_INTEGRATED_SECURITY) を用意しています。


 SQL Server Version 4.21a の SQLExtendedFetch

ドライバは、SQL Server Version 4.21a の SQLExtendedFetch API (前方のみ、読み取り専用カーソル) をサポートします。


  DSN

32 ビット ドライバをインストールすると、既存の 16 ビット DSN を 32 ビット アプリケーションで使用できるように、16 ビット DSN を 32 ビット DSN に変換するオプションが提供されます。さらにドライバは [OEMtoANSI] の設定を使用して新規 DSN を定義します。[OEMtoANSI] は [SQL Server クライアント設定ユーティリティ] ダイアログ ボックスで設定します。


   DayOfWeek

ドライバは ODBC で定義されている DAYOFWEEK 標準関数をサポートします。


  プロシージャのリテラル パラメータ

ドライバは、リテラル パラメータを持つ標準的なプロシージャ起動を、RPC 要求として実行します。以前のバージョンでは、プロシージャの起動がすべてパラメータ マーカーを持っていないと、要求は言語イベントとして実行されました。


SQLGetInfo 変更
  SQLGetInfo の変更

詳細については、SQLGetInfo 関数を参照してください。


  INSTCAT.SQL

新規 INSTCAT.SQL カタログは、新機能が追加され、以前のバージョンと比較してパフォーマンスが向上しています。


  DBCS

LENGTH 標準関数は SQL Server DATALENGTH 関数にマップされ、データ値の長さをバイト単位で返すようになりました。そのため、文字列内に任意の DBCS 文字が含まれている場合、LENGTH 標準関数は文字列内の文字数ではなく、文字列内のバイト数を返します。


  算術エラー

ODBC SQL Server ドライバ Version 2.5 は SET ARITHABORT ON を使用して ODBC を強化しています。


  ODBC SDK

ODBC SDK は Microsoft(R) SQL Workstation Version 6.5 の一部として含まれます。


  アクティブな hstmt

SQL Server ドライバは、hstmt をサーバー カーソルと共に使用しているとき以外は、アクティブな hstmt を 1 つしか持つことができません。ドライバは、この情報を SQL_ACTIVE_STATEMENTS を指定した SQLGetInfo を使用して返します。hstmt がアクティブと定義されるのは、結果を保留している場合です。この状況での結果とは、結果セットまたは UPDATE ステートメントで影響した行数などの、SQL Server が返すすべての情報のことです。

注意  hstmt がアクティブかどうかと、その状態とは無関係です。たとえば、SELECT ステートメントが実行され、行を 1 行も返さなければ、結果が保留されていないので、そのステートメントはアクティブではありません。ただし、再度そのステートメントを実行する前に、そのステートメントに関連付けられたカーソルを SQLFreeStmt を使用してクローズする必要があります。

SQL Server 6.x に接続しているときに、サーバー カーソルを使用している場合は、SQL Server ドライバは 1 つの接続上で複数のアクティブなステートメントをサポートします。

SQL Server 4.2x に接続しているときは、SQL Server ドライバは 1 つの接続上で 1 つのアクティブなステートメントしかサポートしません。SQL Server ドライバに同梱されているカーソル ライブラリを使用すると、アプリケーションは 1 つの接続上で複数のアクティブなステートメントを使用できます。


  カーソル ライブラリ

SQL Server ドライバに同梱されているカーソル ライブラリを使用すると、アプリケーションはスクロール可能なカーソルや更新可能なカーソル以外に、1 つの接続上で複数のアクティブなステートメントを使用できます。この機能をサポートするには、カーソル ライブラリ (ODBCCURS.DLL (16 ビット) または ODBCCR32.DLL (32 ビット)) をロードする必要があります。カーソル ライブラリの使用方法を指定するには SQLSetConnectOption を、カーソルの種類、同時実行、および行セットのサイズを指定するには SQLSetStmtOption を使用します。


  算術エラーの処理

SQL ステートメント実行中に、0 除算や数値のオーバーフローなどの、算術エラーが発生した場合は、そのステートメントの実行は中止されます。アプリケーションにエラーが通知される前に、結果の一部がクライアントに送信され、アプリケーションに配布されている可能性があります。

ドライバは、ARITHABORT を ON に設定します。

詳細については、『Transact-SQL リファレンス』の SET ステートメントの SET ARITHABORT および SET ARITHIGNORE を参照してください。


 手動コミット モード トランザクション

SQL Server ドライバが手動コミット モードの場合に、BEGIN TRANSACTION ステートメントでトランザクションを起動するのは、以下の場合です。

●	SQL ステートメントが保留されている場合。

●	現在のトランザクションがない場合。

●	そのステートメントが制限付きデータ定義言語 (DDL) ステートメントではない場合。

制限付き DDL ステートメントの詳細については、『Transact-SQL リファレンス』の「トランザクション」の項で、トランザクションで使用できないステートメントの一覧を参照してください。

手動コミット モードでトランザクションをコミットまたはロールバックするには、アプリケーションで SQLTransact を呼び出す必要があります。SQL Server ドライバは COMMIT TRANSACTION ステートメントを送信し、トランザクションをコミットします。または ROLLBACK TRANSACTION ステートメントを送信し、トランザクションをロールバックします。

制限付き DDL ステートメントを手動コミット モードで実行できるのは、以下の状況のいずれかの場合だけです。

●	手動コミット モード設定後、制限なし DDL ステートメントまたはデータ操作言語 (DML) ステートメントが実行される前。

または

●	トランザクションがコミットまたはロールバックされた後、制限なし DDL ステートメントまたは DML ステートメントが実行される前。

手動コミット モードの詳細については、このマニュアルの SQLSetConnectOption を参照してください。

以下の ODBC カタログ関数は、一時テーブルを作成するカタログ ストアド プロシージャを実行するので、トランザクション内部で呼び出すことはできません。

SQLColumnPrivileges
SQLForeignKeys
SQLPrimaryKeys (SQL Server 4.2x のみに限定)
SQLStatistics
SQLTablePrivileges


  リモート プロシージャ コール

SQL Server ドライバは、SQL Server に SQL ステートメントとしてプロシージャを渡すのではなく、SQL Server の RPC 機能を使用してプロシージャを実行します。プロシージャとして使用できるのは以下のものです。

●	準備されたステートメント (プロシージャとして格納されたステートメント)

●	ODBC のプロシージャ構文を使用して呼び出されたプロシージャ

●	SQL Server ドライバがカタログ関数をインプリメントするために使用するストアド プロシージャ

RPC を使用した場合、SQL ステートメントとしてプロシージャを渡す場合に比べて以下の利点があります。

●	SQL ステートメントとしてプロシージャを渡す場合に比べて、RPC の方が高速です。

●	RPC は出力パラメータを持つことができます。ただし、次の「制限事項」を参照してください。SQL ステートメントとしてプロシージャを渡す場合は出力パラメータを持つことができません。どちらの場合もプロシージャが値を返すことはできます。

RPC としてステートメントを実行するには、アプリケーションは以下のことを行います

1.	SQL ステートメントを構築します。

2.	ステートメントのパラメータごとに、SQLBindParameter を呼び出します。

3.	SQLPrepare を使用してステートメントを準備します。SQL_USE_PROCEDURE_FOR_PREPARE 接続オプションを SQL_UP_ON に設定する必要があります。

4.	SQLExecute を使用して、ステートメントを実行します。

RPC としてプロシージャを実行するには、アプリケーションは以下のことを行います

1.	ODBC プロシージャ構文を使用する SQL ステートメントを構築します。ステートメントでは、入力パラメータ、入出力パラメータ、および出力パラメータごとにパラメータ マーカーを使用します。プロシージャの戻り値がある場合もパラメータ マーカーを使用します。

2.	入力パラメータ、入出力パラメータ、および出力パラメータごとに、プロシージャの戻り値がある場合はその戻り値に対して SQLBindParameter を呼び出します。

3.	SQLExecDirect を使用して、ステートメントを実行します。

注意  アプリケーションが、ODBC プロシージャ構文ではなく、SQL Server 構文を使用してプロシージャを実行する場合、SQL Server ドライバは RPC としてではなく SQL ステートメントとして、プロシージャ呼び出しを SQL Server に渡します。


   制限事項

パラメータが SQL_DATA_AT_EXEC を使用してバインドされている場合は、RPC を言語イベント (EXEC Procname Params) として実行します。

RPC が言語イベントとして実行される場合は、出力パラメータは返されません。

ストアド プロシージャの出力パラメータは、入力パラメータでもあります。ただし、ストアド プロシージャはその入力値は使用できません。ただし、変換エラーを避けるために、有効な入力値を提供する必要があります。

入出力パラメータおよび出力パラメータでは、SQLBindParameter を使用して設定された長さ/精度 (cbColDef) およびスケール (ibScale) は、出力値に許される最大値に制限されます。


   Microsoft 分散トランザクション コーディネータの使用

SQL Server ドライバは、Microsoft 分散トランザクション コーディネータ (MS DTC) および MS DTC トランザクションをサポートします。

MS DTC を使用して 2 つ以上の SQL Server を更新するには

1.	MS DTC に接続するには、MS DTC OLE DtcSelectTransactionManager 関数を使用します。MS DTC の詳細については、『分散トランザクション コーディネータ ユーザーズ ガイド』を参照してください。

2.	確立する SQL Server 接続ごとに一度 SQLDriverConnect を呼び出します。

3.	MS DTC OLE ITransactionDispenser::BeginTransaction 関数を呼び出して、MS DTC トランザクションを開始し、トランザクションを表すトランザクション オブジェクトを取得します。

4.	MS DTC トランザクションにエンリストする ODBC 接続ごとに 1 回以上 SQLSetConnectOption を呼び出します。SQLSetConnectOption を呼び出すときは、fOption に SQL_COPT_SS_ENLIST_IN_DTC を指定し、vParam には手順 3. で取得したトランザクション オブジェクトを指定します。

5.	更新する SQL Server 接続ごとに一度 SQLExecDirect を呼び出します。

6.	MS DTC OLE ITransaction::Commit 関数を呼び出して、MS DTC トランザクションをコミットします。トランザクション オブジェクトは無効になります。

一連の MS DTC トランザクションを実行するには、手順 3. ～手順 6. を繰り返します。

トランザクション オブジェクトへの参照を開放するには、MS DTC OLE ITransaction::Return 関数を呼び出します。

MS DTC トランザクションで ODBC 接続を使用し、その後同じ接続をローカルな SQL Server トランザクションで使用するには、vParam に SQL_DTC_DONE を指定して SQLSetConnectOption を呼び出します。

注意  手順 4. と手順 5. で示されたように SQLSetConnectOption と SQLExecDirect を呼び出す代わりに、SQL Server ごとに SQLSetConnectOption と SQLExecDirect を順番に呼び出すこともできます。


パフォーマンス データのログ記録

Microsoft(R) SQL Server(TM) Version 6.5 (以下 SQL Server 6.5 または SQL Server) では、ODBC SQL Server ドライバはパフォーマンス データのログへの記録をサポートします。

ODBC パフォーマンス データをログに記録するには

1.	オプションで、fOption に SQL_COPT_SS_PERF_DATA_LOG を、および vParam にパフォーマンス データ ログ ファイルのフルパスとファイル名を指定して、以下のように SQLSetConnectOption を呼び出します。

C:\\ODBCPERF.LOG

2.	fOption に SQL_COPT_SS_PERF_DATA を、および vParam に SQL_PERF_START を設定して SQLSetConnectOption を呼び出し、パフォーマンス データのログ記録を開始します。

3.	fOption に SQL_COPT_SS_PERF_DATA を、および pvParam に SQLPERF 構造体へのアドレスを設定して SQLGetConnectOption を呼び出します。現在のパフォーマンス データを保持する有効な SQLPERF 構造体を指すポインタを指定します。

4.	オプションで、fOption に SQL_COPT_SS_LOG_NOW を、および vParam に NULL を指定して SQLSetConnectOption を呼び出し、パフォーマンス データのタブで区切られたレコードをパフォーマンス データ ログ ファイルに書き込みます。

5.	fOption に SQL_COPT_SS_PERF_DATA を、および vParam に SQL_PERF_STOP を指定して SQLSetConnectOption を呼び出し、パフォーマンス データのログへの記録を停止します。

SQLPERF 構造体は、以下のように定義されています。

typedef struct sqlperf

{

// Application Profile Statistics

DWORD TimerResolution;

DWORD SQLidu;	LDOUBLE AvgFetchTime;

LDOUBLE AvgCursorSize;

LDOUBLE AvgCursorUsed;

DWORD SQLFetchTime;

DWORD SQLFetchCount;

DWORD CurrentStmtCount;

DWORD MaxOpenStmt;

DWORD SumOpenStmt;

// Connection Statistics

DWORD CurrentConnectionCount;

DWORD MaxConnectionsOpened;

DWORD SumConnectionsOpened;

DWORD SumConnectionTime;

LDOUBLE AvgTimeOpened;

// Network Statistics

DWORD ServerRndTrips;

DWORD BuffersSent;

DWORD BuffersRec;

DWORD BytesSent;

DWORD BytesRec;

// Time Statistics;

DWORD msExecutionTime;

DWORD msNetworkServerTime;

} 	SQLPERF;

DWORD SQLiduRows;

DWORD SQLSelects;

DWORD SQLSelectRows;

DWORD Transactions;

DWORD SQLPrepares;

DWORD ExecDirects;

DWORD SQLExecutes;

DWORD CursorOpens;

DWORD CursorSize;

DWORD CursorUsed;

LDOUBLE PercentCursorUsed;


  ODBC SQL Server ドライバのその他の情報

Microsoft SQL Server 6.5 に接続した場合、以下のことが可能です。

●	USER キーワードは ODBC SQL 構文の一部としてサポートされます。

●	ODBC カタログ関数で、サーバー側の静的カーソルが使用できます。

●	DEFAULT キーワードが標準的なプロシージャ起動でサポートされます。DEFAULT キーワードを指定して、デフォルトのプロシージャ パラメータを指定できます。

●	デフォルトのプロシージャ パラメータを任意の位置で使用できます。SQL Server Version 6.0 以前に接続しているときは、デフォルトのプロシージャ パラメータは、デフォルト以外のプロシージャ パラメータよりも後に指定する必要があります。

●	NULL リテラル パラメータを含む標準的なプロシージャ起動は、RPC 要求として実行されます。SQL Server Version 6.0 以前に接続しているときは、要求は言語イベントとして実行されます。

●	SQLTablePrivileges は、テーブル所有者およびテーブル名パラメータでの検索パターンをサポートします。すべてのサーバーでサポートします。

●	SQLTablePrivileges および SQLColumnPrivileges は、WITH GRANT 句を使用して許可した結果を反映するために、結果セット内の GRANTOR 列情報を返します。

●	トランザクション内部で以下の ODBC カタログ関数を使用できます。

SQLColumnPrivileges	SQLStatistics
SQLForeignKeys	SQLTablePrivileges
SQLPrimaryKeys
●	SQLSetStmtOption SQL_MAX_ROWS オプションは、どのバージョンの SQL Server に接続している場合でも SET ROWCOUNT ステートメントにマップされます。従って、このオプションを設定すると、指定した行数分処理されるたびに、すべての Transact-SQL(R) ステートメントの処理を停止できます。停止できるステートメントは、指定行数でのキーセット カーソルの設定以外にも、INSERT、UPDATE、および DELETE ステートメントなどの、データ変更やトリガも含まれます。このオプションは警告として、主に SELECT ステートメントで使用します。

●	サーバー側でカーソルが使用されたとき、SQLColAttributes の fDescType パラメータとして以下の属性がサポートされます。

SQL_COLUMN_TABLE_NAME

SQL_COLUMN_OWNER_NAME

SQL_COLUMN_QUALIFIER_NAME

●	ODBC の標準的なプロシージャ コールのパラメータは、出力パラメータのみですが、無効な入力データを含むことができます。

●	ODBC like escape 句がサポートされます。

●	すべての ODBC 外部結合拡張を制限なしで使用できます。

●	character データ型または binary データ型を格納するときは、ブランク以外 (character データ型) または 0 以外 (binary データ型) のデータの切り捨てが行われると SQL_ERROR が返されます。その後 SQLError を呼び出すと、 szSqlState に "22001" が返されます。

●	SQLSetPos では、以下のパフォーマンス強化が行われました。

●	SQLSetPos は非同期実行をサポートします。

●	fOption に SQL_DELETE を、および irow に 0 を指定して SQLSetPos を呼び出すと、単一のサーバー操作が行われます。

●	fOption に SQL_UPDATE または SQL_ADD を、および irow に 0 を指定して SQLSetPos を呼び出すと、複数の RPC バッチを使用します。

●	自動コミット モード以外では、ODBC SQL Server ドライバは SET IMPLICIT_TRANSACTION ON を使用してパフォーマンスを向上します。

SQL Server 6.0 以降に接続しているときは、静的カーソルおよびキーセット カーソルで、ブックマークがサポートされます。


第 6 章   SQL 文法
SQL 文法

ODBC SQL Server ドライバは、主要な SQL 文法はすべてサポートしています。また、SQL Server ドライバは、拡張 ODBC 文法で大部分の SQL ステートメントをサポートしています。Microsoft(R) SQL Server(TM) Version 6.5 (以下 SQL Server 6.5 または SQL Server) に接続しているときは、拡張 ODBC 文法は ALTER TABLE ステートメントの DROP COLUMN 句、および DROP VIEW、DROP TABLE、REVOKE ステートメントの CASCADE 句と RESTRICT 句だけはサポートしていません。ODBC の設計に従い、SQL Server ドライバはネイティブな SQL 文法を SQL Server に渡します。

この章では、サポートしている文法とサポートしていない文法について説明します。この章には以下のセクションが含まれています。

●	SQL 文法の制限事項

●	実行時データ パラメータの制限事項

●	プロシージャ起動の制限事項

●	サポートされていない ODBC SQL 文法

●	Null 許可属性の解決


 SQL 文法の制限事項

SQL Server ドライバおよび SQL Server は、ODBC SQL 文法で以下のプログラミング上の制限を受けます。

ODBC SQL 文法	SQL Server/SQL Server ドライバの制限事項
実行時データ パラメータの制限事項	SQL_LONGVARCHAR または SQL_LONGVARBINARY 列で、大量のデータの送信に使用する実行時データ パラメータは、いくつか制限を受けます。 詳細については、実行時データ パラメータの制限事項を参照してください。
OUTER JOIN	Microsoft(R) SQL Server(TM) Version 6.0 (以下 SQL Server 6.0) 以前に接続しているときは、外部結合の検索条件は等価条件 (=) にする必要があります。ODBC 外部結合拡張をテーブル参照リストの最後に指定する必要があります。 SQL Server 6.0 以前では、ネストした外部結合および外部結合内でネストした内部結合はサポートしません。テーブルが外部結合の内部テーブルになり、さらに内部結合に関係することはできません。テーブルが外部結合の内部テーブルになり、さらに別の外部結合の外部テーブルになることはできません。ただし、テーブルが内部結合に関係し、外部結合の外部テーブルになることはできます。
プロシージャ	プロシージャは、準備されたステートメント バッチ内の最初のステートメントとして起動する必要があります。また、EXECUTE ステートメントで起動されるか、ODBC の標準的なプロシージャ起動を使用して起動される必要があります。 詳細については、プロシージャ起動の制限事項を参照してください。


実行時データ パラメータの制限事項

実行時データ パラメータを使用して、SQL_LONGVARCHAR (text) 列または SQL_LONGVARBINARY (image) 列で、65,535 バイトを超えるデータ (SQL Server Version 4.21a) または 250KB のデータ (SQL Server Version 6.0 以降) を送信する場合、パラメータは以下の制限を受けます。

●	INSERT ステートメントでは、insert_value としてだけ使用できます。

●	UPDATE ステートメントの SET 句では expression としてだけ使用できます。

●	SQL_LONGVARCHAR データ型または SQL_LONGVARBINARY データ型以外のデータ型を持つ実行時データ パラメータを指定したステートメントは使用できません。

●	実行時データ パラメータ以外の任意のデータ型は、ステートメントで使用できます。

●	実行時データ パラメータの値が NULL の場合は、SQLBindParameter の引数 cbColDef および SQLPutData の引数 cbValueMax は SQL_NULL_DATA でなければなりません。

●	SQLParamData が SQL_NEED_DATA を返した後、列に対する SQLPutData の呼び出し操作が完了する前にキャンセルすると、部分的な更新が発生する可能性があります。キャンセルされたときに処理していた text 列または image 列は、中間的な "プレース ホルダ" 値に設定され、未処理の text 列または image 列は変更されないまま残ります。


プロシージャ起動の制限事項

最大の共通性を引き出すために、プロシージャの起動に SQL 言語に対する ODBC {call procedure} 拡張を使用する必要があります。{call} 構文を使用しないでプロシージャを準備する場合は、各ストアド プロシージャの前に EXECUTE を使用します。この理由は、SQL Server ドライバが準備しているステートメントの前後にほかの SQL ステートメントを置くためです。この結果、準備したステートメントがバッチの最初のステートメントではなくなります。

SQL Server ドライバでは、プロシージャを直接実行する代わりに、プロシージャを起動するステートメントを準備する利点はありません。[用意したステートメントのストアド プロシージャを作成] チェック ボックスをオンにすると、SQL Server ドライバはそのステートメントをプロシージャ内に格納し、そのプロシージャをコンパイルすることにより、ステートメントを準備します。ただし、ステートメントをプロシージャ内に格納し、そのプロシージャをコンパイルすることによりステートメントを準備するのを無効にできます。ストアド プロシージャが SQLPrepare のインプリメントに使用されないようにするには、[SQL Server セットアップ] ダイアログ ボックスの [用意したステートメントのストアド プロシージャを作成] チェック ボックスをオフにするか、SQLSetConnectOption の SQL_USE_PROCEDURE_FOR_PREPARE オプションに SQL_UP_OFF を設定します。これにより、準備されるステートメントは実行時に格納され、実行されます。このストアド プロシージャは SQLPrepare のインプリメントには使用されません。さらに、すべての構文エラー チェックは実行時まで延期されます。

SET NOCOUNT ON ステートメントが実行されているときは、ストアド プロシージャに埋め込まれている複数のステートメントは、本来複数生じるはずの結果を作成しません。ドライバは、ストアド プロシージャ内部の SQL ステートメントが生成した行カウントを無視します。


ストアド プロシージャを使用するカーソル

サーバー カーソルをオープンできるのは、単一の SELECT ステートメントを含むストアド プロシージャだけです。SELECT ステートメントを含まないストアド プロシージャ、複数の SELECT ステートメントを含むストアド プロシージャ、または SELECT ステートメント以外のすべてのステートメントを使用している場合は、エラーが発生します。この制限のため、SQL Server 6.0 以前に接続しているときは、サーバー カーソルと ODBC カタログ関数と共に使用することはできません。


サポートされていない ODBC SQL 文法

SQL Server ドライバは、以下の文法以外はすべての主要 ODBC SQL 文法および拡張 ODBC SQL 文法を完全にサポートしています。

サポートされていない文法	説明
DAYOFWEEK	SQL Server 4.2x に接続しているときは、スカラー関数 DAYOFWEEK はサポートしません。SQL Server 6.x に接続しているときは、サポートします。
DELETE	SQL Server 4.2x に接続しているときは、位置指定削除ステートメントの WHERE CURRENT OF cursor_name 句はサポートしません。SQL Server 6.x に接続しているときは、サポートします。
DROP INDEX	table_name および index_name を index_name の代わりに使用する必要があります。
IEF	SQL Server 4.2x に接続しているときは、IEF (Integrity Enhancement Facility) の句はサポートしません。SQL Server 6.x に接続しているときは、CASCADE 句および RESTRICT 句以外のすべての句をサポートします。
MAX、MIN	これらの設定関数では、DISTINCT キーワードはサポートされていません。
SELECT	SQL Server 4.2x に接続しているときは、SELECT ステートメントの FOR UPDATE OF 句はサポートしません。SQL Server 6.x に接続しているときは、サポートします。
UPDATE	SQL Server 4.2x に接続しているときは、位置指定 UPDATE ステートメントの WHERE CURRENT OF cursor_name 句はサポートしません。SQL Server 6.x に接続しているときは、サポートします。
USER	SQL Server Version 6.0 以前に接続しているときは、IEF の DEFAULT 句以外では USER キーワードはサポートしません。


NULL 許可属性の解決

ODBC 文法では、NULL 許可属性が設定されていない列は NULL が有効であると見なします。SQL Server 文法では、NULL 許可属性が設定されていない列は NULL が無効であると見なします。

SQL Server 6.x に接続している場合は、SQL Server ドライバはこの問題を SET ANSI_NULL_DEFAULT_ON を設定することで解決します。これにより bit 列またはユーザー定義型以外の NULL 許可属性が指定されていない列は、サーバーがデフォルトで NULL を使用します。

SQL Server 4.2x に接続しているときは、CREATE TABLE ステートメントでの各列定義で、列で NULL が有効か無効かを指定していない場合は、SQL Server ドライバが NULL 指定を追加します。ただし、NULL にはできない bit 列は除きます。また、ALTER TABLE ステートメントでの各列定義に NULL 指定を追加します。ただし、NULL にはできない bit 列は除きます。


第 7 章   ODBC カーソル
ODBC カーソル

この章では、ODBC カーソルおよびサーバー カーソルの使い方について説明した後、カーソルの作成、カーソルからのデータの取得、カーソルの更新、およびカーソルのクローズについて説明します。

ODBC カーソルの使い方


ODBC カーソルの使い方

Microsoft(R) SQL Server(TM) Version 6.x (以下 SQL Server 6.x または SQL Server) はエンジン ベースのカーソルをサポートし、SQL Server ドライバのバージョン 2.5 以降では、この優れた機能を使用しています。ここでは、ODBC API を使用したサーバー カーソルの使い方を簡単に説明します。


ODBC カーソル モデル

ODBC がサポートするカーソル モデルでは、一括フェッチのほかに、複数の型のカーソル、カーソル内のスクロール、複数の同時実行オプション、および単一行カーソルが有効です。SQL Server 6.x とは異なり、ODBC にはカーソルの宣言、オープン、およびクローズに関する明示的な API がありません。SQLExecDirect の実行時、または SQLPrepare 後の指定したステートメント オプションに基づいた SQLExecute の実行時に、自動的にカーソルが作成されます。


タイプ A とタイプ B ステートメント

SQL Server ドライバは、タイプ A とタイプ B の 2 種類のステートメントを使用します。

タイプ A ステートメントは、以下の 3 つのステートメント オプションに対して、デフォルトの設定を使用するすべてのステートメントとして定義されます。

オプション	デフォルト
SQL_CONCURRENCY	SQL_CONCUR_READ_ONLY
SQL_CURSOR_TYPE	SQL_CURSOR_FORWARD_ONLY
SQL_ROWSET_SIZE	1
タイプ A ステートメントは、サーバー カーソルを使用しません。代わりに、クエリーはサーバーで実行され、結果セットがアプリケーションに返されます。SQL Server ドライバは、このデータに対して SQLFetch および SQLExtendedFetch を実行できます。つまり、カーソルをオープン後行セット サイズを変更でき、ブロック フェッチを実行できます。ただし、すべてのデータをフェッチするまで、つまりカーソルの最後に到達するまで、またはカーソルがクローズされるまで、クライアントとサーバー間の接続はビジー状態のままになります。すべての行を順番に取得し、さらに更新を行う必要がない場合は、このオプションがもっとも高速です。サーバー カーソルが使用されないので、タイプ A ステートメントでは、 WHERE CURRENT OF を使用した位置指定操作はできません。

タイプ B ステートメントは、上記の 3 つのステートメント オプションに対して、デフォルトの設定を使用しないすべてのステートメントとして定義されます。タイプ B ステートメントでは、ドライバは大部分の場合にサーバー カーソルを使用します。制限事項については、この章の後半の「カーソルの作成」を参照してください。


サーバー カーソルの使い方

SQL Server 6.x でインプリメントされているサーバー カーソルを使用する利点はいくつかあります。

●	パフォーマンス ― データを参照する多くのアプリケーションに共通することですが、カーソル内の少量のデータにアクセスしようとする場合、結果セット全体ではなく、必要なデータだけがネットワーク上を送信されるので、サーバー ベースのカーソルを使用すると最適のパフォーマンスを得ることができます。

●	さまざまなカーソルの種類 ― サーバー カーソルを使用する場合だけ、キーセット カーソルおよび動的カーソルを使用できます。さらに、カーソル ライブラリがサポートするのは、読み取り専用同時実行制御を使用した前方のみカーソル、および読み取り専用とオプティミスティック同時実行制御を使用した静的カーソルだけです。サーバー カーソルを使用すると、さまざまなカーソルの種類で、すべての範囲の同時実行制御を使用できます。

●	理解しやすいカーソル ― カーソル ライブラリでは、SQL 検索更新ステートメントを生成して、カーソル更新をシミュレートします。そのため、意図しない更新が行われることがあります。

●	メモリの使用法 ― サーバー ベース カーソルを使用しているときは、クライアントが大量のデータをキャッシュしたり、カーソル位置に関する情報を管理する必要がありません。サーバーがこの機能を提供します。

●	複数のオープン カーソル ― サーバー ベースのカーソルを使用しているときは、カーソル操作とカーソル操作の間は、クライアントとサーバー間の接続はビジーのままにはなりません。この結果、同時に複数のカーソル hstmts をアクティブにできます。ただし、ODBC の仕様では hstmt ごとに 1 つのカーソルと制限されています。タイプ A ステートメントに関連付けられた hstmt ごとに 1 つのカーソルという制限を回避するには、ステートメント オプションを変更して、タイプ B ステートメントに関連付けられたサーバー カーソルを取得します。


カーソルの作成

ODBC カーソルの本質的な目的は、カーソル定義を SQL ステートメントとして SQLExecuteDirect または SQLPrepare/SQLExecute の引数に渡すことです。SQL Server ドライバを使用して、カーソルを作成するときには、以下の規則が適用されます。

●	サーバー カーソルが作成されるのは、SELECT、EXEC[ute] procedure_name、または {call procedure_name} 句で始まるステートメントに対してだけです。それ以外のステートメントは、タイプ A ステートメントとして扱います。サーバー カーソルは SQL バッチでは作成されません。SQL バッチはタイプ A ステートメントとして扱います。

●	SQL Server Version 6.0 以前に接続しているときは、動的カーソルまたはキーセットカーソルを要求し、カーソル定義で参照しているテーブルごとに一意なインデックスが存在しない場合は、サーバーは静的カーソルを作成し、ドライバは SQL_SUCCESS_WITH_INFO ステータスを返します。

●	SQL Server では、ビュー以外にもベース テーブルでもカーソルを作成できます。さらに、カーソルを複数テーブル間の結合と集計演算の両方またはどちらか一方を含むクエリーでオープンできます。ただし、カーソル定義では、キーワード COMPUTE、COMPUTE BY、FOR BROWSE、および INTO は使用できません。

●	カーソル定義に UNION、UNION ALL、外部結合、HAVING を指定した GROUP BY、HAVING を指定しない GROUP BY、または DISTINCT が含まれる場合、要求されたカーソル種類とは無関係に、常に静的カーソルを作成し、ドライバは SQL_SUCCESS_WITH_INFO ステータスを返します。

●	SQL Server Version 6.0 以前に接続しているときは、動的カーソルを要求し、カーソル定義に一意なインデックスまたはサブクエリーと一致しない ORDER BY 句が含まれる場合、サーバーはキーセット カーソルを作成し、ドライバは SQL_SUCCESS_WITH_INFO ステータスを返します。

●	行バージョンの同時実行を要求したときに、カーソル定義の各テーブルに timestamp 列がない場合、サーバーは値に基づく同時実行制御を行い、ドライバは SQL_SUCCESS_WITH_INFO ステータスを返します。

●	SQLExecDirect (EXEC[ute] procedure_name または {call procedure_name}) でカーソルを取得できるのは、プロシージャに SELECT ステートメントが 1 つ含まれて、それ以外のステートメントが含まれていないときだけです。それ以外は、SQL Server はエラーメッセージを出力します。

●	複数の SELECT ステートメントを含むバッチを実行する場合、タイプ A ステートメントに関連付けられたカーソル動作を自動的に取得します。ただし、最初のステートメントが SELECT、EXECUTE、または ODBC の標準的なプロシージャ起動である場合を除きます。どの場合でも、SQL Server ドライバはエラー メッセージを出力します。

また、キーセット カーソルは非同期に生成できます。sp_configure に関する SQL Server のマニュアルを参照してください。非同期キーセットを生成しても、SQLRowCount 以外のカーソル関連の ODBC API には影響を与えません。

以下の ODBC 関数がカーソルの作成に関連します。

SQLSetStmtOption	SQLGetCursorName
SQLSetScrollOptions	SQLGetStmtOption
SQLSetConnectOption	SQLGetInfo
SQLSetCursorName


カーソルを使用したデータの取得

カーソルを使用してデータを取得する方法には以下の 2 種類があります。

●	SQLBindCol を使用して、結果セットの複数行を記憶領域にバインドし、その後 SQLFetch を使用して、結果セット内の次の行に移動します。一括フェッチの場合は、列を配列にバインドし、SQLExtendedFetch を使用します。SQL Server ドライバは行方向バインドと列方向バインドをサポートします。サーバー カーソルを使用する場合は、各 SQLFetch または SQLExtendedFetch の操作はサーバーとのやり取りを必要とし、これらの操作と操作の間は、接続が開放状態であることに注意してください。サーバーは、カーソルの現在位置など、必要なすべての状態情報を管理します。また、カーソル操作をシーケンシャルに実行する必要はありません。サーバーでは、カーソルを現在位置から相対的に前方または後方に移動できます。また、動的カーソル以外は、カーソル位置を結果セット内で絶対行番号で直接設定できます(動的カーソルは例外です)。

●	バインドされていない列、つまり記憶領域が割り当てられていない列のデータを取得できます。SQLFetch または SQLExtendedFetch を使用して、カーソルを次の行に移動し、SQLGetData を呼び出して、指定したバインドされていない列のデータを取得します。その後、SQLGetData を同じ列に対して複数回呼び出して、数回に分けてデータを取得できます。この方法は、text または image 列の大量のデータを取得する場合に役立ちます。ただし、列に関連付けられたすべてのデータを読み出すまで、接続がビジー状態になることに注意してください。Position オプションを指定して SQLSetPos を実行すると、SQL Server ドライバは残りのデータをフラッシュして接続を開放します。その結果、ユーザーはほかの hstmt での処理のために接続を使用できます。

同じ行で、バインドされた列とバインドされていない列の両方からデータを取得できます。

大容量になる可能性がある text 列および image 列を含む行を取得するときに、行内のテキストのデータ列にアクセスしたくない場合は、列にバインドしません。SQLExtendedFetch を実行すると、以前はテキスト データを含む行全体が返されましたが、バインドされていない列へのテキスト ポインタだけを含むようになりました。

以下の ODBC 関数が関連します。

SQLFetch	SQLRowCount
SQLExtendedFetch


カーソルの更新

通常、目的の行にまず移動してから一度に 1 行ずつデータが更新されます。SQLSetPos には行セット全体に影響するオプションがあります。カーソルを特定行に移動するには、次に示す方法を使用できます。

●	SQLFetch を 1 回以上呼び出します。

●	SQLExtendedFetch を 1 回以上呼び出します。

●	SQL_POSITION オプションを指定して、SQLSetPos を呼び出します。

結果セットのデータを更新するには、次に示す 2 つの方法があります。

●	UPDATE WHERE CURRENT OF cursor_name または DELETE WHERE CURRENT OF cursor_name を実行して、現在カーソルが指す行を更新または削除できます。位置指定 UPDATE または位置指定 DELETE ステートメントは、同じ接続上にある別の hstmt で実行する必要があり、カーソル名を指定する必要があります。カーソル名は SQLSetCursorName 関数で明示的に設定できます。これにより、複数のカーソルで同時に作業できます。

●	SQLSetPos 関数を使用して、行データを追加、削除、および更新できます。SQLSetPos API には、目的の操作、目的の行番号、および行のロック方法を指定するオプションがあります。SQLSetPos は SQLExtendedFetch でフェッチされた行セットだけで使用できます。

以下の ODBC 関数が関連します。

SQLSetPos

SQLRowCount


カーソルのクローズ

トランザクションをコミットまたはロールバックすると、カーソルは自動的にクローズされます。SQL Server ドライバには、サーバー カーソルのこのクローズ動作を無効にするためのドライバ固有の接続オプション SQL_PRESERVE_CURSORS があります。このオプションを SQL_PC_ON に設定すると、カーソルはオープンされたままになり、トランザクションのコミットまたはロールバック後も、カーソルの状態が保持されます。

以下の ODBC 関数が関連します。

SQLFreeStmt

SQLTransact


第 8 章   関数
関数

この章では、ODBC SQL Server ドライバが特定の ODBC 関数をインプリメントする方法を説明します。

ODBC API 関数のインプリメント


ODBC API 関数のインプリメント

SQL Server ドライバは、以下の表に一覧する関数以外にも変換 DLL もサポートします。サポートされる各関数のインプリメント方法の説明については、以下のセクションを参照してください。

関数	説明
SQLBrowseConnect	SQLBrowseConnect は 3 レベルのキーワードを使用します。 1. DSN、DRIVER 2. SERVER、UID、PWD、APP、WSID  3. DATABASE、LANGUAGE
SQLConnect	SQLConnect は DATABASE デフォルトと LANGUAGE デフォルトをサポートします。
SQLDriverConnect	SQLDriverConnect は、キーワード DSN、DRIVER、SERVER、UID、PWD、APP、 WSID、DATABASE、および LANGUAGE を使用します。
SQLColAttributes、 SQLDescribeCol、および SQLNumResultCols	SELECT ステートメントが準備された後、それが実行される前にこれらの関数が呼び出された場合は、SQL Server ドライバは SET FMTONLY を使用して、SQL Server に結果セットに関して必要な情報を生成させます。
SQLConfigDataSource	SQLConfigDataSource は、接続オプションを設定するキーワードを使用して、データ ソースを動的に追加、変更、または削除します。
SQLPrepare	Microsoft(R) SQL Server(TM) Version 6.5 (以下 SQL Server 6.5 または SQL Server) は、ODBC の Prepare/Execute モデルを直接サポートしません。SQL ステートメントを準備するために、SQL Server ドライバは一時的なプロシージャを作成します。この一時的なプロシージャは後で実行するためにステートメントをコンパイルします。SQLPrepare 用のストアド プロシージャの生成を無効にするには、[ODBC SQL Server セットアップ] ダイアログ ボックス、または SQLSetConnectOption 関数を使用します。無効にされた場合は、SQL ステートメントは格納され、そのステートメントが実行されるたびにサーバーに送信されます。
SQLParamOptions	SQLParamOptions 関数を使用して、アプリケーションは SQLBindParameter で割り当てたパラメータに対して、複数の値の配列を指定できます。crow に 2 以上の値を指定して SQLParamOptions を呼び出すと、ドライバは複数の SQL ステートメントを実行する SQL ステートメント バッチまたはストアド プロシージャ バッチを作成します。
SQLDescribeParam	SQLDescribeParam 関数は、準備された SQL ステートメントに関連付けられたパラメータ マーカーの説明を返します。
SQLRowCount	この関数が "カーソルがオープンされた" 後に呼び出され、カーソルがキーセット カーソルまたは静的カーソルの場合は、結果セット内の行数を返します。動的カーソルの場合は、SQLRowCount は常に  - 1 を返します。キーセット カーソルが非同期カーソルとして作成されている場合は、キーセット全体が作成されるまで、SQLRowCount は  - 1 を返します。
SQLTables	ドライバは、szTableQualifier パラメータに対する検索パターンはサポートしません。


SQLBrowseConnect

SQLBrowseConnect は、接続情報を 3 つのレベルに分類できるキーワードを使用します。以下の表は、キーワードごとに有効な値のリストが返されるかどうか、およびキーワードがオプションかどうかを示しています。

レベル 1

キーワード	リストが返されるかどうか	オプションかどうか	説明
DSN	N/A	いいえ	SQLDataSources が返す場合は、データ ソース名。DRIVER キーワードを使用した場合は、DSN キーワードは使用しません。
DRIVER	N/A	いいえ	SQL Server ドライバ名は {SQL Server} です。16 ビット プログラムでは、32 ビット ドライバ名は {SQL Server (32 bit)} です。
レベル 2

キーワード	有効な値のリストが返されるかどうか	オプションかどうか	説明
SERVER	はい	いいえ	データ ソースが存在するネットワーク上のサーバー名。Microsoft(R) Windows NT(R) (以下 Windows NT) が動作している場合は、サーバーとして "(ローカル)" を入力できます。この場合、ネットワークを使用しないときでも、SQL Server のローカルなコピーを使用できます。16 ビット SQL Server ドライバが、ネットワークなしで "(ローカル)" を使用する場合は、"MS Loopback Adapter" がインストールされている必要があります。
UID	いいえ	はい	ユーザー ログイン ID。
PWD	いいえ	はい (ユーザーによって異なります)	ユーザー指定のパスワード。
APP	いいえ	はい	SQLBrowseConnect を呼び出しているアプリケーション名。
WSID	いいえ	はい	ワークステーション ID。通常は、アプリケーションが存在するコンピュータのネットワーク名。
レベル 3

キーワード	有効な値のリストが返されるかどうか	オプションかどうか	説明
DATABASE	はい	はい	SQL Server データベース名。
LANGUAGE	はい	はい	SQL Server が使用しているその国の言語。
SQLBrowseConnect は、ODBC データ ソース定義に格納されている DATABASE キーワードと LANGUAGE キーワードの値を無視します。SQLBrowseConnect に渡された接続文字列内で指定されたデータベースまたは言語が無効の場合は、SQLBrowseConnect は SQL_NEED_DATA およびレベル 3 接続属性を返します。

SQLBrowseConnect は、DATABASE キーワードにリストされたすべてのデータベースに対してユーザーのアクセス権をチェックしません。ユーザーが指定したデータベースのアクセス権を持っていない場合は、SQLBrowseConnect は SQL_NEED_DATA およびレベル 3 接続属性を返します。


SQLConnect

SQLConnect 関数は、以下のパラメータを使用します。

パラメータ	説明
szDSN	SQLDataSources が返す場合のデータ ソース名。
szUID	ユーザー ログイン ID。
szAuthStr	ユーザー指定の認証文字列 (通常はパスワード)。
SQLConnect は、ODBC データ ソース定義から LANGUAGE キーワード値を取得します。SQL Server ドライバが指定された言語を使用できない場合は、指定されたユーザー ID のデフォルト言語を使用し、SQL_SUCCESS_WITH_INFO を返します。SQL Server ドライバが指定されたユーザー ID のデフォルト言語を使用できない場合は、SQL_ERROR を返します。

SQLConnect は、ODBC データ ソース定義から DATABASE キーワード値を取得します。SQL Server ドライバが指定されたデータベースを使用できない場合は、指定されたユーザー ID のデフォルトのデータベースを使用し、SQL_SUCCESS_WITH_INFO を返します。SQL Server ドライバが指定されたユーザー ID のデフォルトのデータベースを使用できない場合は、SQL_ERROR を返します。


SQLDriverConnect

SQLDriverConnect 接続文字列は、以下のキーワードを使用します。

キーワード	説明
DSN	SQLDataSources が返す場合のデータ ソース名。DRIVER キーワードを使用している場合は、DSN キーワードは使用しません。
DRIVER	SQLDrivers が返す場合のドライバ名。DSN キーワードを使用している場合は、DRIVER キーワードは使用しません。 SQL Server ドライバ名は {SQL Server} です。16 ビット プログラムでは、32 ビット ドライバ名は {SQL Server (32 bit)} です。
SERVER	データ ソースが存在するネットワーク上のサーバー名。Microsoft Windows NT が動作している場合は、サーバーとして "(ローカル)" を入力できます。この場合、ネットワークを使用しないときでも、SQL Server のローカルなコピーを使用できます。16 ビット SQL Server ドライバが、ネットワークなしで "(ローカル)" を使用する場合は、"MS Loopback Adapter" がインストールされている必要があります。
UID	ユーザー ログイン ID。
PWD	ユーザー指定のパスワード。
APP	SQLDriverConnect を呼び出しているアプリケーション名 (オプション)。
WSID	ワークステーション ID。通常はアプリケーションが存在するコンピュータのネットワーク名 (オプション)。
DATABASE	SQL Server データベース名 (オプション)。
LANGUAGE	SQL Server が使用するその国の言語 (オプション)。
SQLDriverConnect は、ダイアログ ボックスが表示されている場合は、そのダイアログ ボックスのキーワード値を使用します。ダイアログ ボックスでキーワード値が設定されていない場合は、SQLDriverConnect は接続文字列の値を使用します。接続文字列に値が設定されていない場合は、ODBC.INI の値を使用します。

引数 fDriverCompletion が SQL_DRIVER_NOPROMPT または SQL_DRIVER_COMPLETE_REQUIRED の場合は、言語またはデータベースは接続文字列から取得します。言語またはデータベースが無効の場合は、SQLDriverConnect は SQL_ERROR を返します。

引数 fDriverCompletion が SQL_DRIVER_NOPROMPT または SQL_DRIVER_COMPLETE_REQUIRED の場合は、言語またはデータベースは ODBC データ ソース定義から取得します。言語またはデータベースが無効の場合は、指定されたユーザー ID のデフォルト言語またはデフォルト データベースを使用し、SQL_SUCCESS_WITH_INFO を返します。

引数 fDriverCompletion が SQL_DRIVER_COMPLETE または SQL_DRIVER_PROMPT で、言語またはデータベースが無効の場合は、SQLDriverConnect はダイアログ ボックスを再度表示します。

例

たとえば、サーバー "HRSERVER" 上のデータ ソース名 "Human Resources" に、ログイン ID "Smith" およびパスワード "Sesame" を使用して接続するには、以下の接続文字列を使用します。

DSN=Human Resources;UID=Smith;PWD=Sesame

同じサーバー上の "Payroll" データベースを指定するには、以下の接続文字列を使用します。

DSN=Human Resources;UID=Smith;PWD=Sesame;DATABASE=Payroll

SQL Server ドライバ (ドライバ名 {SQL Server}) と、DSN を使用しないで直接サーバー名を指定する場合は、以下の接続文字列を使用します。

DRIVER={SQL Server};SERVER=hrserver;UID=Smith;PWD=Sesame;
    DATABASE=Payroll


SQLColAttributes、SQLDescribeCol、および SQLNumResultCols

SQL Server は、結果セット内にデータを返す前に、結果セットに関する情報を返します。SQL Server ドライバがアプリケーションにこの情報を返すために、SQLColAttributes、SQLDescribeCol、および SQLNumResultCols 関数を使用します。

SQL Server 6.x に接続している場合は、SQL Server ドライバは SET FMTONLY ステートメントを使用して、結果セットに関する適切な情報を取得します。

SQL Server 4.2x に接続している場合は、SELECT ステートメントを準備した後、そのステートメントを実行する前に、これらの関数を呼び出すと、SQL Server ドライバは WHERE 1=2 句を指定して SELECT ステートメントを実行します。これにより、SQL Server は行を 1 行も含まない、結果セットに関する情報だけを含む結果セットを作成します。

注意  SQL Server 4.2x に接続している場合に、プロシージャが準備され、実行される前に SQLColAttributes、SQLDescribeCol、および SQLNumResultCols を呼び出しても、プロシージャが作成する結果セットに関する情報は返しません。SELECT ステートメントがバッチ ステートメントの最初のステートメントで、ステートメント間にセミコロンを指定しない SQL Server 本来の文法を使用している場合は、関数の結果は予測できません。また、SELECT という単語をバッファ内の最初のトークンにする必要があることにも注意してください。準備されたステートメントの単語 SELECT の前にほかの単語がある場合は、SELECT ステートメントに WHERE 1=2 は追加されず、結果セットに関する情報も返されません。

SQL Server 6.5 では、ODBC SQL Server ドライバは SQLColAttributes で、以下に示すドライバ固有の列属性をサポートします。

fDescType パラメータ	pfDesc values
SQL_CA_SS_COLUMN_SSTYPE	SQLTEXT SQLVARBINARY SQLINTN SQLVARCHAR SQLBINARY SQLIMAGE SQLCHAR SQLINT1 SQLBIT SQLINT2 SQLINT4 SQLMONEY SQLDATETIME SQLFLT8 SQLFLTN SQLMONEYN SQLDATETIMN SQLFLT4 SQLMONEY4 SQLDATETIM4 SQLDECIMAL SQLDECIMALN SQLNUMERIC SQLNUMERICN (dbcoltype または dbalttype と同様)
SQL_CA_SS_COLUMN_UTYPE	SQLudtTEXT SQLudtVARBINARY  SQLudtINTN SQLudtVARCHAR SQLudtBINARY SQLudtIMAGE  SQLudtCHAR SQLudtINT1 SQLudtBIT SQLudtINT2 SQLudtINT4 SQLudtMONEY  SQLudtDATETIME SQLudtFLT8 SQLudtFLTN SQLudtMONEYN SQLudtDATETIMN SQLudtSYSNAME SQLudtTIMESTAMP  SQLudtFLT4 SQLudtMONEY4 SQLudtDATETIM4 SQLudtDECML SQLudtDECMLN SQLudtNUM SQLudtNUMN (dbcolutype または dbaltutype と同様)
SQL_CA_SS_NUM_ORDERS	SQL ステートメントの ORDER BY 句内の列数。 (dbnumorders と同様)
SQL_CA_SS_COLUMN_ORDER	SQL ステートメントの ORDER BY 句内で指定される列の SELECT リスト列 ID。 (dbordercol と同様)
SQL_CA_SS_COLUMN_VARYLEN	列のデータが可変長の場合は TRUE、それ以外は FALSE。 (dbvarylen と同様)
SQL_CA_SS_NUM_COMPUTES	現在の結果セット内の COMPUTE 句の数。 (dbnumcompute と同様)
SQL_CA_SS_COMPUTE_ID	COMPUTE 行の COMPUTE ID。 (dbnextrow COMPUTE ID が返す値とと同様)
SQL_CA_SS_COMPUTE_BYLIST	COMPUTE 行の BY リスト。 (dbbylist と同様)
SQL_CA_SS_COLUMN_ID	COMPUTE 列の SELECT リスト列 ID。 (dbaltcolid と同様)
SQL_CA_SS_COLUMN_OP	SQLAOPCNT SQLAOPSUM SQLAOPAVG SQLAOPMIN SQLAOPMAX SQLAOPANY SQLAOPNOOP (dbaltop と同様)


SQLConfigDataSource

SQLConfigDataSource 関数を使用して、データ ソースを動的に追加、変更、または削除します。以下の表のキーワードを使用します。この関数の必須のキーワードは SERVER だけです。ほかのキーワードはオプションです。

キーワード	説明
ADDRESS	ドライバがデータを取得する SQL Server データベース管理システムのネットワーク アドレス。
DATABASE	SQL Server データベース名。
DESCRIPTION	データ ソース内のデータの説明。
LANGUAGE	SQL Server が使用するその国の言語。
NETWORK	SQL Server および SQL Server ドライバが常駐するプラットホームに接続するネットワーク ライブラリ。
OEMTOANSI	SQL Server クライアント マシンと SQL Server が同じ ANSI 以外の文字セットを使用している場合に、OEM 文字セットから ANSI 文字セットへの変換を有効にします。YES は変換を有効にし、NO は無効にします。有効な値はこの 2 つだけです。デフォルト値は、SQL クライアント設定ユーティリティを使用して設定します。
SERVER	データ ソースが存在するコンピュータのネットワーク名。
TRANSLATIONDLL	アプリケーションとデータ ソース間で受け渡されるデータを変換する DLL 名。
TRANSLATIONNAME	アプリケーションとデータ ソース間で受け渡されるデータを変換するトランスレータ名。
TRANSLATIONOPTION	アプリケーションとデータ ソース間で受け渡されるデータの変換を有効にします。
USEPROCFORPREPARE	SQLPrepare 用のストアド プロシージャの生成を無効にします。NO は生成を無効にし、YES は有効にします。有効な値はこの 2 だけです。デフォルト値は YES です。このデフォルト値は [セットアップ] ダイアログ ボックスで設定します。
SQLConfigDataSource 文字列内のキーワードの組み合わせは、null 文字 (\0) で区切ります。さらに、文字列自身も null 文字 (\0) で終わります。以下に例を示します。

DSN=Human Resources\0SERVER=hrserver\0ADDRESS=hrnetaddr\0
NETWORK=DBMSSOCN\0DATABASE=payroll\0\0


SQLPrepare

SQL Server は、ODBC の Prepare/Execute モデルを直接サポートしません。

ストアド プロシージャはステートメントを複数回実行する効率のよい方法なので、まずステートメントから一時的なストアド プロシージャを作成します。プロシージャには #odbc#useridentifier という名前が付けられます。user は最大 6 バイトのユーザー名、identifier は最大 8 桁のステートメントを識別する数値です。ステートメントを準備するときに、すべてのパラメータが設定される場合は、準備の時点でプロシージャが作成されます。ステートメントを準備するときに、一部のパラメータが設定されない場合、またはプロシージャ作成後にパラメータの一部が再設定された場合は、実行時にプロシージャが作成されます。この結果、SQLExecute は SQLPrepare が返すすべてのエラーを返すことができます。

CREATE PROCEDURE がエラーを返した場合は、SQLPrepare はステートメントの種類によって異なりますが、SET NOEXEC オプションまたは SET PARSEONLY オプションを有効にして、SQL Server に対してそのステートメントを実行します。SQL Server はステートメントの構文を調べ、エラーを返します。

権限の不足など、何らかの理由でユーザーがストアド プロシージャを作成できない場合は、SQL Server ドライバはストアド プロシージャを使用しない代わりに、SQLExecute が呼び出されるたびに SQL ステートメントを実行します。

SQLPrepare 用のストアド プロシージャの作成を無効にできます。無効にされた場合は、ステートメントを保存し、実行時に再実行します。ストアド プロシージャの作成は、以下のいずれかの方法で無効にします。

●	[ODBC SQL Server セットアップ] ダイアログ ボックスで、[用意したステートメントのストアド プロシージャを作成] チェック ボックスをオフにします。

●	SQLSetConnectOption 関数の SQL_USE_PROCEDURE_FOR_PREPARE オプションを SQL_UP_OFF に設定します。

ストアド プロシージャの作成を無効にし、実行時までステートメントを保存し実行する場合は、すべての構文エラー チェックも実行時まで延期します。

SET NOCOUNT ON が実行された場合は、ストアド プロシージャに埋め込まれた複数のステートメントが複数の結果セットを作成する場合でも、複数の結果セットは作成しません。ストアド プロシージャ内部の SQL ステートメントが作成した行カウントは、ドライバが無視します。


SQLParamOptions

SQLParamOptions 関数を使用して、アプリケーションは SQLBindParameter が割り当てたパラメータに対して、複数の値の配列を指定できます。crow に 2 以上の値を指定して SQLParamOptions を呼び出すと、ドライバは複数の SQL ステートメントを実行する SQL ステートメント バッチまたはストアド プロシージャ バッチを作成します。

SQLParamOptions は、通常 DML と共に使用します。DDL ステートメントと共に SQLParamOptions を使用した場合は、そのステートメントを crow 回順番に実行したのと同じ結果になります。パラメータ マーカーを含まないステートメントでも、そのステートメントが crow 回実行されます。

ストアド プロシージャ バッチは、SQLPrepare/SQLExecute で使用されます。さらに、実行時データ パラメータを使用しない標準的なプロシージャ起動でも使用されます。ストアド プロシージャ出力パラメータが返されます。

言語イベントとも呼ばれる SQL バッチは、SQL コマンドで使用されます。さらに、実行時データ パラメータを使用しない標準的なプロシージャ起動でも使用されます。ストアド プロシージャ出力パラメータは返されません。SELECT ステートメントを使用している場合は、複数の結果セットが返され、アプリケーションは SQLMoreResults を使用して、複数の結果セットを処理する必要があります。SQLParamData、SQLExecDirect、または SQLExecute が正常終了した後、pirow に返される値の初期値は 1 です。その後結果セットを処理するたびに SQLMoreResults がこの値を増加します。

SQLRowCount は、SQL バッチ内または SELECT ステートメントを含まないストアド プロシージャ バッチ内のすべてのステートメントで影響を受けた総行数を返します。1 つ以上の SELECT ステートメントが含まれている場合、SQLRowCount が返す値は未定です。また、元の SQL バッチに複数のステートメントが含まれている場合は、pirow に返される値は正しくない可能性があります。

バッチ処理中に、SQL Server がエラーを返す場合があります。SQL Server が現在のコマンドのみをキャンセルし、バッチの残りを処理する場合もあります。このようなエラーが発生した場合、1 つ以上の実行が失敗し、SQLExecDirect、SQLExecute、または SQLParamData は SQL_ERROR を返します。すべてのパラメータ行は処理されるので、pirow に返される値は crow に設定されます。SQLError は発生したエラーを返しますが、どのパラメータ行がエラーの原因になったかを調べる方法はありません。すべてのパラメータ行が処理されるので、再度バインドし、実行を継続する必要はありません。

エラーの発生により、SQL Server がバッチ全体をキャンセルする場合もあります。このようなエラーが発生した場合、pirow に返される値は影響を受けたパラメータ行の行数です。この場合は、残りのパラメータ行を処理するために、再度バインドし、実行を継続する必要があります。

1 つのパラメータに対してデータの切り詰めが発生すると、残りのパラメータに対して処理が続行されます。この場合警告メッセージと共に SQL_SUCCESS_WITH_INFO が返されます。ただし、1 つのパラメータに対して、変換エラーなどのエラーがクライアント上で発生した場合は、バッチ全体の実行が停止され、どの行に対しても実行が行われません。

SQLParamData が SQL_NEED_DATA を返す場合、pirow の値は "実行時データ" パラメータが処理されたときに更新されます。さらに最後の SQLParamData が実行中に発生したエラーに基づき pirow の値を更新します。そのため、実行中にある行でエラーが発生すると、実行完了後の pirow よりも、"実行時データ" パラメータ処理中の pirow の方が大きくなる可能性もあります。

SQL Server 4.2x に接続しているときは、SQLParamOptions には以下の制限があります。

●	SQL Server 4.2x では、1 つの言語イベントに対して約 128,000 バイトに制限されます。SQLParamOptions を使用してこの制限を超えた場合は、ドライバは SQL Server エラー メッセージを返します。

●	SQL Server 4.2x は、ストアド プロシージャ バッチをサポートしません。そのため、すべてのストアド プロシージャ出力パラメータは返されません。

注意  pirow に NULL 以外の値を渡すと、SQLParamOptions が crow に 1 を渡して処理を "終了" させようとした場合でも、ドライバはそのメモリ アドレスに現在の行番号を格納し続けます。そのため、pirow に渡したアドレスを、アプリケーションが無効なアドレスにした場合 (例、ローカル変数をスコープ外にした場合)、ドライバが異常終了する可能性があります。


SQLDescribeParam

SQLDescribeParam 関数は、準備された SQL ステートメントに関連付けられたパラメータ マーカーの説明を返します。

パラメータ マーカーは、『ODBC 2.0 プログラマーズ リファレンス &  SDK ガイド』で指定された正しい ODBC 位置に指定する必要があります。また、ドライバは以下の項目をサポートしません。

●	実行後の SQLDescribeParam の呼び出し。

●	UPDATE ステートメントおよび DELETE ステートメントに対する Transact-SQL FROM 句拡張。

●	サブクエリー内のパラメータ マーカー。

●	比較の両側の式でのパラメータ マーカー、LIKE 記述子内のパラメータ マーカー、または量を指定する記述子でのパラメータ マーカー。


SQLSetStmtOption

SQLSetStmtOption 関数を使用して、呼び出し側でステートメント レベルでさまざまなオプションを設定できます。以下のカーソル関連のオプションがサポートされています。

オプション	値
SQL_CONCURRENCY	SQL_CONCUR_READ_ONLY SQL_CONCUR_LOCKING SQL_CONCUR_ROWVER SQL_CONCUR_VALUES
SQL_CURSOR_TYPE	SQL_CURSOR_FORWARD_ONLY SQL_CURSOR_STATIC SQL_CURSOR_KEYSET_DRIVEN SQL_CURSOR_DYNAMIC
SQL_ROWSET_SIZE	行セット内の行数を示す整数値。つまり、各 SQLExtendedFetch の呼び出しで返される行数です。デフォルト値は 1 です。
SQL_BIND_TYPE	関連付けられた hstmt で SQLExtendedFetch が呼び出されるときに、使用するバインド方向を設定する整数値。行方向と列方向のバインドの両方がサポートされています。
SQL Server は、読み取り専用の静的カーソルをサポートします。静的カーソルは SQL Server ドライバにより使用できるようになります。更新可能な静的カーソルを必要とするアプリケーションは、SQL_ODBC_CURSORS を SQL_CUR_USE_ODBC に設定して、カーソル ライブラリのインプリメントを選択する必要があります。カーソル ライブラリが提供するカーソルはクライアントにインプリメントされます。すべてのデータはキャッシュされます。キャッシュされた値を使用する WHERE 句を構築することにより、更新および削除が実行されます。

サーバーにインプリメントされるカーソル (前方のみ、キーセット、動的、読み取り専用、および静的) には、同時実行オプションとして読み取り専用、ロック、行バージョンの比較、または行データ値の比較を指定できます。カーソル ライブラリがインプリメントするカーソルは、読み取り専用または行データ値の比較を指定できます。

複合カーソルはサポートされません。SQL_KEYSET_SIZE 値に 0 以外の値が指定されると自動的に 0 に変換されます。

SQL Server 6.5 では、ODBC SQL Server ドライバは SQLSetStmtOption および SQLGetStmtOption で以下のドライバ固有のステートメント オプションをサポートします。

fOption オプション	vParam の説明
SQL_SOPT_SS_CURRENT_COMMAND (SQLGetStmtOption only)	バッチ内の現在の SQL コマンド番号。 (dbcurcmd と同様)
SQL_SOPT_SS_TEXTPTR_LOGGING	SQL_TL_OFF。text および image 操作はログに記録されません。 SQL_TL_ON。text および image 操作がログに記録されます (デフォルト)。


SQLSetScrollOptions

SQLSetScrollOptions 関数を使用して、呼び出し側でカーソルの動作を制御するオプションを設定できます。ODBC 2.0 では、これらのオプションは SQLSetStmtOption 関数の対応するオプションに置き換えられました。これらのオプションは、下位互換性のためだけにサポートされています。オプションは以下の 3 種類に分類されます。

オプション	値
同時実行制御	SQL_CONCUR_READ_ONLY  SQL_CONCUR_LOCK  SQL_CONCUR_ROWVER  SQL_CONCUR_VALUES
カーソルの感度	SQL_CURSOR_FORWARD_ONLY  SQL_CURSOR_STATIC  SQL_CURSOR_KEYSET_DRIVEN  SQL_CURSOR_DYNAMIC
行セット サイズ	整数値


SQLSetConnectOption

SQLSetConnectOption 関数を使用して、呼び出し側で接続の形態を指定するオプションを設定できます。

以下のカーソル関連のオプションがサポートされます。

オプション	値
SQL_ODBC_CURSORS	SQL_CUR_USE_IF_NEEDED  SQL_CUR_USE_ODBC  SQL_CUR_USE_DRIVER
SQL_TXN_ISOLATION	SQL_TXN_READ_UNCOMMITTED SQL_TXN_READ_COMMITTED SQL_TXN_REPEATABLE_READ SQL_TXN_SERIALIZABLE SQL_TXN_VERSIONING オプションはサポートされていません。SQL Server では、繰り返し読み取りは、直列化として扱われます。
ドライバ固有のオプション	SQL_PRESERVE_CURSORS を使用して、トランザクションをコミットまたはロールバック後に、カーソルをクローズするか、カーソル状態を保持するかを選択できます。デフォルトでは、トランザクションのコミットまたはロールバック時にカーソルがクローズされます。


SQLSetCursorName

SQLSetCursorName 関数は、カーソル名をアクティブな hstmt に関連付けます。カーソル名を指定しないと、自動的に作成されます。


SQLGetCursorName

SQLGetCursorName 関数は、指定した hstmt に関連付けられているカーソル名を返します。カーソル名はユーザーが指定することも、システムで生成することもできます。この関数を呼び出せるのは、それ以前に SQLSetCursorName が呼び出されたか、ExecuteDirect、Execute、または Catalog 操作を実行してカーソルをオープンした後だけです。カーソル名は hstmt が存在している間は有効です。カーソルがクローズされ、別のカーソルがオープンされた場合は、ドライバは以前の名前を再使用します。カーソル名は、位置指定更新および位置指定削除を実行するために必要です。


SQLGetStmtOption

SQLGetStmtOption 関数は、SQLSetStmtOption で指定した現在のオプション設定に 1 組のフラグを追加して返します。SQL_ROW_NUMBER は、結果セット全体の中での現在の行番号を示します。このオプションは、キーセット カーソルおよび静的カーソルだけでサポートされます。それ以外は 0 を返します。


SQLGetInfo

SQLGetInfo 関数は、特定のドライバおよびデータ ソースに関する情報を返します。SQL Server ドライバが提供する値については、ドライバ属性を参照してください。


SQLFetch

SQLFetch 関数は、結果セットからデータを 1 行フェッチします。同一のカーソルで SQLExtendedFetch と混在して使用することはできません。SQLFetch は前方のみを参照します。


SQLExtendedFetch

SQLExtendedFetch 関数は、SQLSetStmtOption で設定した 1 つの行セットをアプリケーションに返します。この関数は入力として、ステートメント ハンドル、フェッチ型、およびフェッチする行番号を受け取ります。この関数は、実際にフェッチした行数を返します。オプションで、行ごとのステータス値を保持する配列を返します。

以下のフェッチ型をサポートします。

SQL_FETCH_ABSOLUTE
SQL_FETCH_FIRST
SQL_FETCH_LAST
SQL_FETCH_NEXT
SQL_FETCH_PRIOR
SQL_FETCH_RELATIVE
SQL_FETCH_BOOKMARK

カーソルの種類が SQL_CURSOR_FORWARD_ONLY のときは、SQL_FETCH_NEXT を指定する必要があります。動的カーソルでは、SQL_FETCH_ABSOLUTE はサポートされません。静的カーソルおよびキーセット カーソルだけで、SQL_FETCH_BOOKMARK がサポートされます。


SQLRowCount

SQLRowCount がカーソルがオープンされた後呼び出され、カーソルの種類がキーセットまたは静的の場合、結果セット内の行数を返します。動的カーソルでは常に  - 1 を返します。キーセットが非同期で作成されている場合 (SQL Server のマニュアルの sp_configure を参照)、キーセット全体が作成されるまで  - 1 を返します。

SQLRowCount 関数は、UPDATE、INSERT、または DELETE ステートメントで影響を受けた行数、あるいは SQLSetPos の SQL_UPDATE、SQL_ADD、または SQL_DELETE 操作で影響を受けた行数を返します。データベース更新が実行された後に、SQLRowCount を呼び出すことができます。


SQLSetPos

SQLSetPos 関数を使用して、アプリケーションは行セット内のカーソル位置を設定でき、そのカーソル位置を基準にして操作を実行できます。この関数は入力として、ステートメント ハンドル、操作を実行する行セット内の行位置、操作の種類、および操作実行後のロックの方法を説明する付加パラメータを受け取ります。

irow 引数は、操作を実行する行セット内の行番号を指定します。irow が 0 の場合は、操作が行セット全体に適用されます。

以下の操作がサポートされます。

SQL_ADD
SQL_DELETE
SQL_POSITION
SQL_REFRESH
SQL_UPDATE

以下のロックの種類がサポートされます。

SQL_LOCK_NO_CHANGE

行が削除された (SQL_ROW_DELETED) としてマークが付けられた後、削除された行と同じキー値で行が挿入された場合、SQL_REFRESH 操作を行うと、削除された行位置に新しく挿入された行 (SQL_ROW_SUCCESS) が表示されます。


SQLFreeStmt

SQLFreeStmt 関数は、特定のステートメントに関連付けられた処理を停止し、オープンされたカーソルをクローズし、保留されている結果を破棄します。さらにオプションで、そのステートメント ハンドルに関連付けられたすべてのリソースを開放します。

以下のカーソル関連の操作がサポートされます。

SQL_CLOSE
SQL_DROP


SQLTransact

SQLTransact 関数は、接続に関連付けられたすべてのステートメントでアクティブなすべての操作に対して、コミットまたはロールバック操作を要求します。SQL_PRESERVE_CURSORS が SQL_PC_ON に設定されている場合は、この操作後オープンされているすべてのカーソルは、オープンされたままになります。デフォルトでは、カーソルはコミットまたはロールバックでクローズされます。


付録 A   ドライバ属性
 ドライバ属性

以下の表は、fInfoType 引数の C 言語での #define と、Microsoft(R) SQL Server(TM) Version 6.x (以下 SQL Server 6.x または SQL Server) に接続しているときに、SQLGetInfo が返す対応する値を一覧しています。アプリケーションは、SQLGetInfo の fInfoType 引数に一覧されている C 言語の #define 値を渡すことにより、この情報を取得できます。

fInfoType 引数 (#define)	SQLGetInfo が返す値
SQL_ACCESSIBLE_PROCEDURES	Y
SQL_ACCESSIBLE_TABLES	Y
SQL_ACTIVE_CONNECTIONS	0。アクティブな接続数は、クライアント コンピュータで使用できるネットワーク接続数と、サーバー DBMS が許可している接続数によって決まります。
SQL_ACTIVE_STATEMENTS	1。この値が 1 であっても、サーバー カーソルを使用している場合は、1 つの接続で複数のアクティブなステートメントをサポートします。詳細については、ODBC カーソルの使い方を参照してください。
SQL_ALTER_TABLE	SQL_AT_ADD_COLUMN
SQL_BOOKMARK_PERSISTENCE	0
SQL_COLUMN_ALIAS	Y
SQL_CONCAT_NULL_BEHAVIOR	SQL_CB_NON_NULL
SQL_CONVERT_FUNCTIONS	SQL_FN_CVT_CONVERT
SQL_CONVERT_type 。type はCHAR などの SQL データ型です。	詳細については、データ型のマッピングを参照してください。
SQL_CORRELATION_NAME	SQL_CN_ANY
SQL_CURSOR_COMMIT_BEHAVIOR	SQL_CB_CLOSE。これは ANSI 指定の動作です。多くのアプリケーションは、コミットまたはロールバック後もサーバー カーソルの状態を保存する必要があるので、ドライバはこの ANSI デフォルトをオーバーライドするドライバ固有のオプションを提供します。
SQL_CURSOR_ROLLBACK    _BEHAVIOR	SQL_CB_CLOSE。多くのアプリケーションは、コミットまたはロールバック後もサーバー カーソルの状態を保存する必要があるので、ドライバはこの ANSI デフォルトをオーバーライドするドライバ固有のオプションを提供します。
SQL_DBMS_NAME	Microsoft SQL Server
SQL_DEFAULT_TXN_ISOLATION	SQL_TXN_READ_COMMITTED
SQL_DRIVER_NAME	SQLSRVR.DLL (16 ビット) SQLSRV32.DLL (32 ビット)
SQL_DRIVER_ODBC_VER	02.50
SQL_DRIVER_VER	02.50.nnnn (nnnn はビルド番号を示します)
SQL_EXPRESSIONS_IN_ORDERBY	Y
SQL_FETCH_DIRECTION	SQL_FD_FETCH_NEXT  SQL_FD_FETCH_FIRST  SQL_FD_FETCH_LAST  SQL_FD_FETCH_PRIOR  SQL_FD_FETCH_ABSOLUTE  SQL_FD_FETCH_RELATIVE
SQL_FILE_USAGE	SQL_FILE_NOT_SUPPORTED
SQL_GETDATA_EXTENSIONS	SQL_GD_BLOCK
SQL_GROUP_BY	SQL_GB_GROUP_BY_CONTAINS    _SELECT
SQL_IDENTIFIER_CASE	SQL Server が大文字小文字を区別するようにインストールされているか、区別しないようにインストールされているかにより異なります。
SQL_IDENTIFIER_QUOTE_CHAR	" (ダブル クォーテーション)
SQL_KEYWORDS	BREAK BROWSE BULK CHECKPOINT CLUSTERED COMMITTED COMPUTE CONFIRM CONTROLROW DATABASE DBCC DISK DUMMY DUMP ERRLVL ERROREXIT EXIT EXPIREDATE FILE FILLFACTOR FLOPPY GETDEFAULT HOLDLOCK IDENTITY_INSERT IDENTITYCOL IF KILL LINENO LOAD MIRROREXIT NONCLUSTERED OFF OFFSETS ONCE OVER PERM PERMANENT PLAN PRINT PROC PROCESSEXIT PUBLIC RAISERROR READ READTEXT RECONFIGURE REPEATABLE RETAINDATE RETURN ROWCOUNT RULE SAVE SERIALIZABLE SETUSER SHUTDOWN STATISTICS TAPE TEMP TEXTSIZE TRAN TRIGGER TRUNCATE TSEQUEL UNCOMMITTED UPDATETEXT USE VOLUME WAITFOR WHILE WRITETEXT
SQL_LIKE_ESCAPE_CLAUSE	Y
SQL_LOCK_TYPES	SQL_LCK_NO_CHANGE
SQL_MAX_BINARY_LITERAL_LEN	131072
SQL_MAX_CHAR_LITERAL_LEN	131072
SQL_MAX_COLUMN_NAME_LEN	30
SQL_MAX_COLUMNS_IN_GROUP    _BY	16
SQL_MAX_COLUMNS_IN_INDEX	16
SQL_MAX_COLUMNS_IN_ORDER    _BY	16
SQL_MAX_COLUMNS_IN_SELECT	4000
SQL_MAX_COLUMNS_IN_TABLE	250
SQL_MAX_CURSOR_NAME_LEN	30
SQL_MAX_INDEX_SIZE	900
SQL_MAX_OWNER_NAME_LEN	30
SQL_MAX_PROCEDURE_NAME    _LEN	36 (1 バイトから 30 バイトまでの文字のあとにセミコロン [;] を付け、その後 1 桁から 5 桁の数値を指定します)
SQL_MAX_QUALIFIER_NAME_LEN	30
SQL_MAX_ROW_SIZE	1962
SQL_MAX_ROW_SIZE_INCLUDES    _LONG	N
SQL_MAX_STATEMENT_LEN	131072
SQL_MAX_TABLE_NAME_LEN	30
SQL_MAX_TABLES_IN_SELECT	16
SQL_MAX_USER_NAME_LEN	30
SQL_MULT_RESULT_SETS	Y
SQL_MULTIPLE_ACTIVE_TXN	Y
SQL_NEED_LONG_DATA_LEN	Y
SQL_NON_NULLABLE_COLUMNS	SQL_NNC_NON_NULL
SQL_NULL_COLLATION	SQL_NC_LOW
SQL_NUMERIC_FUNCTIONS	SQL_FN_NUM_ABS SQL_FN_NUM_ACOS SQL_FN_NUM_ASIN SQL_FN_NUM_ATAN SQL_FN_NUM_ATAN2 SQL_FN_NUM_CEILING SQL_FN_NUM_COS SQL_FN_NUM_COT SQL_FN_NUM_DEGREES SQL_FN_NUM_EXP SQL_FN_NUM_FLOOR SQL_FN_NUM_LOG SQL_FN_NUM_LOG10 SQL_FN_NUM_MOD SQL_FN_NUM_PI SQL_FN_NUM_POWER SQL_FN_NUM_RADIANS SQL_FN_NUM_RAND SQL_FN_NUM_ROUND SQL_FN_NUM_SIGN SQL_FN_NUM_SIN SQL_FN_NUM_SQRT SQL_FN_NUM_TAN
SQL_ODBC_API_CONFORMANCE	SQL_OAC_LEVEL2
SQL_ODBC_SAG_CLI    _CONFORMANCE	SQL_OSCC_NOT_COMPLIANT
SQL_ODBC_SQL_CONFORMANCE	SQL_OSC_CORE
SQL_ODBC_SQL_OPT_IEF	Y
SQL_ORDER_BY_COLUMNS_IN    _SELECT	N
SQL_OJ_CAPABILITIES	SQL_OJ_LEFT SQL_OJ_RIGHT SQL_OJ_FULL SQL_OJ_NESTED SQL_OJ_NOT_ORDERED SQL_OJ_INNER SQL_OJ_ALL_COMPARISON_OPS
SQL_OUTER_JOINS	Y
SQL_OWNER_TERM	所有者
SQL_OWNER_USAGE	SQL_OU_DML_STATEMENTS SQL_OU_PROCEDURE_INVOCATION  SQL_OU_TABLE_DEFINITION  SQL_OU_INDEX_DEFINITION  SQL_OU_PRIVILEGE_DEFINITION
SQL_POS_OPERATIONS	SQL_POS_ADD  SQL_POS_DELETE  SQL_POS_POSITION  SQL_POS_REFRESH  SQL_POS_UPDATE
SQL_POSITIONED_STATEMENTS	SQL_PS_POSITIONED_DELETE  SQL_PS_POSITIONED_UPDATE  SQL_PS_SELECT_FOR_UPDATE
SQL_PROCEDURE_TERM	ストアド プロシージャ
SQL_PROCEDURES	Y
SQL_QUALIFIER_LOCATION	SQL_QL_START
SQL_QUALIFIER_NAME    _SEPARATOR	. (ピリオド)
SQL_QUALIFIER_TERM	データベース
SQL_QUALIFIER_USAGE	SQL_QU_DML_STATEMENTS SQL_QU_PROCEDURE_INVOCATION SQL_QU_TABLE_DEFINITION
SQL_QUOTED_IDENTIFIER_CASE	SQL Server が大文字小文字を区別するようにインストールされているか、区別しないようにインストールされているかにより異なります。
SQL_ROW_UPDATES	N
SQL_SCROLL_CONCURRENCY	SQL_SCCO_LOCK  SQL_SCCO_OPT_ROWVER  SQL_SCCO_OPT_VALUES  SQL_SCCO_READ_ONLY
SQL_SCROLL_OPTIONS	SQL_SO_DYNAMIC  SQL_SO_FORWARD_ONLY  SQL_SO_KEYSET_DRIVEN  SQL_SO_STATIC
SQL_SEARCH_PATTERN_ESCAPE	\ (円記号)
SQL_SPECIAL_CHARACTERS	#$などのようなデータソースでオブジェクト名として使用できるすべての特殊文字（a ～ z、A ～ Z、0 ～ 9、およびアンダースコア以外のすべての文字）
SQL_STATIC_SENSITIVITY	SQL_SS_ADDITIONS  SQL_SS_UPDATES
SQL_STRING_FUNCTIONS	SQL_FN_STR_ASCII SQL_FN_STR_CHAR SQL_FN_STR_CONCAT SQL_FN_STR_DIFFERENCE SQL_FN_STR_INSERT SQL_FN_STR_LCASE SQL_FN_STR_LEFT SQL_FN_STR_LENGTH SQL_FN_STR_LOCATE_2 SQL_FN_STR_LTRIM SQL_FN_STR_REPEAT SQL_FN_STR_RIGHT SQL_FN_STR_RTRIM SQL_FN_STR_SOUNDEX SQL_FN_STR_SPACE SQL_FN_STR_SUBSTRING SQL_FN_STR_UCASE
SQL_SUBQUERIES	SQL_SQ_COMPARISON SQL_SQ_EXISTS SQL_SQ_IN SQL_SQ_QUANTIFIED  SQL_SQ_CORRELATED    _SUBQUERIES
SQL_SYSTEM_FUNCTIONS	SQL_FN_SYS_DBNAME SQL_FN_SYS_IFNULL SQL_FN_SYS_USERNAME
SQL_TABLE_TERM	テーブル
SQL_TIMEDATE_ADD_INTERVALS	SQL_FN_TSI_FRAC_SECOND SQL_FN_TSI_SECOND SQL_FN_TSI_MINUTE SQL_FN_TSI_HOUR SQL_FN_TSI_DAY SQL_FN_TSI_WEEK SQL_FN_TSI_MONTH SQL_FN_TSI_QUARTER SQL_FN_TSI_YEAR
SQL_TIMEDATE_DIFF_INTERVALS	SQL_FN_TSI_FRAC_SECOND SQL_FN_TSI_SECOND SQL_FN_TSI_MINUTE SQL_FN_TSI_HOUR SQL_FN_TSI_DAY SQL_FN_TSI_WEEK SQL_FN_TSI_MONTH SQL_FN_TSI_QUARTER SQL_FN_TSI_YEAR
SQL_TIMEDATE_FUNCTIONS	SQL_FN_TD_NOW SQL_FN_TD_CURDATE SQL_FN_TD_DAYOFMONTH SQL_FN_TD_DAYOFWEEK SQL_FN_TD_DAYOFYEAR SQL_FN_TD_DAYNAME SQL_FN_TD_MONTH SQL_FN_TD_MONTHNAME SQL_FN_TD_QUARTER SQL_FN_TD_WEEK SQL_FN_TD_YEAR SQL_FN_TD_CURTIME SQL_FN_TD_HOUR SQL_FN_TD_MINUTE SQL_FN_TD_SECOND SQL_FN_TD_TIMESTAMPADD SQL_FN_TD_TIMESTAMPDIFF
SQL_TXN_CAPABLE	SQL_TC_ALL
SQL_TXN_ISOLATION_OPTION	SQL_TXN_READ_COMMITTED SQL_TXN_READ_UNCOMMITTED SQL_TXN_REPEATABLE_READ SQL_TXN_SERIALIZABLE
SQL_UNION	SQL_U_UNION SQL_U_UNION_ALL
ODBC SQL Server ドライバは、以下の新しいドライバ固有の SQLGetInfo 値をサポートします。

fInfoType パラメータ	rgbInfoValue に返される値
SQL_INFO_SS_NETLIB_NAME	SQL Server への接続に使用している Net-Library DLL の名前。 (dbprocinfo と同様)


付録 B   データ型のマッピングと使い方
データ型のマッピングと使い方

この付録では、Microsoft(R) SQL Server(TM) Version 6.5 (以下 SQL Server 6.5 または SQL Server) の SQL データ型を ODBC SQL データ型にマップする方法を説明し、特定のデータ型の使用条件を説明します。

データ型のマッピング

データ型の使い方


データ型のマッピング

SQL Server ドライバは、SQL Server SQL データ型を ODBC SQL データ型にマップします。以下の表は SQL Server SQL データ型を一覧し、マップされる ODBC SQL データ型を示しています。

SQL Server SQL データ型	ODBC SQL データ型
binary	SQL_BINARY
bit	SQL_BIT
char character	SQL_CHAR
datetime	SQL_TIMESTAMP
decimal dec (SQL Server 6.x)	SQL_DECIMAL
float double precision, float(n)  n = 24 ～ 53	SQL_FLOAT
image	SQL_LONGVARBINARY
int integer	SQL_INTEGER
money	SQL_DECIMAL
numeric (SQL Server 6.x)	SQL_NUMERIC
real float(n) 、n = 1 ～ 23	SQL_REAL
smalldatetime	SQL_TIMESTAMP
smallint	SQL_SMALLINT
smallmoney	SQL_DECIMAL
sysname	SQL_VARCHAR
text	SQL_LONGVARCHAR
timestamp*	SQL_BINARY (SQL Server 6.x) SQL_VARBINARY (SQL Server 4.2x)
tinyint	SQL_TINYINT
varbinary binary varying	SQL_VARBINARY
varchar character varying char varying	SQL_VARCHAR
* timestamp 列の値は、datetime データ型ではなく、その行での SQL Server の利用順序を示す varbinary(8) または binary(8) データなので、timestamp データ型は ODBC データ型の SQL_VARBINARY または SQL_BINARY ODBC に変換されます。
注意  ODBC SQL Server ドライバは、ODBC SQL データ型、SQL_CHAR、SQL_VARCHAR、または SQL_LONGVARCHAR を、C 言語のデータ型 SQL_C_DATE または SQL_C_TIME に変換しません。一覧されている ODBC SQL データ型に対するほかの変換もすべてサポートされています。サポートされているほかの変換の詳細については、『ODBC 2.0 プログラマーズ リファレンス & SDK ガイド』の付録 D を参照してください。


データ型の使い方

SQL Server ドライバおよび SQL Server では、データ型の使い方に以下の制限があります。

データ型	制限
日付リテラル	日付リテラルが SQL_TIMESTAMP 列 (SQL Server データ型 datetime または smalldatetime) に格納されるとき、時刻値は 12:00:00.000 A.M. (午前 0 時) に設定されます。
money および smallmoney	money および smallmoney データ型の整数部のみが有効です。SQL money データの小数部がデータ変換時に切り捨てられた場合は、SQL Server ドライバはエラーではなく、警告を返します。
SQL_BINARY (NULL 値許可)	SQL Server Version 6.0 以前に接続しているときに、SQL_BINARY 列に NULL が許可されている場合は、データ ソース内に格納されるデータには 0 が埋め込まれません。このような列からデータを取得する場合、SQL Server ドライバがデータの右側に 0 を埋め込みます。ただし、連結などの SQL Server が実行した操作で作成されたデータには 0 が埋め込まれません。
SQL_CHAR  (切り捨て)	SQL Server Version 6.0 以前に接続しているときに、データが SQL_CHAR 列に格納される場合、その列に対してデータが長すぎるとき、SQL Server は警告なしにデータの右側を切り捨てます。
SQL_CHAR (NULL 値許可)	SQL Server Version 6.0 以前に接続しているときに、SQL_CHAR 列に NULL 値が許可されている場合、データ ソース内に格納されるデータにはブランクが埋め込まれません。このような列からデータを取得する場合、SQL Server ドライバがデータの右側にブランクを埋め込みます。ただし、連結などの SQL Server が実行した操作で作成されたデータにはブランクが埋め込まれません。
SQL_LONGVAR BINARY、 SQL_LONGVAR CHAR	SQL Server 6.x に接続しているときに、WHERE 句を使用して、SQL_LONGVARBINARY または SQL_LONGVARCHAR データ型の列に対して複数行に影響する更新が完全にサポートされています。SQL Server 4.2x に接続しているときに、更新が複数行に影響する場合は、S1000 エラー「部分的な挿入または更新です。text または image 列の挿入または更新に失敗しました。」を返します。
文字列関数パラメータ	文字列関数への string_exp パラメータは、SQL_CHAR データ型または SQL_VARCHAR データ型でなければなりません。文字列関数では、SQL_LONG_VARCHAR データ型はサポートされていません。SQL_CHAR データ型および SQL_VARCHAR データ型の最大長は 255 に制限されているので、count パラメータの値は 255 以下でなければなりません。
時刻リテラル	時刻リテラルが SQL_TIMESTAMP 列 (SQL Server データ型 datetime または smalldatetime) に格納されるときは、日付の値は 1900 年 1 月 1 日になります。
timestamp	timestamp 列に手作業で挿入できるのは NULL 値だけです。ただし、timestamp 列は SQL Server が自動的に更新するので、NULL 値は上書きされます。
tinyint	SQL Server tinyint データ型は符号なしです。デフォルトでは、tinyint 列は SQL_C_UTINYINT データ型の変数にバインドされます。
ユーザー定義データ型	SQL Server 4.2x に接続しているときは、明示的に列の NULL 許可属性を宣言していない列定義に SQL Server ドライバが NULL を追加します。そのため、ユーザー定義型の定義に格納されている NULL 許可属性は無視されます。 SQL Server 4.2x に接続しているときに、ユーザー定義型の列が char または binary を基本データ型としている場合に NULL 許可属性を宣言しないと、varchar または varbinary データ型として作成されます。SQLColAttributes、SQLColumns、および SQLDescribeCol は、この列のデータ型として SQL_VARCHAR または SQL_VARBINARY を返します。このような列から取得したデータの右側には、何も埋め込まれません。
LONG データ型	SQL_LONGVARBINARY データは、文字データに変換されたバイナリ データとしてではなく、生のバイナリ データとして SQLPutData に渡す必要があります。また、"実行時データ" パラメータは、 SQL_LONGVARBINARY データ型と SQL_LONGVARCHAR データ型の両方で制限されます。
詳細については、実行時データ パラメータの制限事項を参照してください。


付録 C   エラー
エラー

エラーが発生すると、SQL Server ドライバはネイティブなエラー番号、SQLSTATE (ODBC エラー コード)、およびエラー メッセージを返します。ドライバは、ドライバ自身が検出したエラーと Microsoft(R) SQL Server(TM) Version 6.5 (以下 SQL Server 6.5 または SQL Server) が返したエラーからこの情報を取得します。


ネイティブ エラー番号

SQL Server が返すデータ ソース内で発生したエラーに関しては、SQL Server ドライバは SQL Server が返したネイティブなエラー番号を返します。ドライバが検出したエラーに関しては、SQL Server ドライバはネイティブなエラー番号として 0 を返します。ネイティブなエラー番号の一覧については、SQL Server の master データベース内の sysmessages システム テーブルの error 列を参照してください。

Net-Library が返すエラーに関しては、ネイティブなエラー番号は元になるネットワーク ソフトウェアからのものです。


SQLSTATE (ODBC エラー コード)

SQL Server が検出して返すデータ ソース内で発生したエラーに関しては、SQL Server ドライバは SQL Server が返したネイティブなエラー番号を適切な SQLSTATE にマップします。ネイティブなエラー番号をマップする ODBC エラー コードがない場合は、SQL Server ドライバは SQLSTATE 37000 (文法エラーまたはアクセス違反) を返します。ドライバ自身が検出したエラーに関しては、SQL Server ドライバが適切な SQLSTATE を生成します。


エラー メッセージ

SQL Server が検出して返すデータ ソース内で発生したエラーに関しては、SQL Server ドライバは SQL Server が返したネイティブなエラー番号に基づくエラー メッセージを返します。SQL Server ドライバ内またはドライバ マネージャ内で発生したエラーに関しては、SQL Server ドライバは SQLSTATE に関連付けられたテキストに基づいてエラー メッセージを返します。SQL Server ドライバではなく、SQL Server が返すエラー メッセージの一覧については、SQL Server の master データベース内の sysmessages システム テーブルの description 列を参照してください。


構文

エラー メッセージの形式は以下のとおりです。

●	[vendor][ODBC_component][data_source]error_message

角かっこ ([ ]) 内のプレフィックスは、以下の表で定義するエラーの発生元を示します。

注意  データ ソース内でエラーが発生したときは、[vendor] および [ODBC_component] プレフィックスは、データ ソース自身ではなく、データ ソースからエラーを受け取った ODBC 構成要素のベンダーと名前を識別します。

データ ソース	プレフィックス	値
ドライバ マネージャ	[vendor] [ODBC_component] [data_source]	[Microsoft] [ODBC Driver Manager] N/A
カーソル ライブラリ	[vendor] [ODBC_component] [data_source]	[Microsoft] [ODBC Cursor Library] N/A
SQL Server ドライバ	[vendor] [ODBC_component] [data_source]	[Microsoft] [ODBC SQL Server Driver] N/A
SQL Server	[vendor] [ODBC_component] [data_source]	[Microsoft] [ODBC SQL Server Driver] [SQL Server]
SQL Server Net-Library	[vendor] [ODBC_component] [data_source]	[Microsoft] [ODBC SQL Server Driver] [net_library]