Usando o ADO com SQL Server Native Client

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)

Importante

O SQL Server Native Client (geralmente abreviado como SNAC) foi removido do SQL Server 2022 (16.x) e do SSMS (SQL Server Management Studio) 19. O SQL Server Native Client (SQLNCLI ou SQLNCLI11) e o Provedor OLE DB herdado da Microsoft para o SQL Server (SQLOLEDB) não são recomendados para um novo desenvolvimento de aplicativo. Alterne para o novo Driver do Microsoft OLE DB para SQL Server (MSOLEDBSQL) ou o Microsoft ODBC Driver for SQL Server mais recente no futuro. Para SQLNCLI que é fornecido como um componente do Mecanismo de Banco de Dados do SQL Server (versões 2012 a 2019), consulte esta exceção de Ciclo de Vida de Suporte.

Para aproveitar os novos recursos introduzidos no SQL Server 2005 (9.x), como 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 OLE DB (ActiveX Data Objects) devem usar o provedor OLE DB SQL Server Native Client como provedor de acesso a dados.

Se você não precisar usar nenhum dos novos recursos introduzidos no SQL Server 2005 (9.x), não será necessário usar o provedor OLE DB SQL Server Native Client; você pode continuar usando seu provedor de acesso a dados atual, que normalmente é SQLOLEDB. Se você estiver aprimorando um aplicativo existente e precisar usar os novos recursos introduzidos no SQL Server 2005 (9.x), deverá usar SQL Server Native Client provedor OLE DB.

Observação

Se você estiver desenvolvendo um novo aplicativo, é recomendável que você considere usar ADO.NET e o provedor de dados .NET Framework para SQL Server em vez de SQL Server Native Client para acessar todos os novos recursos das versões recentes do SQL Server. Para obter mais informações sobre o provedor de dados .NET Framework para SQL Server, consulte a documentação do SDK do .NET Framework para ADO.NET.

Para permitir que o ADO use novos recursos de versões recentes do SQL Server, alguns aprimoramentos foram feitos no provedor OLE DB 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 (9.x): xml e udt. Essas melhorias também exploram as melhorias feitas nos tipos de dados varchar, nvarchar e varbinary. SQL Server Native Client adiciona a propriedade de inicialização SSPROP_INIT_DATATYPECOMPATIBILITY à propriedade DBPROPSET_SQLSERVERDBINIT definida para uso por aplicativos ADO para que os novos tipos de dados sejam expostos de maneira compatível com o ADO. Além disso, o provedor OLE DB do SQL Server Native Client também define uma nova cadeia de conexão palavra-chave 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, se você usar o provedor SQL Server Native Client OLE DB (SQLNCLI11) em vez de SQLOLEDB, precisará definir o 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 de SQL Server Native Client, os aplicativos ADO precisarão implementar as seguintes palavras-chave em suas cadeias de conexão:

  • Provider=SQLNCLI11

  • DataTypeCompatibility=80

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

Veja a seguir um exemplo de como estabelecer uma cadeia de conexão do ADO totalmente habilitada para trabalhar com SQL Server Native Client, incluindo a habilitação do recurso MARS:

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

Exemplos

As seções a seguir fornecem exemplos de como você pode 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 AdventureWorks do SQL Server.

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  

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=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  

Habilitando e usando MARS

Neste exemplo, a cadeia de conexão é construída para habilitar o MARS por meio do provedor OLE DB SQL Server Native Client 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=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  

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 SQL Server Native Client provedor OLE DB, você obtém vários resultados ativos em uma conexão.

Consulte Também

Criando aplicativos com o SQL Server Native Client