MDAC から SQL Server Native Client へのアプリケーションの更新
SQL Server Native Client と MDAC (Microsoft Data Access Components) には多くの違いがあります (Windows Vista 以降、このデータ アクセス コンポーネントは Windows DAC (Windows Data Access Components) と呼ばれています)。 どちらを使用しても SQL Server データベースへのネイティブ データ アクセスは可能ですが、SQL Server Native Client は、旧バージョンとの互換性を維持しながら、SQL Server 2005 の新機能を公開することを主眼において作成されています。
このトピックの情報は、SQL Server 2005 に付属するバージョンの SQL Server Native Client に対応するように MDAC (Windows DAC) アプリケーションを更新する場合に役立ちます。 SQL Server 2012 に付属するバージョンの SQL Server Native Client に対応するようにこのアプリケーションを更新するには、「SQL Server 2005 Native Client からのアプリケーションの更新」を参照してください。
また、MDAC には OLE DB、ODBC、および ADO (ActiveX Data Objects) を使用するためのコンポーネントが含まれていますが、SQL Server Native Client には、OLE DB と ODBC しか実装されていません (ただし、ADO から SQL Server Native Client の機能にアクセスすることはできます)。
SQL Server Native Client と MDAC のその他の違いを次に示します。
ADO を使用して SQL Server Native Client プロバイダーにアクセスした場合に使用できるフィルター機能は、同じユーザーが SQL OLE DB プロバイダーにアクセスした場合よりも少ないことがあります。
ADO アプリケーションで SQL Server Native Client を使用している場合に計算列の更新を試みると、エラーが報告されます。 MDAC では、更新が受け付けられたうえで、無視されていました。
SQL Server Native Client は、1 つの自己完結型 DLL (ダイナミック リンク ライブラリ) ファイルです。 配布を容易にすることと、セキュリティの危険にさらされるのを防ぐことの両面から、最小限のインターフェイスしか公開されません。
OLE DB インターフェイスと ODBC インターフェイスのみがサポートされます。
SQL Server Native Client の OLE DB プロバイダー名と ODBC ドライバー名は、MDAC で使用されるものと異なります。
MDAC コンポーネントによって提供される、ユーザーがアクセスできる機能は、SQL Server Native Client の使用時に使用できます。 この機能には、接続プーリング、ADO サポート、クライアント カーソルのサポートなどがあります。 このような機能を使用するとき、SQL Server Native Client ではデータベース接続のみが提供されます。 MDAC は、トレース、管理制御、およびパフォーマンス カウンターなどの機能を提供します。
アプリケーションでは、SQL Server Native Client と共に OLE DB Core Services を使用できます。ただし、OLE DB カーソル エンジンを使用している場合、このカーソル エンジンでは新しい SQL Server 2005 のデータ型が認識されないので、アプリケーションでデータ型互換性オプションを使用して、問題が発生しないようにする必要があります。
SQL Server Native Client は、以前の SQL Server データベースへのアクセスをサポートしています。
SQL Server Native Client には、XML の統合は含まれていません。 SQL Server Native Client では SELECT … FOR XML クエリはサポートされますが、その他の XML 機能はサポートされません。 ただし、SQL Server Native Client では、SQL Server 2005 で導入された xml データ型はサポートされます。
SQL Server Native Client では、接続文字列の属性のみを使用する、クライアント側のネットワーク ライブラリの構成がサポートされます。 ネットワーク ライブラリをさらに詳細に構成する場合は、SQL Server 構成マネージャーを使用する必要があります。
SQL Server Native Client には、odbcbcp.dll との互換性がありません。 アプリケーションで ODBC API と bcp API の両方を使用している場合は、アプリケーションをリビルドして sqlncli11.lib とリンクし、SQL Server Native Client を使用できるようにする必要があります。
SQL Server Native Client は、MSDASQL (Microsoft OLE DB Provider for ODBC) からはサポートされません。 MDAC SQLODBC ドライバーを MSDASQL と共に使用しているか、MDAC SQLODBC ドライバーを ADO と共に使用している場合は、SQL Server Native Client の OLE DB を使用してください。
MDAC 接続文字列では Trusted_Connection キーワードのブール値 (true) を指定できます。 SQL Server Native Client 接続文字列では yes または no を使用する必要があります。
警告とエラーが一部変更されています。 サーバーから返される警告とエラーの重大度は、SQL Server Native Client に渡されるときも保持されるようになりました。 特定の警告やエラーのトラッピングに依存しているアプリケーションは、十分にテストする必要があります。
SQL Server Native Client では、MDAC よりも厳密なエラー チェックが行われます。そのため、アプリケーションが ODBC と OLE DB の仕様に厳密に準拠していないときには動作が異なることがあります。 たとえば、SQLOLEDB プロバイダーでは、結果のパラメーターの名前を '@' で始めるという規則が強制されないのに対して、SQL Server Native Client OLE DB プロバイダーではこの規則を適用する必要があります。
SQL Server Native Client では、接続が失敗したときの動作が MDAC と異なります。 たとえば、MDAC では接続が失敗した場合はキャッシュされたプロパティ値を返しますが、SQL Server Native Client では呼び出し元のアプリケーションにエラーを報告します。
SQL Server Native Client では、Visual Studio Analyzer イベントは生成されませんが、代わりに Windows トレース イベントが生成されます。
SQL Server Native Client をパフォーマンス モニターと併用することはできません。 パフォーマンス モニターは、Windows に付属している MDAC SQLODBC ドライバーを使用する DSN のみと併用できる Windows ツールです。
SQL Server Native Client を SQL Server 2005 以降のバージョンに接続すると、サーバー エラー 16947 が SQL_ERROR として返されます。 このエラーは、位置指定更新または位置指定削除による行の更新や削除が失敗したときに発生します。 任意のバージョンの SQL Server に接続している MDAC では、サーバー エラー 16947 は警告 (SQL_SUCCESS_WITH_INFO) として返されます。
SQL Server Native Client には、以前は実装されていなかった、省略可能な OLE DB インターフェイスの IDBDataSourceAdmin インターフェイスが実装されています。ただし、この省略可能なインターフェイスに実装されているのは CreateDataSource メソッドのみです。 この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。新しい開発作業では、この機能の使用を避け、現在この機能を使用しているアプリケーションは修正するようにしてください。
SQL Server Native Client OLE DB プロバイダーでは、TABLE_TYPE を SYNONYM に設定すると、TABLES スキーマ行セットと TABLE_INFO スキーマ行セットのシノニムを返します。
varchar(max) 型、nvarchar(max) 型、varbinary(max) 型、xml 型、udt 型、またはその他のラージ オブジェクト型の戻り値を SQL Server 2005 より前のバージョンのクライアントに返すことはできません。 これらの型を戻り値として使用する場合は、SQL Server Native Client を使用する必要があります。
手動および暗黙のトランザクション開始時において、以下のステートメントの実行が MDAC では許可されていましたが、SQL Server Native Client では許可されません。 これらは、自動コミット モードで実行する必要があります。
すべてのフルテキスト操作 (インデックスおよびカタログ DDL)
すべてのデータベース操作 (データベースの作成、変更、および削除)
Reconfigure
Shutdown
Kill
Backup
MDAC アプリケーションから SQL Server に接続すると、SQL Server 2005 で導入されたデータ型は、次の表に示すような、SQL Server 2000 と互換性を持つデータ型として扱われます。
SQL Server 2005 の型
SQL Server 2000 の型
varchar(max)
text
nvarchar(max)
ntext
varbinary(max)
image
udt
varbinary
xml
ntext
この型マッピングは、列のメタデータに返される値に影響を与えます。 たとえば、text 型の列の最大サイズは 2,147,483,647 ですが、SQL Server Native Client ODBC では、varchar(max) 型の列の最大サイズを SQL_SS_LENGTH_UNLIMITED と報告し、SQL Server Native Client OLE DB では、プラットフォームに応じて、varchar(max) 型の列の最大サイズを 2,147,483,647 または -1 と報告します。
SQL Server Native Client では、旧バージョンとの互換性を維持するために接続文字列のあいまい性が許可されます。たとえば、キーワードを複数回指定したり、位置と優先順位に基づいた解決方法を使用して、競合するキーワードを指定することができます。 SQL Server Native Client の今後のリリースでは、あいまいな接続文字列を使用できなくなる可能性があります。 SQL Server Native Client を使用するアプリケーションでは、あいまいな接続文字列を利用しないように変更することをお勧めします。
ODBC または OLE DB 呼び出しを使用してトランザクションを開始した場合、SQL Server Native Client と MDAC とでは動作が異なります。SQL Server Native Client ではトランザクションがすぐに開始されますが、MDAC では最初のデータベース アクセスの後にトランザクションが開始されます。 これはストアド プロシージャとバッチの動作に影響を与える可能性があります。SQL Server では、バッチまたはストアド プロシージャの実行開始時と実行終了後で @@TRANCOUNT の値が同じである必要があるためです。
SQL Server Native Client で ITransactionLocal::BeginTransaction を使用すると、トランザクションが直ちに開始されます。 MDAC では、暗黙のトランザクション モードを必要とするステートメントをアプリケーションが実行するまで、トランザクションの開始が遅延されました。 詳細については、「SET IMPLICIT_TRANSACTIONS (Transact-SQL)」を参照してください。
SQL Server Native Client ドライバーと System.Data.Odbc を使用して、SQL Server 固有の新しいデータ型または機能を公開する SQL Server サーバー コンピューターにアクセスすると、エラーが発生する場合があります。 System.Data.Odbc は ODBC の汎用実装であり、そのためベンダー固有の拡張機能は公開されません (SQL Server Native Client ドライバーは最新の SQL Server 機能をネイティブでサポートするように更新されます)。この問題を回避するには、MDAC に戻すか、System.Data.SqlClient に移行します。
行のバージョン管理機能を使用した Read Committed トランザクション分離は SQL Server Native Client と MDAC の両方でサポートされていますが、スナップショット トランザクション分離は SQL Server Native Client のみでサポートされています (プログラミング用語では、「行のバージョン管理機能を使用した Read Committed トランザクション分離」は「Read Committed トランザクション」と同義語です)。