Condividi tramite


Uso di ADO con SQL Server Native Client

Per sfruttare le nuove funzionalità introdotte in SQL Server 2005, ad esempio più set di risultati attivi (MARS), notifiche di query, tipi definiti dall'utente o il nuovo tipo di dati xml , le applicazioni esistenti che usano ActiveX Data Objects (ADO) devono usare il provider OLE DB di SQL Server Native Client come provider di accesso ai dati.

Se non è necessario usare alcuna delle nuove funzionalità introdotte in SQL Server 2005, non è necessario usare il provider OLE DB di SQL Server Native Client; è possibile continuare a usare il provider di accesso ai dati corrente, che in genere è SQLOLEDB. Se si migliora un'applicazione esistente ed è necessario usare le nuove funzionalità introdotte in SQL Server 2005, è consigliabile usare il provider OLE DB di SQL Server Native Client.

Annotazioni

Se si sviluppa una nuova applicazione, è consigliabile usare ADO.NET e il provider di dati .NET Framework per SQL Server anziché SQL Server Native Client per accedere a tutte le nuove funzionalità delle versioni recenti di SQL Server. Per altre informazioni sul provider di dati .NET Framework per SQL Server, vedere la documentazione di .NET Framework SDK per ADO.NET.

Per consentire ad ADO di usare nuove funzionalità delle versioni recenti di SQL Server, sono stati apportati alcuni miglioramenti al provider OLE DB di SQL Server Native Client che estende le funzionalità di base di OLE DB. Questi miglioramenti consentono alle applicazioni ADO di usare le funzionalità di SQL Server più recenti e di utilizzare due tipi di dati introdotti in SQL Server 2005: xml e udt. Questi miglioramenti sfruttano anche i miglioramenti apportati ai tipi di dati varchar, nvarchar e varbinary . SQL Server Native Client aggiunge la proprietà di inizializzazione SSPROP_INIT_DATATYPECOMPATIBILITY alla proprietà DBPROPSET_SQLSERVERDBINIT impostata per l'uso da parte delle applicazioni ADO in modo che i nuovi tipi di dati vengano esposti in modo compatibile con ADO. Inoltre, il provider OLE DB di SQL Server Native Client definisce anche una nuova parola chiave della stringa di connessione denominata DataTypeCompatibility impostata nella stringa di connessione.

Annotazioni

Le applicazioni ADO esistenti possono accedere e aggiornare valori xml, UDT e valori di testo e campo binario di grandi dimensioni usando il provider SQLOLEDB. I nuovi tipi di dati varchar(max), nvarchar(max)e varbinary(max) vengono restituiti rispettivamente come tipi ADO adLongVarChar, adLongVarWChar e adLongVarBinary . Le colonne XML vengono restituite come adLongVarChar e le colonne UDT vengono restituite come adVarBinary. Tuttavia, se si usa il provider OLE DB di SQL Server Native Client (SQLNCLI11) anziché SQLOLEDB, è necessario assicurarsi di impostare la DataTypeCompatibility parola chiave su "80" in modo che i nuovi tipi di dati vengano mappati correttamente ai tipi di dati ADO.

Abilitazione di SQL Server Native Client da ADO

Per abilitare l'utilizzo di SQL Server Native Client, le applicazioni ADO dovranno implementare le parole chiave seguenti nelle stringhe di connessione:

  • Provider=SQLNCLI11

  • DataTypeCompatibility=80

Per altre informazioni sulle parole chiave della stringa di connessione ADO supportate in SQL Server Native Client, vedere Uso delle parole chiave delle stringhe di connessione con SQL Server Native Client.

Di seguito è riportato un esempio di definizione di una stringa di connessione ADO completamente abilitata per l'uso con SQL Server Native Client, inclusa l'abilitazione della funzionalità 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  

Esempi

Le sezioni seguenti forniscono esempi di come usare ADO con il provider OLE DB di SQL Server Native Client.

Recupero di dati di colonna XML

In questo esempio viene usato un recordset per recuperare e visualizzare i dati da una colonna XML nel database di esempio AdventureWorks di 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  

Annotazioni

Il filtro recordset non è supportato con le colonne XML. Se usato, verrà restituito un errore.

Recupero dei dati della colonna UDT

In questo esempio viene usato un oggetto Command per eseguire una query SQL che restituisce un tipo definito dall'utente, i dati definiti dall'utente vengono aggiornati e quindi i nuovi dati vengono inseriti di nuovo nel database. In questo esempio si presuppone che il tipo definito dall'utente del punto sia già stato registrato nel database.

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  

Abilitazione e uso di MARS

In questo esempio la stringa di connessione viene costruita per abilitare MARS tramite il provider OLE DB di SQL Server Native Client e quindi vengono creati due oggetti recordset per l'esecuzione usando la stessa connessione.

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  

Nelle versioni precedenti del provider OLE DB, questo codice provocherebbe la creazione di una connessione implicita nella seconda esecuzione perché è possibile aprire un solo set attivo di risultati per ogni singola connessione. Poiché la connessione implicita non è stata inserita in pool nel pool di connessioni OLE DB, ciò comporta un sovraccarico aggiuntivo. Con la funzionalità MARS esposta dal provider OLE DB di SQL Server Native Client, si ottengono più risultati attivi su una connessione.

Vedere anche

Compilazione di applicazioni con SQL Server Native Client