SQL Server Native Client と ADO の併用

適用対象: はいSQL Server (サポートされているすべてのバージョン) はいAzure SQL データベース はいAzure SQL Managed Instance はいAzure Synapse Analytics はいParallel Data Warehouse

SQL Server 2005 (9.x)複数のアクティブな結果セット (MARS)、クエリ通知、ユーザー定義型 (udt)、または新しい xml データ型など、で導入された新機能を利用するには、ActiveX データオブジェクト (ADO) を使用する既存のアプリケーションで、 SQL Server データアクセスプロバイダーとして Native Client OLE DB プロバイダーを使用する必要があります。

SQL Server 2005 (9.x) の新機能を一切使用する必要がない場合は、SQL Server Native Client OLE DB プロバイダーを使用する必要はありません。つまり、現在のデータ アクセス プロバイダー (通常は SQLOLEDB) を継続して使用できます。 既存のアプリケーションを強化して、SQL Server 2005 (9.x) の新機能を使用する必要がある場合は、SQL Server Native Client OLE DB プロバイダーを使用してください。

注意

新しいアプリケーションを開発している場合は、SQL Server の最新バージョンのすべての新機能にアクセスできるように、SQL Server Native Client ではなく、ADO.NET および .NET Framework Data Provider for SQL Server の使用を検討することをお勧めします。 .NET Framework Data Provider for SQL Server の詳細については、ADO.NET に関する .NET Framework SDK のドキュメントを参照してください。

ADO から SQL Server の最新バージョンの新機能を使用できるように、SQL Server Native Client OLE DB プロバイダーを機能強化し、OLE DB の中核となる機能を拡張しました。 ADO アプリケーションはこのような機能強化により、SQL Server の新しい機能、および SQL Server 2005 (9.x) で導入された 2 つのデータ型 (xmludt) を使用できるようになります。 また、この機能強化では、varcharnvarcharvarbinary の各データ型に対する機能も強化されています。 SQL Server Native Client では、ado アプリケーションで使用するために、SSPROP_INIT_DATATYPECOMPATIBILITY 初期化プロパティが DBPROPSET_SQLSERVERDBINIT プロパティセットに追加されます。これにより、新しいデータ型が ADO と互換性のある方法で公開されるようになります。 また、 SQL Server Native Client OLE DB プロバイダーは、接続文字列で設定された DataTypeCompatibility という名前の新しい接続文字列キーワードも定義します。

注意

既存の ADO アプリケーションは、SQLOLEDB プロバイダーを使用して、XML、UDT、および大きな値のテキストやバイナリのフィールド値にアクセスして更新できます。 サイズの大きな値をとる新しいデータ型 varchar(max)nvarchar(max)varbinary(max) はそれぞれ、adLongVarCharadLongVarWCharadLongVarBinary という ADO 型として返されます。 XML 列は adLongVarChar として返され、UDT 列は adVarBinary として返されます。 ただし、SQLOLEDB では SQL Server なく Native Client OLE DB provider (SQLNCLI11) を使用する場合は、新しいデータ型が ADO データ型に正しくマップされるように、 DataTypeCompatibility キーワードを "80" に設定する必要があります。

ADO からの SQL Server Native Client の有効化

Native Client の使用を有効にするに SQL Server は、ADO アプリケーションで、接続文字列に次のキーワードを実装する必要があります。

  • Provider=SQLNCLI11

  • DataTypeCompatibility=80

Native Client でサポートされている ADO 接続文字列キーワードの詳細については SQL Server 、「 SQL Server Native Client での接続文字列キーワードの使用」を参照してください。

次の例では、 SQL Server MARS 機能の有効化など、Native Client で動作するように完全に有効になっている ADO 接続文字列を確立しています。

Dim con As New ADODB.Connection  
  
con.ConnectionString = "Provider=SQLNCLI11;" _  
         & "Server=(local);" _  
         & "Database=AdventureWorks;" _   
         & "Integrated Security=SSPI;" _  
         & "DataTypeCompatibility=80;" _  
         & "MARS Connection=True;"  
con.Open  

次のセクションでは、Native Client OLE DB プロバイダーで ADO を使用する方法の例について説明し SQL Server ます。

XML 列データの取得

この例では、レコードセットを使用し、SQL Server AdventureWorks サンプル データベースの XML 列からデータを取得および表示します。

