次の方法で共有


side-by-side 実行と ADO.NET

.NET Framework の side-by-side 実行は、.NET Framework の複数のバージョンがインストールされている 1 台のコンピュータ上で、複数のバージョンからの影響を受けずに、アプリケーションを実行する機能です。つまり、1 台のコンピュータで .NET Framework の複数のバージョンが使用可能であっても、アプリケーションはコンパイル時のバージョンを使用し、コンピュータにインストールされている他の .NET Framework バージョンの影響を受けません。side-by-side 実行の設定の詳細については、「side-by-side 実行」を参照してください。

あるバージョンの .NET Framework を使用してコンパイルされたアプリケーションを、別のバージョンの .NET Framework で実行することもできます。しかし、インストールされている .NET Framework のバージョンごとにアプリケーションをコンパイルして、各バージョンを別々に実行することをお勧めします。いずれの場合でも、ADO.NET の各リリース間の変更によって生じるアプリケーションの上位互換性または下位互換性の問題に注意する必要があります。

上位互換性と下位互換性

上位互換性とは、アプリケーションが、.NET Framework の新しいバージョンと以前のバージョンのどちらでもコンパイルして実行できることを意味します。.NET Framework Version 1.1 用に記述された ADO.NET コードは、.NET Framework Version 1.1 で導入された新機能を使用していなければ、上位互換性があります。.NET Framework Version 1.1 で ADO.NET に追加された新機能は次のとおりです。

下位互換性とは、アプリケーションが .NET Framework の以前のバージョン用にコンパイルされ、機能を低下させずに、.NET Framework の新しいバージョンで引き続き実行できることを意味します。

.NET Framework Version 1.1 の ADO.NET コンポーネントは、上位互換性と下位互換性 (新機能を除く) の両方を持つようにデザインされていますが、アプリケーションの上位互換性または下位互換性に影響を及ぼす問題点がいくつかあることを認識しておく必要があります。

ADO.NET コードの下位互換性または上位互換性に影響する可能性のある side-by-side 実行の問題点について、以下に説明します。このトピックで説明する問題点は次のとおりです。

  • .NET Framework Data Provider for ODBC
  • .NET Framework Data Provider for Oracle
  • コード アクセス セキュリティ
  • DataSet
  • SqlCommand の実行
  • MDAC のバージョン

.NET Framework Data Provider for ODBC

.NET Framework Data Provider for ODBC (System.Data.Odbc) は、.NET Framework の一部として同梱されています (Version 1.1 以降)。しかし、ODBC データ プロバイダは、.NET Framework Version 1.0 には同梱されていません。.NET Framework Version 1.0 の開発者は、https://www.microsoft.com/downloads/search.asp?LangID=13&LangDIR=JA から ODBC データ プロバイダをダウンロードできます。ダウンロードされた .NET Framework Data Provider for ODBC の名前空間は Microsoft.Data.Odbc です。

ODBC データ プロバイダを使用してデータ ソースに接続する、.NET Framework Version 1.0 用に開発したアプリケーションがあり、そのアプリケーションを .NET Framework Version 1.1 で実行する場合は、ODBC データ プロバイダの名前空間を System.Data.Odbc に更新し、.NET Framework Version 1.1 用に再コンパイルする必要があります。

ODBC データ プロバイダを使用してデータ ソースに接続する、.NET Framework Version 1.1 用に開発したアプリケーションがあり、そのアプリケーションを .NET Framework Version 1.0 で実行する場合は、ODBC データ プロバイダをダウンロードし、.NET Framework Version 1.0 システムにインストールする必要があります。次に、ODBC データ プロバイダの名前空間を Microsoft.Data.Odbc に変更し、.NET Framework Version 1.0 用に再コンパイルする必要があります。

.NET Framework Data Provider for Oracle

.NET Framework Data Provider for Oracle (System.Data.OracleClient) は、.NET Framework の一部として同梱されています (Version 1.1 以降)。しかし、.Net Managed Provider for Oracle (日本語版) は、.NET Framework Version 1.0 には同梱されていません。.NET Framework Version 1.0 の開発者は、https://www.microsoft.com/downloads/search.asp?LangID=13&LangDIR=JA から .Net Managed Provider for Oracle (日本語版) をダウンロードできます。

Oracle データ プロバイダを使用してデータ ソースに接続する、.NET Framework Version 1.1 用に開発したアプリケーションがあり、そのアプリケーションを .NET Framework Version 1.0 で実行する場合は、Net Managed Provider for Oracle (日本語版) をダウンロードし、.NET Framework Version 1.0 システムにインストールする必要があります。

コード アクセス セキュリティ

.NET Framework Version 1.0 の .NET Framework データ プロバイダ (System.Data.SqlClientSystem.Data.OleDb) を実行するには、FullTrust アクセス許可が必要です。アクセス許可レベルが FullTrust より低いゾーンで .NET Framework Version 1.0 の .NET Framework データ プロバイダを使用しようとすると、SecurityException がスローされます。

.NET Framework Version 1.1 では、部分的に信頼されたゾーンで .NET Framework Data Provider for SQL Server を使用できるようになりました。OLE DB データ プロバイダと ODBC データ プロバイダを使用する場合は、引き続き FullTrust アクセス許可が必要です。

.NET Framework Version 1.1 の .NET Framework データ プロバイダには、特定のセキュリティ ゾーンで使用できる接続文字列を制限できる新しいセキュリティ機能が追加されました。特定のセキュリティ ゾーンに対して空白のパスワードの使用を禁止することもできます。詳細については、「コード アクセス セキュリティと ADO.NET」を参照してください。

