Insertion de plusieurs valeurs dans une base de données SQL à partir d'EXCEL via VBA script
Juste essayer d'insérer des données à partir de 5 cellules par l'intermédiaire d'un script VBA, dans une colonne sur un serveur SQL 08 base de données.
Donc en gros, j'ai 1 table avec 4 colonnes, je veux insérer de multiples ensembles de données dans les colonnes à la fois, ce qui permettrait d'insérer des données dans la DB avec le résultat ci-dessous..
Server Name Middleware Version License
TEST6 Testing 1 1
TEST6 Testing1 1 1
TEST6 Testing2 1 1
TEST6 Testing3 1 1
Je sais que les valeurs ne sont pas correctes sur le code ci-dessous, mais je reçois le message d'erreur (ci-dessous le code vba) lorsque le VBA script est exécuté.
Dim val1 As String, val2 As String, val3 As String, val4 As String
val1 = Range("B126").Value
val2 = Range("C126").Value
val3 = Range("C127").Value
val4 = Range("D126").Value
conn.Open sConnString
Dim item As String
item4 = "INSERT INTO [IndustrialComp].[dbo].[Middleware]("
item4 = item4 & " [server_name],[middleware],[middlware],[version]"
item4 = item4 & " )Values("
item4 = item4 & " '" & val1 & "', '" & val2 & "', '" & val3 & "','" & val4 & "')"
conn.Execute item4
End Sub
Msg 264, Niveau 16, État 1, Ligne 1
Le nom de la colonne 'middleware' est spécifié plus d'une fois dans la clause SET. Une colonne ne peut pas être attribué plus d'une valeur dans la même clause SET. Modifier la clause SET pour s'assurer qu'une colonne est mise à jour qu'une seule fois. Si la clause SET mises à jour des colonnes de la vue, puis le nom de la colonne 'middleware' peut apparaître deux fois dans la définition de la vue.
Vous devez vous connecter pour publier un commentaire.
Je crois que les colonnes que vous spécifiez dans votre instruction INSERT sont dupliqués et donc pas correct.
Essayez:
Mise à jour:
Votre instruction SQL doit ressembler à ceci:
Donc, vous avez à répéter le bloc entre parenthèses pour chaque ligne que vous souhaitez insérer.
Cependant, désormais vous n'4 variables qui détiennent des 4 valeurs différentes dans votre solution, de sorte que vous ne sera jamais en mesure d'insérer ces 4 lignes différentes parce que vous ne sélectionnez des valeurs dans les cellules B126, C126, C127 et D126. Qui sera probablement la première ligne que vous souhaitez insérer? Ou voulez-vous ajouter le 1,2,3 pour
Testing
- vous et répétez avec les autres valeurs?Veuillez expliquer et de mettre à jour votre réponse en conséquence.
Je suis en supposant que les données dans Excel. Si si, juste une boucle sur les lignes. Aussi, il semble que votre val1, val2, etc. ne pas correspondre à l'exemple. Peut-être que vous avez voulu dire val3 être D126 et val4 être E126. Je vais supposer que. Voici le code corrigé:
Code non testé, mais il compile.
Si vous avez plusieurs lignes de données, il est beaucoup plus efficace pour insérer toutes les lignes en une seule fois en un seul appel à une procédure stockée. Pour ce faire, vous sérialiser vos données en xml et ensuite appeler une procédure stockée qui prend xml comme un paramètre de chaîne.
Autant que je sache, vous ne pouvez pas sérialiser un Dictionnaire, mais vous pouvez sérialiser une Liste.
Alors je vous suggère de faire une boucle par votre Dictionnaire (Liste de Dictionnaires) remplir une Liste avec les valeurs appropriées. J'ai tendance à utiliser des Structures pour cela, mais de simples classes fonctionnent très bien ainsi, par exemple:
Créer votre Liste et le remplissage d'e.g:
Maintenant pour le peu de magie pour sérialiser:
Avis ici, je suis dépouiller de l'en-tête du fichier xml qui vient d'être créé. C'est parce que je n'ai jamais été en mesure d'obtenir SQL Server fonctionner si l'en-tête a été incluse - vous pouvez probablement, je n'ai simplement jamais regardé assez dur.
Nous appeler la procédure stockée comme ça (évidemment modifier la chaîne de connexion à celui qui fonctionne pour vous):
De SQL Server la procédure ressemble à ceci:
Évidemment ici, vous aurez besoin de changer le ArrayOf à ce que vous appelez votre classe et bien sûr utiliser votre propre table.
Bien que j'ai montré ici, juste une simple paire clé/valeur, vous pouvez remplir un multi-colonne de la table exactement de la même manière.
Un point à noter: votre classe/structure doit être Public dans un module Public, sinon sérialiser ne fonctionnera pas. Aussi, si vous fournissez votre propre paramètre de constructeur pour une classe (comme moi), vous devez également fournir un sans paramètre, sinon de nouveau le sérialiseur objet.
HTH
Additif
Ce que j'ai oublié de mettre, pour la VB à travailler, vous devez: