[Catégorie modifiée .Net -> VB6] vb6 + mysql

StephRadio Messages postés 13 Date d'inscription mardi 18 décembre 2012 Statut Membre Dernière intervention 18 décembre 2012 - 2 nov. 2011 à 10:19
StephRadio Messages postés 13 Date d'inscription mardi 18 décembre 2012 Statut Membre Dernière intervention 18 décembre 2012 - 17 nov. 2011 à 09:59
Bonjour,

Je développe une application en vb6 et utilisant MySql, je rencontre un problème pour enregistrer des champs définis en "DOUBLE", en vb6 j'ai une virgule et dans MySql il faut un point. Les fonctions disponibles sous VB6 ( replace ) demande un string pour remplacer la virgule par le point mais dans ce cas ce n'est plus le même type.
Est-ce que quelque'un à la solution.

Merci

12 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
2 nov. 2011 à 12:01
Salut

C'est parce que VB6 tient compte de la régionalisation (règles sur virgule, milliers ...) pour afficher un chiffre en type Double.
Lors de la connexion à ta base MySQL, précises-tu la langue ?
Sous SQL Server, la propriété "Locale Identifier" que tu peux définir avant l'ouverture (1033=US, 1036=FR, ...) et qui permet de résoudre ce genre de problème.

Quel type de connexion utilises-tu ? ADODB ?
ADODB ? alors voir
monObjetConnexion.Properties("Locale Identifier") = 1036
avant de faire le monObjetConnexion.Connect

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
2 nov. 2011 à 12:03
Pas
monObjetConnexion.Connect
mais
monObjetConnexion.Open
pardon
0
StephRadio Messages postés 13 Date d'inscription mardi 18 décembre 2012 Statut Membre Dernière intervention 18 décembre 2012
2 nov. 2011 à 12:33
J'utilises ADODB
Je viens de faire un test il transforme bien, pas de problème pour mettre ce paramétrage, mais je pense que le pb ne venait pas de là car il m'indique une erreur dans la syntaxe Sql
J'ai codé comme ceci
dim oConn as new adodb.connection
dim oRs as new adodb.recordset
dim strSql as string
oConn.open IDS_CONN
strSql = "SELECT * FROM HH"
oRs.addnew
oRs("Date") = cdec(now)
oRs.update
oRs.close
oConn.close

Dans Mysql, le champ date est défini en double
Je travaille en parallèle avecAcces et les date sont sotckées en double et je ne veux pas faire deux traitements l'un pour acces et l'autre pour MySql.
Je ne vois pas la raison de cette erreur sous MySql mais c'est ce champ ( double car même avec 0 erreur ) car avec d'autres types cela se passe sans problème

Merci pour ton aide
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
2 nov. 2011 à 14:17
Manquerait bien quelque chose entre
strSql = "SELECT * FROM HH"
et
oRs.addnew
parce que, au moment du AddNew :
- ton RecordSet n'est pas raccordé à ta connexion,
- ton RecordSet est toujours vide.

Erreur : laquelle ?
Les autres champs acceptent-ils des Null ?
Parce que là, tu ne renseignes que la Date (*) et pas les autres champs.
(*) "Date" mauvaise idée d'appeler un champ du nom d'un mot réservé de langage.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
2 nov. 2011 à 14:19
Es-tu sûr que ta syntaxe
oRs("Date")
soit autorisée pour dire
oRs.Fields("Date").Value
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
2 nov. 2011 à 14:21
Pourquoi les mots clés n'ont-ils pas de majuscules ?
Si tu ne fais un réel copier-coller de ton code, cela peut engendrer de nouvelles erreurs et mal nous aiguiller ...

Pour coller du code afin qu'il soit plus lisible, merci d'utiliser la colorisation syntaxique = 3ème icone à droite
0
StephRadio Messages postés 13 Date d'inscription mardi 18 décembre 2012 Statut Membre Dernière intervention 18 décembre 2012
2 nov. 2011 à 14:36
Voici le code réel
Il fonctionne parfaitement bien sous Acces en VB6
J'ai apporté quelques modifications pour MySql à la fin pour connaitre l'ID qui a été utilisé pour créer cet enregistrement
Les autres champs sont définis soit à Null soit avec des valeurs par défaut.
J'ai également fait un test en ne mettant que le champ HAB_Date pour vérifier le problème