.NET Framework のインストールごとに個別の Security.config ファイル (「セキュリティ構成ファイル」を参照) があるため、セキュリティ設定については、上位互換性または下位互換性の問題はありません。ただし、アプリケーションが、.NET Framework Version 1.1 に同梱されている ADO.NET の追加のセキュリティ機能に依存している場合は、アプリケーションを Version 1.0 システムに配布することはできません。

DataSet

.NET Framework Version 1.1 の DataSet には、.NET Framework Version 1.0 での DataSet の動作を変更するバグ修正が含まれています。コードが Version 1.0 での動作に依存している場合には、下位互換性の問題が発生することがあります。DataSet の動作は、次のように変更されました。

  • DataSet の XML スキーマ定義言語 (XSD) スキーマで空文字列として設定された既定の列値は、null と解釈されなくなりました。

  • 制約は、Locale プロパティが変更された後で検証されます。

  • DataSet のスキーマで、型が異なる同名の要素が同じ名前空間内に含まれている場合、そのスキーマを DataSet に読み込もうとしたり、DataSet をバージョン 1.1 クライアントでリモート処理したりすると、例外がスローされるようになりました。たとえば、2 つのテーブルが関連付けられていて、親テーブルの列に子テーブルと同じ名前が付いている場合、DataRelationNested プロパティが true になっていると、例外がスローされます。これは、DataSet の XML スキーマで、子テーブルが親テーブルと同じ名前空間に配置されるためです。DataRelationNested プロパティが false の場合は、例外はスローされません。

  • 列の AllowDBNull プロパティを false に設定し、列の ColumnMapping プロパティを MappingType.Attribute に設定すると、DataSet をリモート処理した場合に特殊な状況になります。Version 1.0 システムからリモート処理された DataSet の場合は、クライアントがリモート処理された DataSet を読み込もうとすると、例外が発生します。Version 1.1 システムからリモート処理された DataSet の場合、例外は発生しません。しかし、Version 1.0 システムは列の DefaultValue を読み取ることができません。Version 1.0 システムでは、列の DefaultValueString.Empty です。

  • DataSet の XML スキーマに targetNamespace が含まれている場合、ReadXml を呼び出して、名前空間が限定されていない要素を含む XML を DataSet に読み込もうとすると、データが読み取られず、例外が発生することがあります。この場合に限定されていない要素を読み取るには、XML スキーマで elementFormDefault を "qualified" に設定してください。次に例を示します。

    <xsd:schema id="MyDataSet" 
      elementFormDefault="qualified"
      targetNamespace="http://www.tempuri.org/MyDataSet.xsd" 
      xmlns="http://www.tempuri.org/MyDataSet.xsd" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    </xsd:schema>
    

SqlCommand の実行

.NET Framework Version 1.1 では、SqlCommand.ExecuteReader がデータ ソースに対してコマンドを実行するときの動作が変更されました。

.NET Framework Version 1.0 では、SqlCommand.ExecuteReader は、sp_executesql ストアド プロシージャのコンテキストですべてのコマンドを実行します。その結果、接続の状態に影響を与えるコマンド (たとえば、SET NOCOUNT ON) は、現在のコマンドの実行だけに適用されます。接続が開かれている間に実行される後続のコマンドについては、接続の状態は変更されません。

.NET Framework Version 1.1 では、SqlCommand.ExecuteReader は、コマンドにパラメータが含まれている場合だけ、sp_executesql ストアド プロシージャのコンテキストでコマンドを実行します。これは、パフォーマンスが向上するためです。その結果、非パラメータ化コマンドのうちの、接続の状態に影響を与えるコマンドは、接続が開いている間に実行される後続のすべてのコマンドに対して、接続の状態を変更します。

たとえば、SqlCommand.ExecuteReader への呼び出しで次のバッチ コマンドが実行されるとします。

SET NOCOUNT ON;
SELECT * FROM Customers;

.NET Framework Version 1.1 では、NOCOUNT は、接続が開いている間に実行される後続のコマンドに対して ON のままです。.NET Framework Version 1.0 では、NOCOUNT は、現在のコマンドの実行に対してだけ ON です。

アプリケーションが、どちらかのバージョンの .NET Framework の SqlCommand.ExecuteReader の動作に依存している場合は、この変更が上位互換性と下位互換性の両方に影響することがあります。

アプリケーションを .NET Framework の以前のバージョンと新しいバージョンの両方で動作させる場合は、どのバージョンで実行された場合にも動作が同じになるように、コードを記述できます。変更された接続状態が後続のすべてのコマンドでも有効になるようにする場合は、SqlCommand.ExecuteNonQuery を使用してコマンドを実行することをお勧めします。変更された接続状態が後続のコマンドでは無効になるようにする場合は、接続状態をリセットするコマンドを含めるようにしてください。次に例を示します。

SET NOCOUNT ON;
SELECT * FROM Customers;
SET NOCOUNT OFF;

MDAC のバージョン

各 .NET Framework データ プロバイダは、.NET Framework のバージョンにかかわらず、MDAC 2.6 以降のインストールが必要です。side-by-side 実行に関する問題が発生することはありませんが、MDAC が、現在、side-by-side 実行をサポートしていないことに注意する必要があります。このため、インストールされている MDAC コンポーネントをアップグレードする場合は、アプリケーションが新しいバージョンでも正常に機能することを事前に確認する必要があります。

参照

ADO.NET の概要 | ADO.NET のアーキテクチャ | .NET Framework データ プロバイダによるデータのアクセス