cs_globule
Messages postés327Date d'inscriptionmardi 8 octobre 2002StatutMembreDernière intervention 6 octobre 2010
-
22 juin 2006 à 13:54
cs_globule
Messages postés327Date d'inscriptionmardi 8 octobre 2002StatutMembreDernière intervention 6 octobre 2010
-
14 juil. 2006 à 19:42
J’ai récemment posé une question sur le forum VBfrance concernant le remplacement des bases Access par une autre base plus solide et supportant le client/serveur, sans que cela ait un coût pour mes clients.
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
SQLServeur étant trop cher (la version gratuite est limitée a 4Go …) on m’a conseillé MySql.
Cependant, je viens de voir sur un site que MySQL n’était pas adapté à des gros volumes. Je cherche donc les conseilles de personnes qui l’utilisent dans le cadre professionnel, avec des grosses bases (20 a 50 Go …) en client/serveur. MySQL tient t’il le cou ?
Avez-vous des exemples en VB6 ou VB.NET (car on va tous être obligé de migrer …)
De plus j’ai vu qu’il existe des DLL pour l’attaquer directement. J’ai également vu que c’était possible avec ODBC. Quelle est la meilleure méthode ? Sachant que je ne peux pas prendre le risque d’intégrer quelque chose qui ne sera plus maintenu ou développé par un particulier (Merci à MS pour l’abandon du VB6 …)
medelidrissi
Messages postés180Date d'inscriptionjeudi 21 août 2003StatutMembreDernière intervention26 novembre 20072 23 juin 2006 à 00:23
Salut,
Il ne faut pas trop attendre, pour moi Mysql est trop puissant surtout les dernières versions (5) de ce SGBD qui intègre les Trigger, les vues ..., en ce qui concerne la taille de la base de données, j'ai lu il y a pas mal de temps dans la documentation de mysql qu'il y ait une société qui a atteint 1TO de données sans prob (reste à les croire :-D) http://dev.mysql.com/doc/refman/5.0/fr/innodb-overview.html.
Pour la connexion, je pense qu'il n'y a pas grand-chose à modifier au niveau de ce point il faut juste installer MyODBC http://dev.mysql.com/downloads/connector/odbc/3.51.html, et changer une partie de la syntaxe de connexion utilisée dans ado (à noter Provider=SQLOLEDB.1 => DRIVER={MySQL ODBC 3.51 Driver}) pour plus de détail voici une source qui vient d'être posté traitant le sujet Mysql-Vb http://www.vbfrance.com/codes/VB-MYQSL_38227.aspx, Pour le reste, je pense qu'il va rester inchangé.
Ben pour terminer, il faut voir juste, si le contenu de ta base de données est compatible avec la syntaxe de MySql.
Bonne programmation.
Cordialement medelidrissi
<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
cs_globule
Messages postés327Date d'inscriptionmardi 8 octobre 2002StatutMembreDernière intervention 6 octobre 2010 25 juin 2006 à 09:47
Il y a des endroits ou c'est beaucoup plus lent qu'Access
exemple
Set RSMyRecordSet = New ADODB.Recordset
RSMyRecordSet.open "MABASE", AdoMyConnectionMySQL_ONEOPEN_BDR, adOpenKeyset, adLockOptimistic
Sur une grosse base, cette opération (le open) necessite plusieurs secondes. Avec la même base au format MDB, c'est instantannée
Idem pour la la recherche d'une valeur maximum dans une base de données (j'ai essayé les differentes méthodes et c'est toujours aussi lent)
Ce qui est supprenant c'est que la requete suivante (même base MySQL) est tres rapide.
Set RSMyRecordSet = New ADODB.Recordset
RSMyRecordSet.open "Select * from MABASE where Cle=" & MyCle, AdoMyConnectionMySQL_ONEOPEN_BDR, adOpenKeyset, adLockOptimistic
Comment gérer ce probleme, Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
medelidrissi
Messages postés180Date d'inscriptionjeudi 21 août 2003StatutMembreDernière intervention26 novembre 20072 26 juin 2006 à 12:54
Bonjour,
Oui effectivement Date() n'est pas reconnue dans Mysql, cependant comme dans oracle tu peux utiliser SYSDATE() ou NOW() ou CURRENT_DATE() (il ya une panoplie de fonctions permettant la manipulation des dates sous mysql http://www.toutestfacile.com/sql/cours/printables/SQLFacile.com-functdate.php).
En ce qui concerne la rapidité d'exécution de la fonction d'agrégation Max, vraiment c'est bizarre, tout d'abord essaye de voir si la colonne utilisée et bien de type int (entier ou en générale nombre) et si elle contient des valeurs NULL. autre chose essaye d'exécuter la même requête en utilisant PhpMyAdmin installable avec easyPHP.
Bonne programmation.
Cordialement medelidrissi
<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
cs_globule
Messages postés327Date d'inscriptionmardi 8 octobre 2002StatutMembreDernière intervention 6 octobre 2010 26 juin 2006 à 14:33
En fait je me suis rendu compte que c'etait l'ouverture des recordSet qui etait longue
Par exemple
RequeteSql = "select MAX(Num) as MyVal from MATABLE" est tres lent sur une grosse base (au moins 3 secondes)
par contre, la requete suivante qui produit le même resultat est instantanée
RequeteSql = "select MAX(Num) as MyVal from MATABLE limit 1"
Idem, pour l'ajout de champ dans la base
un
RS.Open "Matable", ...
RS.addnew
...
RS.update
Sera tres lent
Par contre
RS.Open "select * from Matable limite 1", ...
RS.addnew
...
RS.update
Produit le même resultat et est 50 fois plus rapide
Bref, sans indiquer le limit, j'ai l'impression que MySQL stocke temporairement la base entiere dans un buffet ...
Bien sur, on peut utiliser directement la Insert ..., mais ca m'oblige a recoder les 5000 requetes de mon projet ...
Il me reste une interrogation :
La ligne suivante fonctionne
RS.Fields("MonChamp").value
Mais pas celle ci
RS.Fields("MATABLE.MonChamp").value
Hors dans un cas d'une requete sur 2 tables avec des champs portant le même nom, il est obligatoire de pouvoir indiquer le nom de la table ...
medelidrissi
Messages postés180Date d'inscriptionjeudi 21 août 2003StatutMembreDernière intervention26 novembre 20072 26 juin 2006 à 15:00
Salut,
Si cela marche bien, à condition qu'il ait vraiment une confusion dans les noms, car par défaut mysql utilise le nom de l'entité en cas de jointure de plusieurs tables il ajoute le nom de la table MATABLE.MonChamp pour les champs existant dans les deux tables.
Mais de toute façon tu peux donner des synonymes à tes champs sauf si tu as tendance à utiliser le * dans select.
select max(monchamp) as ValMax, table1.champx as MonChampX1, table2.champx as MonChampX2
from table1 join table2 using(champY)
groupby champz;
Tu peux omettre le As.
Bonne programmation.
Cordialement medelidrissi
<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
cs_globule
Messages postés327Date d'inscriptionmardi 8 octobre 2002StatutMembreDernière intervention 6 octobre 2010 27 juin 2006 à 11:21
Ca commence a super bien tourner. MySQL n'à rien à voir avec Access. Surtout en réseau
J'ai encore quelques questions
Comment faire un programme de sauvegarde (sans arrêter le serveur MySQL de préférence). En gros comment appeler la fonction dump avec ADO (ou une autre fonction)
J'ai également acheté un produit pour convertir mes bases Access en MySQL. Connaissez vous un utilitaire qui est capable de donner le code "create table ..." d'une base MySQL existante. Vu le nombre de tables que j'ai, il sera plus simple de faire un copier-coller d'une code valide, plutôt que de tout refaire "a la main"
Je rencontre également une difficulté sur la gestion des dates en MySQL, et notamment pour adapter le # et le between des requêtes access
exemple :
Select * from ma table where dateSaisie BETWEEN # " & datedeb & "# and #" & DateFin & "#"
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
Enfin, faut il que je fasse quelque chose de particulier (lors de la création des tables ou autres), pour avoir le support InnoDB, étant donnée que j’utilise la version 5 de MySQL. Ce n’est pas très clair dans la doc.
Dans mysql les chaînes de caractères à noter les dates doivent être entre apostrophes '.
Select * from ma table where dateSaisie BETWEEN '" & datedeb & "' and '" & DateFin & "'"
Le type InnoDB regroupe pas mal de fonctionnalité qu'on trouve dans les grands sgbd comme oracle à noter la prise en charge des clés étrangère.... Pour l' utiliser il faut le spécifier avant le ; de la requête de création de ta table.
Je te conseille d'installer, le gestionnaire par excellence des bases de données mysql "PhpMyadmin". (cherche easyphp = serveur apache + mysql + php+ phpmyadmin, sinon il faut installer le serveur apache puis phpMyadmin).
Bonne programmation.
Cordialement medelidrissi
<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
cs_globule
Messages postés327Date d'inscriptionmardi 8 octobre 2002StatutMembreDernière intervention 6 octobre 2010 27 juin 2006 à 14:26
Je decris un exemple de ce qui pose probleme. Je gere une trace du dernier code le dernier client dans la table utilisateurs. Lorsque je ferme la fiche du client je place la valeur -1 pour indiquer que ce dernier est libre.
Dans le cas d'un reseau, j'obtiens regulierement l'erreur 2147217864, "la ligne n'à pas pu etre trouvée pour la mise a jour. Certaines valeurs ont peut-être changé depuis leur derniere lecture". Ce qui n'etait pas le cas avec Access.
Comment gerer correctement le muti-utilisateurs lors des MAJ de bases
RequeteSql = "Select * from MyUtilisateurs where Code= " & G_Code
Set RS = New ADODB.Recordset
RS.open RequeteSql, AdoMyConnectionMySQL, adOpenKeyset, adLockOptimistic
On Error Resume Next
AdoMyConnectionMySQL.BeginTrans
If Not RS.EOF And Not RS.BOF Then
RS.fields("ClientActuel").value = "-1"
RS.Update
End If
AdoMyConnectionMySQL.CommitTrans
If Err.Number <> 0 Then GoTo RStrans_Err
Err.Number = 0
On Error GoTo 0 ' fin de la gestion d’erreur
' Fermeture du recordset
If (Not RS Is Nothing) Then
If RS.State = adStateOpen Then RS.Close
Set RS = Nothing
End If
medelidrissi
Messages postés180Date d'inscriptionjeudi 21 août 2003StatutMembreDernière intervention26 novembre 20072 27 juin 2006 à 15:01
Bonjour
Je pense que pour des raisons de performances, il vaut mieux faire un update directement, essaye d'utiliser la requête et regarde si le prob se présente tjrs :RequeteSql "Update MyUtilisateurs set ClientActuel -1 where Code= " & G_Code
(le champ Code est a priori une clé primaire de la table MyUtilisateurs).
Bonne programmation.
Cordialement medelidrissi
<hr />
En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
cs_globule
Messages postés327Date d'inscriptionmardi 8 octobre 2002StatutMembreDernière intervention 6 octobre 2010 7 juil. 2006 à 09:12
Bonjour,
J'ai testé les 2 sources de sauvegarde sur le lien que vous m'avez donné, mais aucune ne fonctionnent correctement sur les très grosses bases (Il manque des tables lors de la restauration)
J'ai essayé d'appeler MySQLDump. J'arrive à le faire fonctionner directement sous MSDOS, mais impossible de le faire tourner en VB6 (dans une commande Shell). Je ne sais pas pourquoi.
D'autre part, existe t'il un moyen de sauvegarder directement ma base de donnée. C.A.D. d'arrêter le serveur MySQL et de récupérer directement les fichiers sur le disque dur. Si oui lesquels ?
J'ai essayé
C:\Program Files\MySQL\MySQL Server 5.0\data\MABASE
mais ça ne fonctionne pas.
J'utilise InnoDB
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
Bref, je recherche toute solution de sauvegarde d’une base MySQL « sur » et rapide en VB6
medelidrissi
Messages postés180Date d'inscriptionjeudi 21 août 2003StatutMembreDernière intervention26 novembre 20072 10 juil. 2006 à 13:14
Salut,
Effectivment, faire une sauvegarde à chaud dans mysql n'est pas une chose faisable pour les grandes bases de donnée.
Si tu as accès au poste accueillant le serveur mysql il vaut mieux faire une copie des fichiers sources de ta base.
1 - pour ce faire arrête ta base
2 - va dans C:\Program Files\MySQL\MySQL Server 5.0\data\
puis copie :
le dossier MABASE
et les fichiers ib_logfile0, ib_logfile1 et ibdata1 : Lorsque tu utilises les bases de données innodb ces fichiers sont nécessaire ibdata1 contient la totalité des données de toutes tes tables innodb de toutes les bases, "eh oui" , de ton serveur.
Dans le dossier de ta sauvegarde par exemple : c:/..../Buckup/
si jamais tu veux faire le test pour voir si ta sauvegarde c'est bien passé :
arrete Mysql
va dans le dossier
C:\Program Files\MySQL\MySQL Server 5.0\
renomme le dossier data en data1 (ou ce que tu veux)
crée un dossier data
puis copie ta sauvegarde dans ce nouveau dossier (en respectant la structure dans c:/..../Buckup/)
copier le dossier .../data1/mysql dans /data/ (attention copier pas couper )
lancer mysql
pour revenir à ta configuration supprime data et renomme data1 en data
sinon tu peux changer les paramètres du fichier de configuration de mysql pour qu'il utilise un autre dossier comme source de donné
le paramètre "datadir"
Bonne programmation.
Cordialement medelidrissi
<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
cs_globule
Messages postés327Date d'inscriptionmardi 8 octobre 2002StatutMembreDernière intervention 6 octobre 2010 10 juil. 2006 à 13:43
Pour le dump, j'ai finalement reussi à l'appeler en VB6 par un Shell, mais ca ne me plait pas trop
Je vais essayer de faire une sauvegarde directe des fichiers. Faut il stopper uniquement la connexion à la base ou arreter le serveur MySQL ?
Je me pose encore une question
Concernant le transfert d'une base Access vers MySQL en InnoDB est il preferable d'utiliser latin1 ou utf8 comme langage (mes clients sont tous francais)
medelidrissi
Messages postés180Date d'inscriptionjeudi 21 août 2003StatutMembreDernière intervention26 novembre 20072 10 juil. 2006 à 16:18
Je pense qu'il est possible de faire cette sauvegarde sans arrêter la base de données, mais il faut exécuter qlq requête pour la rendre en lecture seule regarde dans la documentation de mysql. En attendant l'arrêt de la base et obligatoire.
Pour le français, je pense latin1 et plus adéquat, sinon à ma connaissance tu dois convertir lors de la lecture
Bonne programmation.
Cordialement medelidrissi
<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.