Merci



Private Sub Enregistrer()
Dim oConn As New ADODB.Connection
Dim oRs As New ADODB.Recordset
Dim strSql As String
Dim i As Integer
Dim dblDate As Double

If (EstValideDetail = True) Then
oConn.Properties("Locale Identifier") = 1036
oConn.Open IDS_CONN
If (mnNumHabillage = -1) Then
strSql = "SELECT * FROM HABILLAGE;"
Else
strSql "SELECT * FROM HABILLAGE WHERE ID_Habillage " & mnNumHabillage & ";"
End If
oRs.Open strSql, oConn, adOpenDynamic, adLockOptimistic
If (mnNumHabillage = -1) Then
oRs.AddNew
If nTypeBase = 0 Then
mnNumHabillage = UTILE_DonneNewID("HABILLAGE", "ID_Habillage")
oRs("ID_Habillage") = mnNumHabillage
If bNumAutoHab = True Then
ZE_CODE.Text = mnNumHabillage
End If
Else
If bNumAutoHab = True Then
ZE_CODE.Text = -1
End If
End If
oRs("HAB_IdRealisateur") = gIDUtilisateur
oRs("HAB_Date") = CDec(Now)
End If
'maj des champs
oRs("HAB_Code") = ZE_CODE.Text
oRs("HAB_Titre") = ZE_TITRE.Text
oRs("HAB_Realisateur") = "- AUCUN -"
oRs("HAB_NomSon") = ZE_AUDIO.Text
oRs("HAB_PeriodeDebut") = Right$(ZE_Periode_Debut.Text, 2) & Left$(ZE_Periode_Debut.Text, 2)
oRs("HAB_PeriodeFin") = Right$(ZE_Periode_Fin.Text, 2) & Left$(ZE_Periode_Fin.Text, 2)
oRs("HAB_DureeReelle") = numDureeFichierUtile
oRs("HAB_DureeFichier") = numDureeFichier
oRs("HAB_IDVoix") = UTILE_DonneItemDataSelectedCombo(ZL_VOIX)
oRs("HAB_IDType") = UTILE_DonneItemDataSelectedCombo(ZL_TYPES)
oRs("HAB_IdRealisateur") = UTILE_DonneItemDataSelectedCombo(ZL_REALISATEUR)
oRs("HAB_IDCategorie") = UTILE_DonneItemDataSelectedCombo(ZL_CATEGORIE)
'intensité
For i = 1 To 9
If ChkIntensite(i).Value = 1 Then
strIntensite = strIntensite & "1"
Else
strIntensite = strIntensite & "0"
End If
Next i
oRs("HAB_Intensite") = strIntensite
'informations diverses
oRs("HAB_EcartDiff") = CDec(ZE_EcartDiffusion.Value) - Int(CDec(ZE_EcartDiffusion.Value))
oRs("HAB_NbDiffJour") = VScrollNbDiffJour.Value
oRs("HAB_DateDebut") = CDec(ZE_Date_Debut.Value)
oRs("HAB_DateFin") = CDec(ZE_Date_Fin.Value)
If pNbFreq = 1 Then
oRs("HAB_Frequence1") = "1"
Else
If strAutorisationFrequence <> "" Then
oRs("HAB_Frequence1") = strAutorisationFrequence
Else
oRs("HAB_Frequence1") = String(pNbFreq, "1")
End If
End If
oRs("HAB_IdentPub") = CheckComblagePub.Value
oRs("HAB_Tronquable") = CheckTronquable.Value
oRs("Transfert") = 1
'interdit
For i = 0 To 23
If lundi(i) = 1 Then
ValeurRecup = ValeurRecup + "1"
Else
ValeurRecup = ValeurRecup + "0"
End If
Next i
For i = 0 To 23
If mardi(i) = 1 Then
ValeurRecup = ValeurRecup + "1"
Else
ValeurRecup = ValeurRecup + "0"
End If
Next i
For i = 0 To 23
If mercredi(i) = 1 Then
ValeurRecup = ValeurRecup + "1"
Else
ValeurRecup = ValeurRecup + "0"
End If
Next i
For i = 0 To 23
If jeudi(i) = 1 Then
ValeurRecup = ValeurRecup + "1"
Else
ValeurRecup = ValeurRecup + "0"
End If
Next i
For i = 0 To 23
If vendredi(i) = 1 Then
ValeurRecup = ValeurRecup + "1"
Else
ValeurRecup = ValeurRecup + "0"
End If
Next i
For i = 0 To 23
If samedi(i) = 1 Then
ValeurRecup = ValeurRecup + "1"
Else
ValeurRecup = ValeurRecup + "0"
End If
Next i
For i = 0 To 23
If dimanche(i) = 1 Then
ValeurRecup = ValeurRecup + "1"
Else
ValeurRecup = ValeurRecup + "0"
End If
Next i
oRs("HAB_Interdit") = ValeurRecup
oRs("HAB_VTTempo") = 0
oRs("HAB_actif") = ZE_Actif.Value
oRs("HAB_CacheEcran") = 0
oRs("HAB_DateDiffusion") = 0
oRs("HAB_TransfertEffectue") = 0
oRs("HAB_Fade") = 0
oRs("HAB_MixPoint") = 0
If strGUID <> "" Then
oRs("HAB_GUID") = strGUID
Else
strGUID = Trim(NewGUID)
oRs("HAB_GUID") = strGUID
End If
'oRs("HAB_TypeVoix") = 0
oRs("HAB_ControlDuree") = CheckControlDuree.Value

