Partilhar via


Usando o ADO com o driver OLE DB para SQL Server

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Base de dados SQL no Microsoft Fabric

Baixar driver OLE DB

Para tirar partido das novas funcionalidades introduzidas no SQL Server 2005 (9.x), como múltiplos conjuntos de resultados ativos (MARS), notificações de consulta, tipos definidos pelo utilizador (UDTs) ou o novo tipo de dado xml , as aplicações existentes que utilizam ActiveX Data Objects (ADO) devem utilizar o OLE DB Driver para SQL Server como fornecedor de acesso aos dados.

Para permitir que o ADO utilize novas funcionalidades das versões recentes do SQL Server, foram feitas algumas melhorias ao Driver OLE DB para SQL Server, que estende as funcionalidades principais do OLE DB. Estas melhorias permitem que aplicações ADO utilizem funcionalidades mais recentes do SQL Server e consumam dois tipos de dados introduzidos no SQL Server 2005 (9.x): xml e UDT. Estas melhorias também exploram melhorias nos tipos de dados varchar, nvarchar e varbinary . O OLE DB Driver para SQL Server adiciona a propriedade de inicialização SSPROP_INIT_DATATYPECOMPATIBILITY ao conjunto de propriedades DBPROPSET_SQLSERVERDBINIT para uso por aplicações ADO, de modo a que os novos tipos de dados sejam expostos de forma compatível com ADO. Além disso, o OLE DB Driver para SQL Server também define uma nova palavra-chave de string de ligação chamada DataTypeCompatibility que é definida na string de ligação.

Observação

As aplicações ADO existentes podem aceder e atualizar XML, UDT e valores de texto de grande valor e campos binários usando o fornecedor SQLOLEDB. Os novos tipos de dados maiores varchar(max), nvarchar(max) e varbinary(max) são devolvidos como os tipos ADO adLongVarChar, adLongVarWChar e adLongVarBinary , respetivamente. As colunas XML são devolvidas como adLongVarChar, e as colunas UDT são devolvidas como adVarBinary. No entanto, se usares o Driver OLE DB para SQL Server (MSOLEDBSQL19 ou MSOLEDBSQL) em vez de SQLOLEDB, tens de garantir que defines a palavra-chave DataTypeCompatibility para "80" para que os novos tipos de dados sejam mapeados corretamente para os tipos de dados ADO.

Ativação do Driver OLE DB para SQL Server a partir do ADO

Para permitir a utilização do OLE DB Driver para SQL Server, as aplicações ADO terão de implementar as seguintes palavras-chave nas suas strings de ligação:

  • Provider=MSOLEDBSQL19

  • DataTypeCompatibility=80

Para mais informações sobre as palavras-chave em cadeia de ligações ADO suportadas no OLE DB Driver para SQL Server, consulte Utilização de Palavras-chave de String de Ligação com o Driver OLE DB para SQL Server.

O código seguinte é um exemplo de como estabelecer uma cadeia de ligação ADO totalmente ativada para funcionar com o OLE DB Driver para SQL Server, incluindo a ativação da funcionalidade MARS:

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

As secções seguintes fornecem exemplos de como pode usar ADO com o Driver OLE DB para SQL Server.

Recuperação de dados de colunas XML

Neste exemplo, um conjunto de registos é usado para recuperar e exibir os dados de uma coluna XML na base de dados de exemplo SQL Server AdventureWorks .

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

Observação

A filtragem de conjuntos de registos não é suportada com colunas XML. Se for utilizado, será devolto um erro.

Recuperação de dados de colunas UDT

Neste exemplo, um objeto Command é usado para executar uma consulta SQL que devolve um UDT, os dados UDT são atualizados e depois os novos dados são inseridos novamente na base de datos. Este exemplo assume que o Point UDT já foi registado na base de dados.

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

Ativação e utilização do MARS

Neste exemplo, a cadeia de ligação é construída para permitir o MARS através do Driver OLE DB para SQL Server, e depois dois objetos de registo são criados para serem executados usando a mesma ligação.

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

Em versões anteriores do fornecedor OLE DB, este código causava a criação de uma ligação implícita na segunda execução porque apenas um conjunto ativo de resultados podia ser aberto por única ligação. Como a ligação implícita não era agrupada no pool de ligação OLE DB, este comportamento causava sobrecarga adicional. Com a funcionalidade MARS exposta pelo OLE DB Driver para SQL Server, obtém-se múltiplos resultados ativos numa só ligação.

Consulte também

Criando aplicativos com o driver OLE DB para SQL Server