Usando o ADO com SQL Server Native Client

Para usufruir os novos recursos introduzidos no SQL Server 2005 como, por exemplo, MARS (vários conjuntos de resultados ativos), notificações de consulta, UDTs (tipos definidos pelo usuário) ou o novo tipo de dados xml, os aplicativos existentes que usam ADO (ActiveX Data Objects) devem usar o provedor OLE DB do SQL Server Native Client como provedor de acesso a dados.

Caso você não precise usar nenhum dos novos recursos introduzidos no SQL Server 2005, não há necessidade de usar o provedor de dados OLE DB do SQL Server Native Client. É possível continuar usando o provedor de acesso a dados atual, normalmente SQLOLEDB. Caso esteja aperfeiçoando um aplicativo existente e precise usar os novos recursos introduzidos no SQL Server 2005, você deve usar o provedor de dados OLE DB do SQL Server Native Client.

ObservaçãoObservação

Caso você esteja desenvolvendo um novo aplicativo, é recomendável considerar o uso do ADO.NET e do provedor de dados .NET Framework do SQL Server, e não o SQL Server Native Client, para acessar todos os novos recursos de versões recentes do SQL Server. Para obter mais informações sobre o provedor de dados .NET Framework do SQL Server, consulte a documentação do SDK do .NET Framework referente ao ADO.NET.

Para permitir que o ADO use os novos recursos de versões recentes do SQL Server, foram feitas algumas melhorias no provedor de dados OLE DB do SQL Server Native Client, 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: xml e udt. Elas também exploram melhorias feitas nos tipos d dados varchar, nvarchar e varbinary. O SQL Server Native Client adiciona a propriedade de inicialização SSPROP_INIT_DATATYPECOMPATIBILITY ao conjunto de propriedades DBPROPSET_SQLSERVERDBINIT a ser usado por aplicativos do ADO para que os novos tipos de dados sejam expostos de maneira compatível com o ADO. Além disso, o provedor de dados OLE DB do SQL Server Native Client também define uma nova palavra-chave de cadeia de conexão chamada DataTypeCompatibility definida na cadeia de conexão.

ObservaçãoObservaçã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 varchar(max) e nvarchar(max) maiores, além dos tipos de dados varbinary(max) 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 provedor de dados OLE DB do SQL Server (SQLNCLI10) 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.

Habilitando o SQL Server Native Client no ADO

Para habilitar o uso do SQL Server Native Client, os aplicativos do ADO deverão implementar as seguintes palavras-chave nas cadeias de conexão:

  • Provider=SQLNCLI10

  • DataTypeCompatibility=80

Para obter mais informações sobre as palavras-chave da cadeia de conexão ADO para as quais há suporte no SQL Server Native Client, consulte Usando palavras-chave da cadeia de conexão com o SQL Server Native Client.

Este é um exemplo do estabelecimento de uma cadeia de conexão ADO totalmente habilitada para funcionar com o SQL Server Native Client, inclusive a habilitação do recurso MARS:

Dim con As New ADODB.Connection

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

Exemplos

As seguintes seções fornecem exemplos de como é possível usar o ADO com o provedor OLE DB do SQL Server Native Client.

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 SQL ServerAdventureWorks.

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

con.ConnectionString = "Provider=SQLNCLI10;" _
         & "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
ObservaçãoObservaçã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 uma UDT, os dados da UDT são atualizados e os novos dados são inseridos novamente no banco de dados. Este exemplo supõe que a UDT Point já tenha sido registrada 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=SQLNCLI10;" _
         & "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

Habilitando e usando MARS

Neste exemplo, a cadeia de conexão é criada para habilitar MARS por meio do provedor de dados OLE DB do SQL Server Native Client, e 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=SQLNCLI10;" _
         & "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

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, isso causaria uma sobrecarga adicional. Com o recurso MARS exposto pelo provedor de dados OLE DB do SQL Server Native Client, você obtém vários resultados ativos na conexão.