'enregistrement
oRs.Update
oRs.Close

'test si mysql pour connaitre le dernier id
If (mnNumHabillage -1) And nTypeBase 1 Then
strSql = "SELECT * FROM HABILLAGE"
oRs.Open strSql, oConn, adOpenDynamic, adLockOptimistic
If oRs("HAB_Code") = "-1" Then
oRs("HAB_Code") = oRs("ID_Habillage")
ZE_CODE.Text = oRs("ID_Habillage")
oRs.Update
oRs.Close
End If
End If
'fermeture
oConn.Close

mbValider = True
End If
Set oRs = Nothing
Set oConn = Nothing
End Sub
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 nov. 2011 à 00:08
Illisible sans le coloriage
0
StephRadio Messages postés 13 Date d'inscription mardi 18 décembre 2012 Statut Membre Dernière intervention 18 décembre 2012
3 nov. 2011 à 09:02
Je n'avais pas compris qu'il fallait mettre le code entre les deux balises.
Je pense que c'est mieux maintenant et plus lisible même si l'ensemble d'une ligne peut être sur deux lignes
Tu remmarqueras à la fin du code un test uniquement MySql pour connaitre le dernier item, j'ai essayé Last_ID mais en VB cela ne fonctionne pas ou je n'ai pas la bonne syntaxe

Merci


