Använda ADO med OLE DB-drivrutin för SQL Server

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-databas i Microsoft Fabric

Ladda ned OLE DB-drivrutins

För att dra nytta av nya funktioner som introducerats i SQL Server 2005 (9.x), såsom flera aktiva resultatuppsättningar (MARS), frågenotiser, användardefinierade typer (UDT) eller den nya xml-datatypen , bör befintliga applikationer som använder ActiveX Data Objects (ADO) använda OLE DB-drivrutinen för SQL Server som sin dataåtkomstleverantör.

För att möjliggöra för ADO att använda nya funktioner från nyare versioner av SQL Server har vissa förbättringar gjorts i OLE DB-drivrutinen för SQL Server, som utökar kärnfunktionerna i OLE DB. Dessa förbättringar gör det möjligt för ADO-applikationer att använda nyare SQL Server-funktioner och att konsumera två datatyper som introducerades i SQL Server 2005 (9.x): xml och udt. Dessa förbättringar utnyttjar också förbättringar av varchar-, nvarchar- och varbinärdatatyperna . OLE DB Driver för SQL Server lägger till egenskapen SSPROP_INIT_DATATYPECOMPATIBILITY initialisering till DBPROPSET_SQLSERVERDBINIT-egenskapsuppsättningen för användning av ADO-applikationer så att de nya datatyperna exponeras på ett sätt som är kompatibelt med ADO. Dessutom definierar OLE DB-drivrutinen för SQL Server även ett nytt anslutningssträngsnyckelord kallat DataTypeCompatibility som sätts i anslutningssträngen.

Anmärkning

Befintliga ADO-applikationer kan komma åt och uppdatera XML, UDT samt stora värdetexter och binära fältvärden med hjälp av SQLOLEDB-leverantören. De nya större varchar(max)-, nvarchar(max)- och varbinär-(max) -datatyperna returneras som ADO-typerna adLongVarChar, adLongVarWChar respektive adLongVarBinary . XML-kolumner returneras som adLongVarChar, och UDT-kolumner returneras som adVarBinary. Men om du använder OLE DB-drivrutinen för SQL Server (MSOLEDBSQL19 eller MSOLEDBSQL) istället för SQLOLEDB, måste du se till att sätta DataTypeCompatibility nyckelord till "80" så att de nya datatyperna korrekt mappas till ADO-datatyperna.

Aktivering av OLE DB-drivrutin för SQL Server från ADO

För att möjliggöra användning av OLE DB-drivrutin för SQL Server behöver ADO-applikationer implementera följande nyckelord i sina anslutningssträngar:

  • Provider=MSOLEDBSQL19

  • DataTypeCompatibility=80

För mer information om de ADO connections-strängsnyckelord som stöds i OLE DB Driver för SQL Server, se Using Connection String Keywords with OLE DB Driver for SQL Server.

Följande kod är ett exempel på att etablera en ADO-anslutningssträng som är fullt aktiverad för att fungera med OLE DB-drivrutinen för SQL Server, inklusive aktivering av MARS-funktionen:

Dim con As New ADODB.Connection

con.ConnectionString = "Provider=MSOLEDBSQL19;" _
         & "Server=(local);" _
         & "Database=AdventureWorks;" _
         & "Use Encryption for Data=Optional;" _
         & "Integrated Security=SSPI;" _
         & "DataTypeCompatibility=80;" _
         & "MARS Connection=True;"
con.Open

Examples

Följande avsnitt ger exempel på hur du kan använda ADO med OLE DB-drivrutinen för SQL Server.

Hämta XML-kolumndata

I detta exempel används en postmängd för att hämta och visa data från en XML-kolumn i SQL Server AdventureWorks-exempeldatabasen .

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

con.ConnectionString = "Provider=MSOLEDBSQL19;" _
         & "Server=(local);" _
         & "Database=AdventureWorks;" _
         & "Use Encryption for Data=Optional;" _
         & "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

Anmärkning

Postfiltering stöds inte med XML-kolumner. Om det används kommer ett fel att returneras.

Hämta UDT-kolumndata

I detta exempel används ett Command-objekt för att köra en SQL-fråga som returnerar en UDT, UDT-data uppdateras och sedan återinförs den nya datan i databasen. Detta exempel antar att punkt-UDT redan har registrerats i databasen.

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=MSOLEDBSQL19;" _
         & "Server=(local);" _
         & "Database=AdventureWorks;" _
         & "Use Encryption for Data=Optional;" _
         & "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

Aktivering och användning av MARS

I detta exempel konstrueras anslutningssträngen för att aktivera MARS via OLE DB-drivrutinen för SQL Server, och sedan skapas två postuppsättningsobjekt för att köras med samma anslutning.

Dim con As New ADODB.Connection

con.ConnectionString = "Provider=MSOLEDBSQL19;" _
         & "Server=(local);" _
         & "Database=AdventureWorks;" _
         & "Use Encryption for Data=Optional;" _
         & "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

I tidigare versioner av OLE DB-leverantören orsakade denna kod att en implicit anslutning skapades vid den andra exekveringen eftersom endast en aktiv uppsättning resultat kunde öppnas per enskild anslutning. Eftersom den implicita anslutningen inte var poolad i OLE DB-anslutningspoolen skulle detta beteende orsaka extra overhead. Med MARS-funktionen som exponeras av OLE DB-drivrutinen för SQL Server får du flera aktiva resultat på samma anslutning.

Se även

Skapa program med OLE DB-drivrutin för SQL Server