VBA – Y at-il une bibliothèque pour l'interaction VBA avec SQL Server

Bonjour les gens sympathiques! Ma question est un peu générale, si quelque chose comme ça existe. J'écris une application Excel, qui interagit avec SQL Server. C'est ce que j'ai écrit jusqu'à maintenant, juste pour imiter la command INSERT – str_generate_order Je dois écrire des choses similaires pour chaque command.


Ma question est la suivante : y a-t-il une bibliothèque qui a déjà fait ses preuves et qui a été testée pour faciliter la tâche? Je ne veux vraiment pas réinventer l'eau chaude et la tester. Je parle de la fonction str_generate_order de mon code. Le code fonctionne assez bien, vous devez simplement spécifier votre propre str_connection_ssortingng , qui vous connecte à une database. Prety, j'ai besoin de quelque chose comme une librairie Python (dont je ne me souviens plus du nom), où tu donnes simplement les noms des colonnes et la command et ça fait le rest pour toi … Ou devrais-je le build tout seul?

 Option Explicit Public Sub GenerateDataIntoTable() Dim str_table_name As Ssortingng: str_table_name = "Main" Dim arr_column_names As Variant Dim arr_values As Variant ReDim arr_column_names(6) ReDim arr_values(6) arr_column_names(0) = "UserName" arr_column_names(1) = "CurrentDate" arr_column_names(2) = "CurrentTime" arr_column_names(3) = "CurrentLocation" arr_column_names(4) = "Status1" arr_column_names(5) = "Status2" arr_column_names(6) = "Status3" arr_values(0) = Environ("username") arr_values(1) = Date arr_values(2) = Time arr_values(3) = Application.ActiveWorkbook.FullName arr_values(4) = make_random(2, 6) arr_values(5) = arr_values(4) + make_random(2, 6) arr_values(6) = arr_values(5) - make_random(2, 6) Debug.Print b_insert_into_table(str_table_name, arr_column_names, arr_values) End Sub Function b_insert_into_table(str_table_name As Ssortingng, arr_column_names As Variant, arr_values As Variant) As Boolean Dim conn As Object Dim str_order As Ssortingng Set conn = CreateObject("ADODB.Connection") conn.Open str_connection_ssortingng str_order = "insert into dbo." & str_table_name str_order = str_order & str_generate_order(arr_column_names, arr_values) conn.Execute str_order conn.Close Set conn = Nothing b_insert_into_table = True End Function Public Function str_generate_order(arr_column_names As Variant, arr_values As Variant) As Ssortingng Dim l_counter As Long Dim str_result As Ssortingng Dim str_left As Ssortingng: str_left = "('" Dim str_midd As Ssortingng: str_midd = "','" Dim str_right As Ssortingng: str_right = "')" str_result = "(" For l_counter = LBound(arr_column_names) To UBound(arr_column_names) str_result = str_result & arr_column_names(l_counter) & "," Next l_counter str_result = Left(str_result, Len(str_result) - 1) str_result = str_result & ")" str_result = str_result & "values" str_result = str_result & str_left For l_counter = LBound(arr_values) To UBound(arr_values) str_result = str_result & arr_values(l_counter) If l_counter < UBound(arr_values) Then str_result = str_result & str_midd Else str_result = str_result & str_right End If Next l_counter str_generate_order = str_result End Function 

Voir Matérialisation de toute requête ADODB , Création de parameters ADODB à la volée , et si vous voulez pousser, alors voir YARPI: Encore une autre implémentation de model de repository et UnitOfWork, une excuse pour plusieurs référentiels , le tout sur l'échange de stack de révision de code SqlCommand pendant trois ans depuis que je l'ai écrit, et il n'a pas encore échoué.

Je l'ai aussi mis sur GitHub

Oh, et il a été écrit en vb6 pour interagir avec sql-server , mais il fonctionne aussi bien en vba pour interagir avec mysql – il suffit de lui donner une string provider / connection et si ADODB peut le gérer, ça devrait "fonctionner".

Usage

Sélection d'une seule valeur avec une connection unique:

 Dim result As Variant SqlCommand.ConnectionSsortingng = "connection ssortingng" result = SqlCommand.SelectSingleValue("SELECT SomeField FROM SomeTable WHERE SomeValue = ?", 123) 

Sélection d'un set de résultats avec une connection en direct (pour prendre en charge les transactions):

 Dim cmd As New SqlCommand Dim result As ADODB.Recordset Dim conn As New ADODB.Connection conn.ConnectionSsortingng = "connection ssortingng" conn.Open Set result = cmd.Execute(conn, "SELECT * FROM SomeTable WHERE SomeField = ?", 123) 'use result result.Close conn.Close 

Exécuter SQL paramétré et passer une connection (pour supporter les transactions):

 Dim cmd As New SqlCommand Dim conn As New ADODB.Connection Dim result As Boolean conn.ConnectionSsortingng = "connection ssortingng" conn.Open result = cmd.ExecuteNonQuery(conn, "UPDATE SomeTable SET SomeField = ? WHERE SomeValue = ?", 123, "abc") conn.Close 

La class SqlCommand détermine les parameters ADODB à générer, les génère ainsi qu'une command ADODB paramétrée.

Si vous utilisez ADO c'est la voie à suivre.

Cependant, vous pouvez l'utiliser plus judicieusement. Vous pouvez toujours créer des insertions dynamics, mais vous devez les paramétrer. Les trucs de SQL Injection ne concernent pas seulement les users malveillants qui font de mauvaises choses avec votre database (ce qui est peu probable si vous créez un complément Excel), mais plus encore pour vous protéger contre datatables erronées. De la façon dont il est écrit maintenant, si vous avez une input non dans arr_values avec un " votre requête sera arr_column_names vous avez une colonne dans arr_column_names avec un espace, la requête va casser.

Pour répondre directement à la question, il n'y a pas de bibliothèque spécifique que vous pouvez referencer pour effectuer des requêtes SQL. Vous devriez rouler votre propre efficacement en utilisant des commands ADO et comme indiqué, il pourrait être sujet à des problèmes SQLi. Vous devrez vous assurer que vous validez et manipulez les inputs avec soin.