Private Sub Enregistrer()
Dim oConn As New ADODB.Connection
Dim oRs As New ADODB.Recordset
Dim strSql As String
Dim i As Integer
Dim dblDate As Double

    If (EstValideDetail = True) Then
        oConn.Properties("Locale Identifier") = 1036
        oConn.Open IDS_CONN
        If (mnNumHabillage = -1) Then
            strSql = "SELECT * FROM HABILLAGE;"
        Else
            strSql "SELECT * FROM HABILLAGE WHERE ID_Habillage " & mnNumHabillage & ";"
        End If
        oRs.Open strSql, oConn, adOpenDynamic, adLockOptimistic
        If (mnNumHabillage = -1) Then
            oRs.AddNew
            If nTypeBase = 0 Then
                mnNumHabillage = UTILE_DonneNewID("HABILLAGE", "ID_Habillage")
                oRs("ID_Habillage") = mnNumHabillage
                If bNumAutoHab = True Then
                    ZE_CODE.Text = mnNumHabillage
                End If
            Else
                If bNumAutoHab = True Then
                    ZE_CODE.Text = -1
                End If
            End If
            oRs("HAB_IdRealisateur") = gIDUtilisateur
            oRs("HAB_Date") = CDec(Now)
        End If
        'maj des champs
        oRs("HAB_Code") = ZE_CODE.Text
        oRs("HAB_Titre") = ZE_TITRE.Text
        oRs("HAB_Realisateur") = "- AUCUN -"
        oRs("HAB_NomSon") = ZE_AUDIO.Text
        oRs("HAB_PeriodeDebut") = Right$(ZE_Periode_Debut.Text, 2) & Left$(ZE_Periode_Debut.Text, 2)
        oRs("HAB_PeriodeFin") = Right$(ZE_Periode_Fin.Text, 2) & Left$(ZE_Periode_Fin.Text, 2)
        oRs("HAB_DureeReelle") = numDureeFichierUtile
        oRs("HAB_DureeFichier") = numDureeFichier
        oRs("HAB_IDVoix") = UTILE_DonneItemDataSelectedCombo(ZL_VOIX)
        oRs("HAB_IDType") = UTILE_DonneItemDataSelectedCombo(ZL_TYPES)
        oRs("HAB_IdRealisateur") = UTILE_DonneItemDataSelectedCombo(ZL_REALISATEUR)
        oRs("HAB_IDCategorie") = UTILE_DonneItemDataSelectedCombo(ZL_CATEGORIE)
        'intensité
        For i = 1 To 9
            If ChkIntensite(i).Value = 1 Then
                strIntensite = strIntensite & "1"
            Else
                strIntensite = strIntensite & "0"
            End If
        Next i
        oRs("HAB_Intensite") = strIntensite
        'informations diverses
        oRs("HAB_EcartDiff") = CDec(ZE_EcartDiffusion.Value) - Int(CDec(ZE_EcartDiffusion.Value))
        oRs("HAB_NbDiffJour") = VScrollNbDiffJour.Value
        oRs("HAB_DateDebut") = CDec(ZE_Date_Debut.Value)
        oRs("HAB_DateFin") = CDec(ZE_Date_Fin.Value)
        If pNbFreq = 1 Then
            oRs("HAB_Frequence1") = "1"
        Else
            If strAutorisationFrequence <> "" Then
                oRs("HAB_Frequence1") = strAutorisationFrequence
            Else
                oRs("HAB_Frequence1") = String(pNbFreq, "1")
            End If
        End If
        oRs("HAB_IdentPub") = CheckComblagePub.Value
        oRs("HAB_Tronquable") = CheckTronquable.Value
        oRs("Transfert") = 1
        'interdit
        For i = 0 To 23
            If lundi(i) = 1 Then
                ValeurRecup = ValeurRecup + "1"
            Else
                ValeurRecup = ValeurRecup + "0"
            End If
        Next i
        For i = 0 To 23
            If mardi(i) = 1 Then
                ValeurRecup = ValeurRecup + "1"
            Else
                ValeurRecup = ValeurRecup + "0"
            End If
        Next i
        For i = 0 To 23
            If mercredi(i) = 1 Then
                ValeurRecup = ValeurRecup + "1"
            Else
                ValeurRecup = ValeurRecup + "0"
            End If
        Next i
        For i = 0 To 23
            If jeudi(i) = 1 Then
                ValeurRecup = ValeurRecup + "1"
            Else
                ValeurRecup = ValeurRecup + "0"
            End If
        Next i
        For i = 0 To 23
            If vendredi(i) = 1 Then
                ValeurRecup = ValeurRecup + "1"
            Else
                ValeurRecup = ValeurRecup + "0"
            End If
        Next i
        For i = 0 To 23
            If samedi(i) = 1 Then
                ValeurRecup = ValeurRecup + "1"
            Else
                ValeurRecup = ValeurRecup + "0"
            End If
        Next i
        For i = 0 To 23
            If dimanche(i) = 1 Then
                ValeurRecup = ValeurRecup + "1"
            Else
                ValeurRecup = ValeurRecup + "0"
            End If
        Next i
        oRs("HAB_Interdit") = ValeurRecup
        oRs("HAB_VTTempo") = 0
        oRs("HAB_actif") = ZE_Actif.Value
        oRs("HAB_CacheEcran") = 0
        oRs("HAB_DateDiffusion") = 0
        oRs("HAB_TransfertEffectue") = 0
        oRs("HAB_Fade") = 0
        oRs("HAB_MixPoint") = 0
        If strGUID <> "" Then
            oRs("HAB_GUID") = strGUID
        Else
            strGUID = Trim(NewGUID)
            oRs("HAB_GUID") = strGUID
        End If
        'oRs("HAB_TypeVoix") = 0
        oRs("HAB_ControlDuree") = CheckControlDuree.Value

        'enregistrement
        oRs.Update
        oRs.Close
        
        'test si mysql pour connaitre le dernier id
        If (mnNumHabillage -1) And nTypeBase 1 Then
            strSql = "SELECT * FROM HABILLAGE"
            oRs.Open strSql, oConn, adOpenDynamic, adLockOptimistic
            If oRs("HAB_Code") = "-1" Then
                oRs("HAB_Code") = oRs("ID_Habillage")
                ZE_CODE.Text = oRs("ID_Habillage")
                oRs.Update
                oRs.Close
            End If
        End If
        'fermeture
        oConn.Close
        
        mbValider = True
    End If
    Set oRs = Nothing
    Set oConn = Nothing
