Usar ADO com SQL Server Cliente Nativo

Aplica-se a: SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)

Importante

SQL Server Native Client (SNAC) não é fornecido com:

  • SQL Server 2022 (16.x) e versões posteriores
  • SQL Server Management Studio 19 e versões posteriores

O SQL Server Native Client (SQLNCLI ou SQLNCLI11) e o Microsoft OLE DB Provider for SQL Server (SQLOLEDB) herdado não são recomendados para o desenvolvimento de novos aplicativos.

Para novos projetos, use um dos seguintes drivers:

Para o SQLNCLI fornecido como componente do Mecanismo de Base de Dados do SQL Server (versões de 2012 a 2019), consulte esta exceção ao Ciclo de Vida de Suporte .

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 usar o fornecedor SQL Server Native Client OLE DB como fornecedor de acesso aos dados.

Se não precisar de usar nenhuma das novas funcionalidades introduzidas no SQL Server 2005 (9.x), não é necessário usar o fornecedor OLE DB do SQL Server Native Client; pode continuar a usar o seu fornecedor de acesso a dados atual, que normalmente é SQLOLEDB. Se estiver a melhorar uma aplicação existente e precisar de usar as novas funcionalidades introduzidas no SQL Server 2005 (9.x), deve usar o fornecedor OLE DB do SQL Server Native Client.

Note

Se estiver a desenvolver uma nova aplicação, recomenda-se que considere usar ADO.NET e o .NET Framework Data Provider for SQL Server em vez do SQL Server Native Client para aceder a todas as novas funcionalidades das versões recentes do SQL Server. Para mais informações sobre o .NET Framework Data Provider para SQL Server, consulte a documentação do SDK do .NET Framework para ADO.NET.

Para permitir que o ADO utilize novas funcionalidades das versões recentes do SQL Server, foram feitas algumas melhorias ao fornecedor OLE DB do SQL Server Native Client, 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 . SQL Server Cliente Nativo 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 fornecedor do SQL Server Native Client OLE DB também define uma nova palavra-chave de cadeia de ligação chamada DataTypeCompatibility que é definida na cadeia de ligação.

Note

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 usar o fornecedor SQL Server Native Client OLE DB (SQLNCLI11) em vez de SQLOLEDB, deve certificar-se de definir a palavra-chave DataTypeCompatibility para "80" para que os novos tipos de dados sejam corretamente mapeados para os tipos de dados ADO.

Ativação do SQL Server Cliente Nativo a partir do ADO

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

  • Provider=SQLNCLI11

  • DataTypeCompatibility=80

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

Segue-se um exemplo de como estabelecer uma cadeia de ligação ADO totalmente ativada para funcionar com o SQL Server Native Client, incluindo a ativação da funcionalidade 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  

Examples

As secções seguintes fornecem exemplos de como pode usar ADO com o fornecedor OLE DB do SQL Server Native Client.

Recuperação de Dados da Coluna 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=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  

Note

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

Recuperação de Dados da Coluna 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=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  

Ativação e Utilização do MARS

Neste exemplo, a cadeia de ligação é construída para permitir o MARS através do fornecedor SQL Server Native Client OLE DB, e depois dois objetos de registo são criados para executar usando a mesma ligaçã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 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 estava agrupada no pool de ligações OLE DB, isto causaria sobrecarga adicional. Com a funcionalidade MARS exposta pelo fornecedor OLE DB do SQL Server Native Client, obtém-se múltiplos resultados ativos numa só ligação.