Renvoie de donnée à une base MySQL
Salutations,
Je souhaite renvoyé des données issue d'un tableau Excel vers une base SQL, mais le code SQL que j'utilise ne fonctionne pas et affiche un message d'erreur sur l'incompatibilité de type pour ma dernier requête.
Sub test()
Dim I As Integer
Const Server = "LocalHost", Port = "3306", User = "root", Password = "": Dim DataBase
With CreateObject("ADODB.Connection")
.Open "Driver={MySQL ODBC 8.0 Unicode Driver};Server=" & Server & ";Port=" & Port & ";Database=" & DataBase & ";User=" & User & ";Password=" & Password & ";"
requete = "CREATE DATABASE IF NOT EXISTS `vbamysql` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
.Execute requete
.Close
DataBase = "vbamysql"
.Open "Driver={MySQL ODBC 8.0 Unicode Driver};Server=" & Server & ";Port=" & Port & ";Database=" & DataBase & ";User=" & User & ";Password=" & Password & ";"
requete = "CREATE TABLE IF NOT EXISTS `voitures`" & vbCrLf & _
"(`id` INTEGER NOT NULL auto_increment,`marque` VARCHAR(25) NOT NULL,`modele` VARCHAR(25) NOT NULL ,`cv` INTEGER," & vbCrLf & _
"PRIMARY KEY (`id`),UNIQUE (`modele`)) ENGINE = InnoDB ;"
.Execute requete
.Close
For I = 1 To 6
a0 = ThisWorkbook.Sheets("traitement").Cells(I, 1).Value
a1 = ThisWorkbook.Sheets("traitement").Cells(I, 2).Value
a2 = ThisWorkbook.Sheets("traitement").Cells(I, 3).Value
a3 = ThisWorkbook.Sheets("traitement").Cells(I, 4).Value
DataBase = "vbamysql1"
.Open "Driver={MySQL ODBC 8.0 Unicode Driver};Server=" & Server & ";Port=" & Port & ";Database=" & DataBase & ";User=" & User & ";Password=" & Password & ";"
requete = "INSERT INTO voitures(id, marque, modele, cv) VALUES(" & _
a0 & ",'" & _
a1 & "', '" & _
a2 & "', " & _
a3 & ")"
.Execute requete
Next
.Close
End With
End Subbonsoir,
2 remarques/suggestions
- la référence à vbamysql puis vbamysql1 est-elle voulue ?
- le contenu de id est en principe géré par mysql (auto increment) et donc il ne faut pas lui assigner de valeur et le supprimer de l'instruction insert.
Bonjour à tous,
Tiens, du code qui me rappelle qqchose ...
Sur ma page le code proposé est fonctionnel à 100% =>
http://tatiak.canalblog.com/archives/2014/04/06/29605283.html
@H2So4 : à partir d'excel l'auto-incrément d'un Id d'une table MySql n'est pas opérant, il convient de le faire "manuellement" par exemple avec un SELECT MAX(`Id`)+1
Pierre
@pierrep56,
@H2So4 : à partir d'excel l'auto-incrément d'un Id d'une table MySql n'est pas opérant, il convient de le faire "manuellement" par exemple avec un SELECT MAX(`Id`)+1
Merci Pierre pour cette info ! j'ai encore appris quelque chose, ;o)
Bonjour,
Id est auto-incrément soit tu connais sa valeur dans a0 soit tu laisse MySql le gérer dans ce cas tu supprimes ID de ta requête!
Dim a0 As String, a1 As String, a2 As String, a3 As String
For I = 1 To 6
a0 = ThisWorkbook.Sheets("traitement").Cells(I, 1).Value
a1 = ThisWorkbook.Sheets("traitement").Cells(I, 2).Value
a2 = ThisWorkbook.Sheets("traitement").Cells(I, 3).Value
a3 = ThisWorkbook.Sheets("traitement").Cells(I, 4).Value
requete = "INSERT INTO voitures(id, marque, modele, cv) VALUES(" & _
TrouveTypeSql(a0) & "," & _
TrouveTypeSql(a1) & "," & _
TrouveTypeSql(a2) & "," & _
TrouveTypeSql(a3) & ")"
.Execute requete
Next
.Close
End With
End Sub
Function TrouveTypeSql(V)
TrouveTypeSql = Trim("" & V)
If Trim("" & TrouveTypeSql) = "" Then TrouveTypeSql = "Null": Exit Function
If IsDate(TrouveTypeSql) = True And InStr(TrouveTypeSql, "/") <> 0 And InStr(TrouveTypeSql, ":") <> 0 Then TrouveTypeSql = "'" & Format(TrouveTypeSql, "yyyy-mm-dd hh:mm") & "'": Exit Function
If IsDate(TrouveTypeSql) = True And InStr(TrouveTypeSql, "/") <> 0 Then TrouveTypeSql = "'" & Format(TrouveTypeSql, "yyyy-mm-dd") & "'": Exit Function
If IsNumeric(Replace(TrouveTypeSql, ".", ",")) = True Then TrouveTypeSql = Replace(TrouveTypeSql, ",", "."): Exit Function
TrouveTypeSql = "'" & Replace(TrouveTypeSql, "'", "''") & "'"
End FunctionAlors h2so4 merci pour ton aide il y avait une erreur sur la désignation de vbamysql. J'ai modifier ma base de données Excel pour faire correspondre les deux bases bases de données. Quant à ton code Dysorthographie
Sub test2()
Dim I As Integer
Dim a0 As String, a1 As String, a2 As String, a3 As String
Const Server = "LocalHost", Port = "3306", User = "root", Password = "": Dim DataBase
With CreateObject("ADODB.Connection")
For I = 1 To 10
a0 = ThisWorkbook.Sheets("traitement").Cells(I, 1).Value
a1 = ThisWorkbook.Sheets("traitement").Cells(I, 2).Value
a2 = ThisWorkbook.Sheets("traitement").Cells(I, 3).Value
a3 = ThisWorkbook.Sheets("traitement").Cells(I, 4).Value
DataBase = "vbamysql"
.Open "Driver={MySQL ODBC 8.0 Unicode Driver};Server=" & Server & ";Port=" & Port & ";Database=" & DataBase & ";User=" & User & ";Password=" & Password & ";"
requete = "INSERT INTO voitures( id,marque, modele, cv) VALUES(" & _
TrouveTypeSql(a0) & "," & _
TrouveTypeSql(a1) & "," & _
TrouveTypeSql(a2) & "," & _
TrouveTypeSql(a3) & ")"
.Execute requete
.Close
Next
End With
End Sub
Function TrouveTypeSql(V)
TrouveTypeSql = Trim("" & V)
If Trim("" & TrouveTypeSql) = "" Then TrouveTypeSql = "Null": Exit Function
If IsDate(TrouveTypeSql) = True And InStr(TrouveTypeSql, "/") <> 0 And InStr(TrouveTypeSql, ":") <> 0 Then TrouveTypeSql = "'" & Format(TrouveTypeSql, "yyyy-mm-dd hh:mm") & "'": Exit Function
If IsDate(TrouveTypeSql) = True And InStr(TrouveTypeSql, "/") <> 0 Then TrouveTypeSql = "'" & Format(TrouveTypeSql, "yyyy-mm-dd") & "'": Exit Function
If IsNumeric(Replace(TrouveTypeSql, ".", ",")) = True Then TrouveTypeSql = Replace(TrouveTypeSql, ",", "."): Exit Function
TrouveTypeSql = "'" & Replace(TrouveTypeSql, "'", "''") & "'"
End Functionque j'ai intégré, Visual Basic m'affiche un message d'erreur sur une histoire de duplicata sur la clé primaire, j'ai essaie avec et sans id, ça ne change rien et lorsque j'insère un INGRORE c'est la galère.
Id est auto-incrément donc risque de doublon de clé primaire mais c'est ton code qui en est la code pas le miens
a0 = ThisWorkbook.Sheets("traitement").Cells(I, 1).Value
a1 = ThisWorkbook.Sheets("traitement").Cells(I, 2).Value
a2 = ThisWorkbook.Sheets("traitement").Cells(I, 3).Value
a3 = ThisWorkbook.Sheets("traitement").Cells(I, 4).Valuerequete = "INSERT INTO voitures( marque, modele, cv) VALUES(" & _
TrouveTypeSql(a1) & "," & _
TrouveTypeSql(a2) & "," & _
TrouveTypeSql(a3) & ")"
.Execute requetesans id
Pourtant le code SQL fonctionne sur PhpMyAdmin
bonjour,
dans la création de la DB tu as indiqué que modèle est une clé unique (il ne peut donc pas y avoir de double pour ce champ) ce que t'indiques le message d'erreur. (lignes 1,2 et 4,5 de ton excel si j'ai bien lu ta copie d'écran).
Bonjour,
En fait ma première proposition fonctionne c'est t'a création de table qu'il faut revoir si tu as plusieurs fois le même modèle !
tu peux définir une clé non unique si tu veux indexer le champ modèle.
Alors en effet, le problème venait de la propriété Unique , en récrivant le code pour le supprimé, les valeur transite d'une base à l'autre.
Sub testcv()
Dim I As Integer
Const Server = "LocalHost", Port = "3306", User = "root", Password = "": Dim DataBase
With CreateObject("ADODB.Connection")
.Open "Driver={MySQL ODBC 8.0 Unicode Driver};Server=" & Server & ";Port=" & Port & ";Database=" & DataBase & ";User=" & User & ";Password=" & Password & ";"
requete = "CREATE DATABASE IF NOT EXISTS `vbamysql2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
.Execute requete
.Close
DataBase = "vbamysql2"
.Open "Driver={MySQL ODBC 8.0 Unicode Driver};Server=" & Server & ";Port=" & Port & ";Database=" & DataBase & ";User=" & User & ";Password=" & Password & ";"
requete = "CREATE TABLE IF NOT EXISTS `voitures`" & vbCrLf & _
"(`id` INTEGER NOT NULL auto_increment,`marque` VARCHAR(25) NOT NULL,`modele` VARCHAR(25) NOT NULL ,`cv` INTEGER," & vbCrLf & _
"PRIMARY KEY (`id`)) ENGINE = InnoDB ;"
.Execute requete
.Close
For I = 1 To 10
a0 = ThisWorkbook.Sheets("traitement").Cells(I, 1).Value
a1 = ThisWorkbook.Sheets("traitement").Cells(I, 2).Value
a2 = ThisWorkbook.Sheets("traitement").Cells(I, 3).Value
a3 = ThisWorkbook.Sheets("traitement").Cells(I, 4).Value
DataBase = "vbamysql2"
.Open "Driver={MySQL ODBC 8.0 Unicode Driver};Server=" & Server & ";Port=" & Port & ";Database=" & DataBase & ";User=" & User & ";Password=" & Password & ";"
requete = "INSERT INTO voitures( marque, modele, cv) VALUES(" & _
TrouveTypeSql(a1) & "," & _
TrouveTypeSql(a2) & "," & _
TrouveTypeSql(a3) & ")"
.Execute requete
.Close
Next
End With
End Sub
Function TrouveTypeSql(V)
TrouveTypeSql = Trim("" & V)
If Trim("" & TrouveTypeSql) = "" Then TrouveTypeSql = "Null": Exit Function
If IsDate(TrouveTypeSql) = True And InStr(TrouveTypeSql, "/") <> 0 And InStr(TrouveTypeSql, ":") <> 0 Then TrouveTypeSql = "'" & Format(TrouveTypeSql, "yyyy-mm-dd hh:mm") & "'": Exit Function
If IsDate(TrouveTypeSql) = True And InStr(TrouveTypeSql, "/") <> 0 Then TrouveTypeSql = "'" & Format(TrouveTypeSql, "yyyy-mm-dd") & "'": Exit Function
If IsNumeric(Replace(TrouveTypeSql, ".", ",")) = True Then TrouveTypeSql = Replace(TrouveTypeSql, ",", "."): Exit Function
TrouveTypeSql = "'" & Replace(TrouveTypeSql, "'", "''") & "'"
End FunctionAlors Merci encore dysorthographie et h2so4