Dim con As New ADODB.Connection  
Dim rst As New ADODB.Recordset  
Dim sXMLResult As String  
  
con.ConnectionString = "Provider=SQLNCLI11;" _  
         & "Server=(local);" _  
         & "Database=AdventureWorks;" _   
         & "Integrated Security=SSPI;" _   
         & "DataTypeCompatibility=80;"  
  
con.Open  
  
' Get the xml data as a recordset.  
Set rst.ActiveConnection = con  
rst.Source = "SELECT AdditionalContactInfo FROM Person.Contact " _  
   & "WHERE AdditionalContactInfo IS NOT NULL"  
rst.Open  
  
' Display the data in the recordset.  
While (Not rst.EOF)  
   sXMLResult = rst.Fields("AdditionalContactInfo").Value  
   Debug.Print (sXMLResult)  
   rst.MoveNext  
End While  
  
con.Close  
Set con = Nothing  

注意

レコードセットのフィルター選択は、XML 列でサポートされません。 これを使用すると、エラーが返されます。

UDT 列データの取得

この例では、Command オブジェクトを使用して、UDT を返す SQL クエリを実行します。その後、UDT データを更新し、新しいデータをデータベースに挿入します。 ここでは、Point UDT が既にデータベースに登録されていることを前提としています。

Dim con As New ADODB.Connection  
Dim cmd As New ADODB.Command  
Dim rst As New ADODB.Recordset  
Dim strOldUDT As String  
Dim strNewUDT As String  
Dim aryTempUDT() As String  
Dim strTempID As String  
Dim i As Integer  
  
con.ConnectionString = "Provider=SQLNCLI11;" _  
         & "Server=(local);" _  
         & "Database=AdventureWorks;" _   
         & "Integrated Security=SSPI;" _  
         & "DataTypeCompatibility=80;"  
  
con.Open  
  
' Get the UDT value.  
Set cmd.ActiveConnection = con  
cmd.CommandText = "SELECT ID, Pnt FROM dbo.Points.ToString()"  
Set rst = cmd.Execute  
strTempID = rst.Fields(0).Value  
strOldUDT = rst.Fields(1).Value  
  
' Do something with the UDT by adding i to each point.  
arytempUDT = Split(strOldUDT, ",")  
i = 3  
strNewUDT = LTrim(Str(Int(aryTempUDT(0)) + i)) + "," + _  
   LTrim(Str(Int(aryTempUDT(1)) + i))  
  
' Insert the new value back into the database.  
cmd.CommandText = "UPDATE dbo.Points SET Pnt = '" + strNewUDT + _  
   "' WHERE ID = '" + strTempID + "'"  
cmd.Execute  
  
con.Close  
Set con = Nothing  

MARS の有効化と使用

この例では、Native Client OLE DB プロバイダーを介して MARS を有効にするように接続文字列が構築され、 SQL Server 同じ接続を使用して実行するために2つのレコードセットオブジェクトが作成されます。

Dim con As New ADODB.Connection  
  
con.ConnectionString = "Provider=SQLNCLI11;" _  
         & "Server=(local);" _  
         & "Database=AdventureWorks;" _   
         & "Integrated Security=SSPI;" _  
         & "DataTypeCompatibility=80;" _  
         & "MARS Connection=True;"  
con.Open  
  
Dim recordset1 As New ADODB.Recordset  
Dim recordset2 As New ADODB.Recordset  
  
Dim recordsaffected As Integer  
Set recordset1 =  con.Execute("SELECT * FROM Table1", recordsaffected, adCmdText)  
Set recordset2 =  con.Execute("SELECT * FROM Table2", recordsaffected, adCmdText)  
  
con.Close  
Set con = Nothing  

以前のバージョンの OLE DB プロバイダーでは、アクティブな結果セットを 1 つの接続ごとに 1 つしか開くことができなかったので、このコードにより 2 回目の実行時に暗黙の接続が作成されました。 暗黙の接続が OLE DB 接続プールにプールされなかったので、これが原因でオーバーヘッドが増加することになります。 Native Client OLE DB プロバイダーによって公開されている MARS 機能を使用すると、 SQL Server 1 つの接続で複数のアクティブな結果を取得できます。

参照

SQL Server Native Client を使用したアプリケーションのビルド