SQL Native Client と ADO の併用

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

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

ms130978.note(ja-jp,SQL.90).gifメモ :
新しいアプリケーションを開発している場合は、SQL Server 2005 のすべての新機能にアクセスするために、SQL 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 2005 の機能を使用できるように、SQL Native Client OLE DB プロバイダを機能強化し、OLE DB の中核となる機能を拡張しました。ADO アプリケーションはこのような機能強化により、主に、SQL Server 2005 で提供される新機能、SQL Server の新しい 2 つのデータ型 (xmludt)、さらに varcharnvarchar、および varbinary の各データ型の機能強化を使用できるようになります。SQL Native Client では、ADO アプリケーションで使用するために、SSPROP_INIT_DATATYPECOMPATIBILITY 初期化プロパティが DBPROPSET_SQLSERVERDBINIT プロパティ セットに追加されています。このため、新しいデータ型が、ADO と互換性のある方法で公開されます。さらに、SQL Native Client OLE DB プロバイダでは、接続文字列に設定される、DataTypeCompatibility という新しい接続文字列キーワードも定義されます。

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

ADO からの SQL Native Client の有効化

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

  • Provider=SQLNCLI
  • DataTypeCompatibility=80

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

次に、MARS 機能の有効化など、SQL Native Client を使用した操作で利用できる ADO 接続文字列を作成する例を示します。

Dim con As New ADODB.Connection

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

ここでは、SQL Native Client OLE DB プロバイダと ADO を併用する方法の例を示します。

XML 列データの取得

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

Dim con As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim sXMLResult As String

con.ConnectionString = "Provider=SQLNCLI;" _
         & "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
ms130978.note(ja-jp,SQL.90).gifメモ :
レコードセットのフィルタ選択は、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=SQLNCLI;" _
         & "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 の有効化と使用

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

Dim con As New ADODB.Connection

con.ConnectionString = "Provider=SQLNCLI;" _
         & "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 接続プールにプールされなかったので、これが原因でオーバーヘッドが増加することになります。SQL Native Client OLE DB プロバイダで公開された MARS 機能を使用すると、1 つの接続で複数のアクティブな結果を取得できます。

参照

その他の技術情報

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

ヘルプおよび情報

SQL Server 2005 の参考資料の入手