Usar o ADO com o OLE DB Driver for SQL Server
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)
Para usufruir os novos recursos introduzidos no SQL Server 2005 (9.x) como, por exemplo, MARS (conjuntos de resultados ativos múltiplos), notificações de consulta, UDTs (tipos definidos pelo usuário) ou o novo tipo de dados xml, os aplicativos existentes que usam o ADO (ActiveX Data Objects) devem usar o OLE DB Driver for SQL Server como o provedor de acesso a dados.
Para permitir que o ADO use os novos recursos de versões recentes do SQL Server, foram feitas algumas melhorias no OLE DB Driver for SQL Server, que estende os principais recursos do OLE DB. Essas melhorias permitem que os aplicativos ADO usem recursos mais novos do SQL Server e consumam dois tipos de dados introduzidos no SQL Server 2005 (9.x): xml e udt. Essas melhorias também exploram as melhorias feitas nos tipos de dados varchar, nvarchar e varbinary. O OLE DB Driver for SQL Server adiciona a propriedade de inicialização SSPROP_INIT_DATATYPECOMPATIBILITY ao conjunto de propriedades DBPROPSET_SQLSERVERDBINIT a ser usada por aplicativos ADO, de modo que os novos tipos de dados sejam expostos de maneira compatível com o ADO. Além disso, o Driver do OLE DB para SQL Server também define uma nova palavra-chave de cadeia de conexão chamada DataTypeCompatibility definida na cadeia de conexão.
Observação
Os aplicativos do ADO existentes podem acessar e atualizar valores de XML, UDT, de campo binário e de texto grandes usando o provedor SQLOLEDB. Os novos tipos de dados varchar(max) , nvarchar(max) e varbinary(max) maiores são retornados como tipos do ADO adLongVarChar, adLongVarWChar e adLongVarBinary, respectivamente. As colunas XML são retornadas como adLongVarChar, e as colunas UDT, como adVarBinary. No entanto, caso use o Driver do OLE DB para SQL Server (MSOLEDBSQL19 ou MSOLEDBSQL) em lugar do SQLOLEDB, você não pode se esquecer de definir a palavra-chave DataTypeCompatibility como "80" para que os novos tipos de dados sejam mapeados corretamente para os tipos de dados do ADO.
Como habilitar o Driver do OLE DB para SQL Server por meio do ADO
Para habilitar o uso do OLE DB Driver for SQL Server, os aplicativos ADO precisarão implementar as seguintes palavras-chave nas cadeias de conexão:
Provider=MSOLEDBSQL19
DataTypeCompatibility=80
Para saber mais sobre palavras-chave da cadeia de conexão do ADO com suporte no OLE DB Driver para SQL Server, confira Usar palavras-chave da cadeia de conexão com o OLE DB Driver para SQL Server.
O código a seguir é um exemplo do estabelecimento de uma cadeia de conexão ADO totalmente habilitada para funcionar com o OLE DB Driver for SQL Server, incluindo a habilitação do recurso 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
Exemplos
As seções a seguir fornecem exemplos de como é possível usar o ADO com o Driver do OLE DB para SQL Server.
Recuperando dados da coluna XML
Neste exemplo, um conjunto de registros é usado para recuperar e exibir os dados de uma coluna XML no banco de dados de exemplo AdventureWorks do SQL Server.
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
Não há suporte para a filtragem do conjunto de registros com colunas XML. Se ela for usada, será retornado um erro.
Recuperando dados da coluna UDT
Neste exemplo, um objeto Command é usado para executar uma consulta SQL que retorna um UDT, os dados UDT são atualizados e, em seguida, os novos dados são inseridos novamente no banco de dados. Este exemplo supõe que o UDT Point já foi registrado no banco 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
Habilitando e usando MARS
Neste exemplo, a cadeia de conexão é criada para habilitar o MARS por meio do OLE DB Driver for SQL Server e, em seguida, dois objetos de conjunto de registros são criados para serem executados usando a mesma conexã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 provedor OLE DB, esse código faria com que uma conexão implícita fosse criada na segunda execução porque apenas um conjunto de resultados ativo podia ser aberto por conexão. Como a conexão implícita não foi agrupada no pool de conexões OLE DB, esse comportamento causaria uma sobrecarga adicional. Com o recurso MARS exposto pelo OLE DB Driver for SQL Server, você obtém vários resultados ativos na única conexão.