SQL Server Native Client と ADO の併用
複数のアクティブな結果セット (MARS)、クエリ通知、ユーザー定義型 (UDT)、新しい xml データ型など、SQL Server 2005 で導入された新機能を利用するには、ActiveX データ オブジェクト (ADO) を使用する既存のアプリケーションで、SQL Server Native Client OLE DB プロバイダーをデータ アクセス プロバイダーとして使用する必要があります。
SQL Server 2005 で導入された新機能を使用する必要がない場合は、SQL Server Native Client OLE DB プロバイダーを使用する必要はありません。現在のデータ アクセス プロバイダー (通常は SQLOLEDB) を引き続き使用できます。 既存のアプリケーションを拡張していて、SQL Server 2005 で導入された新機能を使用する必要がある場合は、OLE DB プロバイダー SQL Server Native Client使用する必要があります。
注意
新しいアプリケーションを開発する場合は、最新バージョンの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の新機能を使用できるようにするために、OLE DB のコア機能を拡張するSQL Server Native Client OLE DB プロバイダーに対していくつかの機能強化が行われています。 これらの機能強化により、ADO アプリケーションは新しいSQL Server機能を使用し、SQL Server 2005 で導入された 2 つのデータ型 (xml と udt) を使用できます。 また、この機能強化では、varchar、nvarchar、varbinary の各データ型に対する機能も強化されています。 SQL Server Native Clientは、新しいデータ型が ADO と互換性のある方法で公開されるように、SSPROP_INIT_DATATYPECOMPATIBILITY初期化プロパティを ADO アプリケーションで使用するDBPROPSET_SQLSERVERDBINIT プロパティ セットに追加します。 さらに、SQL Server Native Client OLE DB プロバイダーは、接続文字列に設定されている という名前DataTypeCompatibility
の新しい接続文字列キーワード (keyword)も定義します。
Note
既存の ADO アプリケーションは、SQLOLEDB プロバイダーを使用して、XML、UDT、および大きな値のテキストやバイナリのフィールド値にアクセスして更新できます。 サイズの大きな値をとる新しいデータ型 varchar(max) 、nvarchar(max) 、varbinary(max) はそれぞれ、adLongVarChar、adLongVarWChar、adLongVarBinary という ADO 型として返されます。 XML 列は adLongVarChar として返され、UDT 列は adVarBinary として返されます。 ただし、SQLOLEDB の代わりに SQL Server Native Client OLE DB プロバイダー (SQLNCLI11) を使用する場合は、新しいデータ型が ADO データ型に正しくマップされるように、キーワード (keyword)を "80" に設定DataTypeCompatibility
する必要があります。
ADO からの SQL Server Native Client の有効化
SQL Server Native Clientの使用を有効にするには、ADO アプリケーションで接続文字列に次のキーワードを実装する必要があります。
Provider=SQLNCLI11
DataTypeCompatibility=80
SQL Server Native Clientでサポートされている ADO 接続文字列キーワードの詳細については、「SQL Server Native Clientでの接続文字列キーワードの使用」を参照してください。
MARS 機能の有効化など、SQL Server 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
例
次のセクションでは、SQL Server 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=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
Note
レコードセットのフィルター選択は、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 の有効化と使用
この例では、接続文字列を作成して、SQL SERVER NATIVE CLIENT OLE DB プロバイダーを介して MARS を有効にし、同じ接続を使用して 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 接続プールにプールされなかったので、これが原因でオーバーヘッドが増加することになります。 SQL Server Native Client OLE DB プロバイダーによって公開される MARS 機能を使用すると、1 つの接続で複数のアクティブな結果が得られます。