Comment accéder à SQL Server à partir de VBA d'une manière non-dépréciée?
Il semble que tous les moyens, d'accéder directement à une base de données SQL Server à partir d'un projet VBA ont été dépréciés:
- DAO avec ODBCDirect: le Support a été abandonné avec Access 2007.
- DAO via JET: vous n'êtes pas sérieux, non? De toute façon, c'est considérés comme obsolètes par Microsoft.
- ADO avec le fournisseur SQLOLEDB: Deprecated.
- ADO with the SQL Server Native OLEDB provider:ne sera pas pris en charge après SQL Sever 2012.
- ADO with the Microsoft OLE DB provider for ODBC: non supporté: "SQL Server Native Client is not supported from the Microsoft OLE DB provider for ODBC (MSDASQL)."
Qu'ai-je manqué? Quelle est la façon officielle, approuvée par Microsoft, d'accéder à une base de données SQL Server à partir de VBA (qui est, après tout, déprécié et toujours le langage de développement officiel inclus avec le bureau 2013)?
3 réponses
Qu'ai-je manqué?
le bon vieux ODBC. Dans les projets VBA pour les applications de bureau autres que L'accès, ODBC via ADO est le plus simple:
Sub AdoOdbcExample()
Dim con As Object
Set con = CreateObject("ADODB.Connection")
con.Open _
"Driver={SQL Server Native Client 11.0};" & _
"Server=.\SQLEXPRESS;" & _
"Database=myDb;" & _
"Trusted_Connection=yes;"
con.Execute "UPDATE Clients SET FirstName='Gord' WHERE ID=5;"
con.Close
Set con = Nothing
End Sub
pour les projets VBA dans Access, nous avons aussi la possibilité D'utiliser les tables liées ODBC et les requêtes pass-through via ACE DAO comme nous avons toujours
Sub DaoOdbcExample()
Dim cdb As DAO.Database, qdf As DAO.QueryDef
Set cdb = CurrentDb
Set qdf = cdb.CreateQueryDef("")
qdf.Connect = "ODBC;" & _
"Driver={SQL Server Native Client 11.0};" & _
"Server=.\SQLEXPRESS;" & _
"Database=myDb;" & _
"Trusted_Connection=yes;"
qdf.sql = "UPDATE Clients SET FirstName='Gord' WHERE ID=5;"
qdf.ReturnsRecords = False
qdf.Execute dbFailOnError
Set qdf = Nothing
Set cdb = Nothing
End Sub
Notes:
SQL Server Native Client 11.0 est la version fournie avec SQL Server 2014 (réf: ici).
La cité de la liste des Technologies D'Accès Aux Données Désuètes dit " DAO 3.6 est la version finale de cette technologie. Il ne sera pas disponible sur le système d'exploitation Windows 64-bit.". Qui se rapporte à Jet DAO ("Microsoft DAO 3.6 Object Library"). ACE DAO ("Microsoft Office 14.0 Access database engine Object Library") est en effet disponible pour les applications 64 bits si la version 64 bits de L'accès Moteur de base de données est installé.
la façon correcte et future est d'utiliser le modèle D'objet ACE. Vous avez raison à 100% Sur le fait que la version native d'oleDB est supprimée du serveur SQL. Il est également très important de noter que la communauté de développeurs "générale" a commencé à abandonner ADO lorsque .net est sorti (le ado.net provider est une bête très différente et ne dépend pas d'oleDB, mais du sqlprovider).
c'est pour cette raison que des tendances significatives se produisent dans notre industrie.
nous nous éloignons d'oleDB. C'est dans général un windows uniquement de la technologie. Avec la montée des iPads, smartphones, Android etc, alors vous n'avez pas de fournisseurs spécifiques à ces plateformes et ils n'ont pas d'oleDB. Vous devez donc revenir vers L'utilisation de normes ouvertes de connectivité de base de données (ODBC). Oracle, Microsoft, MySQL ont tous déclaré que c'est la route et le choix du futur.
bien que JET soit considéré comme obsolète, ACE ne l'est pas.
depuis accès 2007( qui est maintenant entièrement 3 versions), vous n'avez pas et ne devriez pas avoir référence à DAO. Ainsi, pour les 3 dernières versions D'accès, vous n'avez pas besoin, vous ne voulez pas ou vous n'utilisez pas de référence à la bibliothèque d'objets DAO.
vous devez maintenant utiliser le nouveau moteur de base de données ACE. Cela signifie que vous n'avez pas besoin d'une référence séparée à DAO.
il y a plusieurs avantages au moteur ACE:
vous n'avez plus besoin de référence DAO.
une fois que la référence au moteur de données prend soin des deux références précédentes de la bibliothèque.
Il n' est à la fois une édition x32 et x64 bit disponible (applications so .net etc. pouvez utiliser un x 64 bits édition de ce moteur de données). JET n'était que x32 bit.
le fournisseur ACE continue de recevoir des mises à jour et des améliorations. On ne peut pas en dire autant du JET et de L'ADO.
ACE supporte maintenant les procédures de stockage et les déclencheurs de table. Il a également le soutien pour les listes de SharePoint qui est basé sur des services web.
des changements ont également été apportés à Access / ACE pour travailler avec SQL Azure.
pour utiliser L'accès avec SQL server, vous utilisez simplement ACE et les tables liées. Comme on l'a vu, la tendance à s'éloigner de L'ADO a commencé il y a environ 13 ans lorsque.net est apparu sur la scène.
ainsi L'approche standard et recommande maintenant est ACE + odbc.
donc vous n'avez rien manqué ici. La confusion provient en grande partie de l'article que state JET est déprécié, mais laisse ensuite de côté le détail très important que L'accès pour les 3 dernières versions n'utilise pas JET, mais utilise une nouvelle bibliothèque appelée ACE.
il est significatif que vous n'ayez plus besoin et que vous ne vouliez plus de référence à DAO dans vos applications d'accès.
vous utilisez certainement une bibliothèque DAO compatible, et il est même recommandé de préfixer votre code reocrdset avec DAO (donc l'ancien code existant fonctionnera très bien si vous avez fait cela dans le passé, ou si vous avez toujours laissé de côté le qualificatif DAO lors de la déclaration des recordsets.
et pour les choses comme sql passer si, vous simple pouvez utiliser enregistré transmettre la requête, et faire ceci:
CurrentDb.QueryDefs("MyPass").Execute
quid d'un t-sql, vous pouvez faire ceci:
With CurrentDb.QueryDefs("MyPass")
.SQL = "ALTER TABLE Contacts ADD MiddleName nvarchar(50) NULL"
.Execute
End If
ou appelez le magasin de votre choix "à la volée" avec un paramètre
With CurrentDb.QueryDefs("MyPass")
.SQL = "Exec MyStoreProc " & strMyParm1
.Execute
End If
ce qui précède n'est-il pas si beau et propre? Comme noté les exemples de code ci-dessus ont tendance à être beaucoup moins de code et de tracas alors en utilisant des exemples oleDB/ADO affichés.
pour les utilisateurs de longue date D'accès qui ont développé leurs compétences autour D'ODBC et sql serveur, vous n'avez pas à faire quoi que ce soit que l'industrie beaucoup décidé ce que vous avez fait tout au long est l'approche recommandée.
bien que JET-DIRECT ne soit pas supporté dans ACE, Je ne peux pas penser à n'importe quel cas où ce choix est manqué en utilisant les exemples de pass-though querydef comme ci-dessus à la place de JET direct.
Lors de l'initialisation d'un adodb.connexion en vba nous avons remplacé
.Provider = "sqloledb" .Properties("Data Source").Value = sServer .Properties("Initial Catalog").Value = sDB .Properties("Integrated Security").Value = "SSPI"
.ConnectionString = _ "DRIVER={ODBC Driver 11 for SQL Server}; " & _ "SERVER=" & sServer & "; " & _ "Trusted_Connection=Yes; " & _ "DATABASE=" & sDB & "; "
Qui utilise .Provider = " MSDASQL.1" mais vous n'avez pas à le rajouter.