End Sub

0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 nov. 2011 à 17:01
Code plus clair et complet, mais cela ne nous aiguille pas vraiment.
Puisque ton champ est de type Double, pourquoi convertis-tu la date en Decimal, type très particulier en VB6 ?
--> CDbl serait plus adapté

En réponse, refais un point sur ton problème.
Quand tu insères une date sous forme Double dans Access = Ok
Le même code sous MySQL : erreur lors de l'insertion ?
Quelle erreur ? Que dit-elle ?
C'est un problème purement MySQL : As-tu cherché des solutions sur leur site ?
La propriété "Locale Identifier" n'a rien changé ?

Concernant LAST_ID, c'est une commande purement MySQL et pas SQL. Il est donc normal qu'elle ne fonctionne pas sous Access (ou autre), et ce n'est pas une question de VB, mais de langage genre SQL.
Ton code :
        'enregistrement
        oRs.Update
        oRs.Close
        'test si mysql pour connaitre le dernier id
        If (mnNumHabillage -1) And nTypeBase 1 Then
            strSql = "SELECT * FROM HABILLAGE"
            oRs.Open strSql, oConn, adOpenDynamic, adLockOptimistic
            If oRs("HAB_Code") = "-1" Then
                oRs("HAB_Code") = oRs("ID_Habillage")
                ZE_CODE.Text = oRs("ID_Habillage")
                oRs.Update
                oRs.Close
            End If
        End If
Pourquoi fermes-tu ton RecordSet si tu le réouvres immédiatement derrière ? = perte de temps et de ressources.
En faisant un Select *, tu vas recharger TOUS les enregistrements, donc le test If qui suit le oRs.Open pointera sur le premier enregistrement.
Peut-être qu'un .MoveLast fonctionnera (+ un test de .EOF (ou .EOR je ne sais plus).

Mais, à mon avis, ceci est superflu :
Après un .Update (si on ne fait pas de .Close), le recordset doit pointer sur le dernier enregistrement, ton If derrière le .Update devrait te donner l'info - à tester

oRs("HAB_Code") = oRs("ID_Habillage")
Tu stockes deux fois la même info dans la même fiche ? Bizarre, en tout cas surcharge inutile, semble t-il
0
StephRadio Messages postés 13 Date d'inscription mardi 18 décembre 2012 Statut Membre Dernière intervention 18 décembre 2012
4 nov. 2011 à 10:04
Bonjour,

Merci pour ta réponse et tes remarques
Il est vrai que j'ai modifié cdec par cdbl et je n'ai plus l'erreur d'origine
J'ai testé également le oRs.MoveLast pour récupérer le dernier ID et cela fonctionne
oRs("HAB_Code") = oRs("ID_Habillage") peuvent être identiques ( dans la majorité des cas ) mais mes clients peuvent également rentrer ce qu'ils veulent dans HAB_Code

J'ai néanmoins toujours l'erreur suivante : You have an error in your SQL Syntax, check the manual....

Effectivement, j'ai créer une table dans laquelle je n'avais que l'ID et la date du jour ( double ) et cela fonctionne, l'erreur doit se trouver sur d'autres champs, mais je ne vois pas pourquoi, je vais les reprendre un à un, merci pour ton aide, cela m'a permis d'avancer et de corriger des erreurs.
0
StephRadio Messages postés 13 Date d'inscription mardi 18 décembre 2012 Statut Membre Dernière intervention 18 décembre 2012
17 nov. 2011 à 09:59
Bonjour,

Je reviens vers car j'ai eu d'autres choses à terminer.
Merci pour ton aide, j'ai refais la table et intégré tes remarques et tout s'enregistre correctement sous MySql.
Par contre même en utilisant ors.movelast après le ors.update, il ne me donne pas le dernier id créé et là je ne vois pas quoi faire.

Encore merci

@+
0
Rejoignez-nous