IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Accès dynamique à différent fichier database


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut Accès dynamique à différent fichier database
    Bonjour à tous,

    J'ai besoin d'accéder à des fichiers dont je ne connais pas le nom (l'utilisateur entre le nom). Normalement cela ne me cause pas trop de soucis. Dans ce cas-ci, je dois utiliser le fichier pointé par l'utilisateur comme source pour ma DBGrid. En d'autre termes, ma DBGrid accède à un fichier .PMR (qui s'ouvre très bien avec accèss et avec la DBGrid) via un TQuery et un TDataSource. Alors, c'est donc de créer dynamiquement un alias?

    Je suis un peu nouveau dans les base de donnée.. alors excuser mon ignorance!

    merci à l'avance!

    antoine

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Tu dois pouvoir assigner le nom de ton fichier en runtime depuis une propriété de ta composante qui localise la base de données. Tu utilises quelle composante pour cela?


    PS: C'est quel genre de database les fichiers "pmr" ?

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    Bonjour Patrick,

    merci de ton intérêt,


    Les fichiers .PMR sont des fichier database de MS Access au meme titre que les .MDB (il doit y avoir certaines différences, mais je ne les connais pas et les PMR fonctionnent avec borland tout comme les MDB alors... je ne saurais quoi dire).

    Vous devez vous posez la question "Pourquoi utilisez des PMR alors?". Ce sont des fichiers qui résultent d'une application dont je n'ai pas le contrôle.

    Ensuite, les composantes que j'utilise sont :

    Une TDBGrid qui pointe vers une TDataSource qu'elle pointe vers un TQuery qui pointe vers une database que j'ai configuré dans le SQL Explorer (pointant vers mon fichier .PMR).

    Je suis pas certain que sa soit clair... peut-être que ceci aidera :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DBGrid1->DataSource = "DataSource1";
    DataSource1->Dataset = "Query1";
    Query1->DatabaseName = "antoine2";
    Je ne suis pas sur de comprendre ce que vous avez dit à propos des runtime...

    désolé pour mon ignorance.

    merci,

    antoine

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut Désolé!
    Désolé tout le monde, j'ai mal faite mes devoirs :

    http://www.developpez.net/forums/d47...ique-bde-odbc/

    http://www.developpez.net/forums/d23...amique-dalias/

    Je m'y mets.

    antoine

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut Suite...
    Bonjour, encore moi!

    Juste pour aider ceux qui voudrait utiliser les codes que j'ai mit en lien ci-dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(NULL,"open","odbcconf","configsysdsn \"Microsoft Access Driver (*.mdb)\" \"DSN=dsn2;DBQ=C:\mabase.mdb;\"",0,SW_SHOWDEFAULT);
    C'est mieux de mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(NULL,"open","odbcconf","configsysdsn \"Microsoft Access Driver (*.mdb)\" \"DSN=MonAlias;DBQ=C:\\mabase.mdb;\"",0,SW_SHOWDEFAULT);

    Et pour l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Query1->DatabaseName = "MonAlias";
    Query1->Active = true;
    Cependant, j'ai un probleme lorsque je veux permettre à l'utilisateur de modifier le fichier à son aise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AnsiString dbFichierNom = NomduFichier->Text;
    ShellExecute(NULL,"open","odbcconf","configsysdsn \"Microsoft Access Driver (*.mdb)\" \"DSN=MonAlias;DBQ=C:\\" + dbFichierNom + ".mdb;\"",0,SW_SHOWDEFAULT);
    L'erreur est une erreur qui me reviens souvent et dont je n'ai pas encore réussit à règler. :

    "Cannot convert 'AnsiString' to '...' "

    dans ce cas-ci : ... = const char *

    Pouvez-vous m'indiquer un emplacement où chercher de l'info sur cette conversion?

    Ou tout simplement me renseigner directement?

    Merci infiniment,

    Antoine

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut Autre questions
    J'ai toujours mon problème de nom de fichier dynamique, mais j'ai aussi un autre problème.

    Lorsque je créer dynamiquement un nouveau alias pour un nouveau fichier .mbd (ou PMR, les deux fonctionnent de la même façon), l'alias reste présent même lorsque le programme est fermé. Je m'explique :

    Je compile mon programme qui est constitué d'un bouton qui a pour action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
     
    ShellExecute(NULL,"open","odbcconf","configsysdsn \"Microsoft Access Driver (*.mdb)\" \"DSN=Selection;DBQ=C:\\mabase.mdb;\"",0,SW_SHOWDEFAULT);
    Query1->DatabaseName = "Selection";
    Query1->Active = true;
    }
    Je test mon programme tout va bien, les données de mabase.mdb se retrouve dans ma DBGrid et je peux filtrer etc. Je ferme mon test.

    Je vais dans mon Database Explorer. Mon alias (MonAlias) est toujours présent. Alors pour la seconde exécution du programme je n'ai plus besoin de la ligne de commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(NULL,"open","odbcconf","configsysdsn \"Microsoft Access Driver (*.mdb)\" \"DSN=Selection;DBQ=C:\\mabase.mdb;\"",0,SW_SHOWDEFAULT);
    pour que mon bouton fonctionne.

    Pour l'instant ce n'est pas un problème, mais si le logiciel garde en mémoire toutes mes alias créés dynamiquement, je vais finir par avoir un problème.

    Je me posais comme question si c'était seulement un phénomène qui dure sous Borland et du moment que j'effectue une compilation finale, ce phénomène ne se produiera plus?

    Enfin, je me demandais comment effacer dynamiquement un alias.

    J'imagine que ça doit être avec la commande ShellExecute(), mais je n'ai pas encore trouver comment.

    Merci de votre patience.

    Antoine

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Citation Envoyé par antoinelac Voir le message
    L'erreur est une erreur qui me reviens souvent et dont je n'ai pas encore réussit à règler. :

    "Cannot convert 'AnsiString' to '...' "

    dans ce cas-ci : ... = const char *
    C'est parce que tu as un objet de type "AnsiString" et que la fonction attend un "const char*". Tu peux convertir avec la fonction "c_str()" de AnsiString:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AnsiString text="Hello";
    text.c_str();

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Au lieu de faire des alias, tu peux aussi créer un objet de type TADOConnection et le connecter à un TADOQuery.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    TADOConnection* ado=new TADOConnection(this);
    ado->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=X:\\path\\fichier.mdb;";
    ado->LoginPrompt=false;
    try {
      ado->Open();                            // Try to open the connection
    }
    catch(Exception &err) {
      throw EDatabaseError(err.Message);      // Convert error in EDatabaseError
    }
     
    TADOQuery *dbRecords=new TADOQuery(this);
    dbRecords->Connection=connect;
    et après tu utilises ton dbRecord comme ton TQuery avant...

    NB: Je n'ai pas testé le code ci-dessus... il contient peut-etre des erreurs

  9. #9
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    Étrangement, lorsque je compile il ne reconnaît pas la composante
    TADOConnection

    L'erreur du compileur est la suivante :

    E2451 Undefined symbol 'TADOConnection'

    Ensuite, il y a d'autre erreur en relation avec cette erreur (même chose pour ado, etc., juste normal puisqu'il ne reconnaît pas TADOConnection...)


    Je continue mes recherches,

    merci

    antoine

  10. #10
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    Voilà ce qui me manquait!

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    J'allais le dire... Désolé d'être trop tardif

  12. #12
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    hehe,

    Pas de problème,

    Cependant, j'ai toujours quelques petites questions,

    Voici mon code (tout fonctionne bien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    	AnsiString strDir = "c:\\maDB.MDB";
     
    	TADOConnection * ado = new TADOConnection(this);
     
    	ado->ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Mode=ReadWrite;Extended Properties=""DBQ="
                                        + (AnsiString)strDir + ";DefaultDir=" + (AnsiString)strDir
                                        + ";Driver={Driver do Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;FILEDSN="
                                        + (AnsiString)strDir + ";MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5"
                                        + ";SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;";
     
    	ado->LoginPrompt=false;
    	try {
    	  ado->Open();                            // Try to open the connection
    	}
    	catch(Exception &err) {
    	  throw EDatabaseError(err.Message);      // Convert error in 
     
    	}
     
    	TADOQuery *dbRecords=new TADOQuery(this);
    	dbRecords->Connection = ado;
    	dbRecords->SQL->Clear();
    	//--------------Mon code SQL--------------//
    	dbRecords->SQL->Add("SELECT Batch_Job.Batch_ID, Batch_Job.Job_ID, Customer.Customer_Company");
    	dbRecords->SQL->Add("FROM Batch_Job INNER JOIN Customer ON Batch_Job.Customer_No = Customer.Customer_No;");
    	//--------------Mon code SQL--------------//
    	dbRecords->ExecSQL();
    Ensuite? C'est la que je coince. J'ai essayer de me servir de "dbRecords" comme DataSet dans une TDataSource pour mon DBGrid, mais ça ne semble pas être la bonne solution.

    J'ai chercher dans la FAQ ainsi que dans les forums, sans trouver quelque chose qui m'arrange. Alors, je continue ma recherche, mais toute aide sera la bienvenue.



    Merci,

    Antoine

  13. #13
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut Solution!
    Bon finalement,

    J'ai peut-être demandé trop compliqué, le code suivant me permet de changer le fichier utilisé dynamiquement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	AnsiString strDir = "c:\\maDB.mdb";
     
    	ADOConnection->Connected = false;
    	ADOQuery->Active = false; 
     
    	ADOConnection->ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Mode=ReadWrite;Extended Properties=""DBQ="
    									+ (AnsiString)strDir + ";DefaultDir=" + (AnsiString)strDir
    									+ ";Driver={Driver do Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;FILEDSN="
    									+ (AnsiString)strDir + ";MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5"
    									+ ";SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;";
    	ADOConnection->Connected = true;
    	ADOQuery->Active = true;
    Tout ce chemin pour en arriver là.

    En fait, je ne connaissais pas les ADO... Vous me les avez faites découvrir!

    Merci!

    Il manquait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADOConnection->Connected = true;
    Pour implémenter le code précédant, enfin je crois.

    Merci à tous!!
    (Dans ce cas-ci principalement Patrick)

    Antoine

  14. #14
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Au plaisir.

    Pour info, tu peux aussi ajouter ces composantes (TADOConnection et TADOQuery) directement comme objet non visuels sur une fiche. Tu les manipules ensuite de la même façon.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Utiliser dynamiquement un fichier de config différent ?
    Par StringBuilder dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/04/2011, 13h19
  2. [XSL]Accès totalement dynamique à un fichier
    Par Wells dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 03/07/2008, 17h36
  3. Réponses: 5
    Dernier message: 07/05/2004, 09h44
  4. problème d'acces concurentiel à un fichier
    Par Theoden dans le forum MFC
    Réponses: 2
    Dernier message: 04/03/2004, 09h49
  5. Chemin d'accès d'un fichier
    Par guitaros dans le forum Langage
    Réponses: 6
    Dernier message: 16/01/2004, 09h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo