ADOConnection - DefaultDatabase neue Quelle zur Laufzeit bestimmen



  • Hallo,

    habe eine ADOConnection Komponente auf dem Form, zur Entwicklungszeit funct der Connect zur Datenbank(Access) wunderbar. Aber was ist wenn die Datenbank nicht unter mehr unter den im Obejkinspektor eingetragen Eigenschaften zu finden ist. Dachte mir just naja ok, fange die Fehlermeldung ab und stelle über einen Öffnen Dialog eine neue Verbindung zur Datenbank her, aber irgendwie bekommme ich das nicht so einfach hin. Habe versucht mit ConnectionString eine zuweisung herzustellen, aber leider ohne Erfolg.

    Meine Frage, vieleicht gibt es ja jemanden dem das Problem bekannt ist und kann mir etwas unter die Arme greifen, wäre toll bedanke mich vorab.

    Info: Connected wird zur Laufzeit auf true gesetzt, beim schliesen auf false.

    mfg
    gil



  • Ein kleine Funktion mit der ich ein paar Informationen aus der Registry auslese und den connectionstring für die verschieden Datenbanken zusammenstelle. Das funktioniert anwandfrei.

    void __fastcall TDaten::VerbindungADOBeforeConnect(TObject *Sender)
    {  TRegistry* reg = new TRegistry();
      reg->RootKey = checkLocalMachine();
      reg->OpenKeyReadOnly("Software\\");
      reg->OpenKeyReadOnly("Firma\\");
      reg->OpenKeyReadOnly("Connect\\");
       TStringList *s = new TStringList();
       s->Delimiter = ';';
       if (DB->Kennung == "MSSQL")
       { s->Values["Provider"] = "SQLOLEDB.1";
         s->Values["Password"] = reg->ReadString("PW");
         s->Values["Persist Security Info"] = "True";
         s->Values["User ID"] = reg->ReadString("User");
         s->Values["Initial Catalog"]= reg->ReadString("Datenbank");
         s->Values["Data Source"] = reg->ReadString("Host");
         if(reg->ReadString("WA") == "1")
         { s->Add("Integrated Security=SSPI");
           s->Values["Persist Security Info"] = "False";
         }
    
       }
       if (DB->Kennung == "ORACLE")
       { s->Values["Provider"] = "OraOLEDB.Oracle.1";
         s->Values["Password"] = reg->ReadString("PW");
         s->Values["Persist Security Info"] = "True";
         s->Values["User ID"] = reg->ReadString("User");
         s->Values["Data Source"] = reg->ReadString("Datenbank");
       }
       if (DB->Kennung == "MYSQL")
       { s->Values["Provider"] = "MSDASQL.1";
         s->Values["Password"] = reg->ReadString("PW");
         s->Values["Persist Security Info"] = "False";
         s->Values["User ID"] = reg->ReadString("User");
         s->Values["Data Source"] = reg->ReadString("Host");
       }
       AnsiString s1 = s->DelimitedText;
       while(int x = s1.Pos("\"")) s1.Delete(x,1);
       VerbindungADO->ConnectionString = s1;
       delete reg;
       delete s;
    }
    


  • hallo gh,

    das Teil ist ja stark. Super.
    Leider bin ich ein Anfänger entschuldige bitte aber geht das nicht auch ohne die Registry, setze einfach voraus das der Driver für Access auf dem System ist.

    Halt einfach das neu via OpenDialog ausgewähltes File, dem Programm bekannt geben und ab da eben mit diesem arbeiten.

    Währe toll da Hilfe zu bekommen. 🙂

    mfg
    gil



  • Na komm, nun stell dich mal nicht so an.
    Lass dir einfach mal den ConnectionString deiner zur Entwurfszeit konfigurierten Komponente ausgeben, schon hast du eine perfekte Vorlage.



  • Hallo gh und Jansen,

    na schön will mich nicht so haben. Habe das Teil mal Probiert.

    Aber eine Funktion schimpft mir der Compiler an.

    reg->RootKey = checkLocalMachine();
    

    Ja und wie kann ich dann die Sache dem OpenDialog übergeben. In etwa so User findet seine Datenbank via OpenDialog, Programm bitte nimm diese Datenbank.

    Schönen KFreitag gewünscht

    gil 🙂



  • Hallo gh u. Jansen,

    endlich ich habe es, siehe Code:

    void __fastcall TForm1::ffnen2Click(TObject *Sender)
    {
       Form2->OpenDialog1->Execute();
       AnsiString pfadK = Form2->OpenDialog1->FileName;
       AnsiString pfad = ExtractFileDir(Form2->OpenDialog1->FileName);
    
       TStringList *s = new TStringList();
       s->Delimiter = ';';
       s->Values["Provider"] = "MSDASQL.1";
       //s->Values["Password"] = "admin";
       s->Values["Persist Security Info"] = "true";
       s->Values["Mode"] = "Read";
       s->Values["Extended Properties = DBQ"]  = pfadK;
       s->Values["DefaultDir"] = pfad;
       s->Values["Driver"] = "{Driver do Microsoft Access (*.mdb)}";
       s->Values["DriverId"] = "25";
       s->Values["FIL"] = "MS Access";
       s->Values["MaxBufferSize"] = "2048";
       s->Values["MaxScanRows"] = "8";
       s->Values["PageTimeout"] = "5";
       s->Values["SafeTransactions"] = "0";
       s->Values["Threads"] = "3";
       s->Values["UID"] = "admin";
       s->Values["UserCommitSync"] = "Yes";
       s->Values["Initial Catalog"]= pfad +"\\Test";
       //s->Values["Data Source"] = pfad;
    
       AnsiString s1 = s->DelimitedText;
       while(int x = s1.Pos("\"")) s1.Delete(x,1);
       ADOConnection1->ConnectionString = s1;
    
       ShowMessage(s1);
       delete s;
    
       Form1->zuletzt1->Caption = pfadK;
    
       //Clipboard()->AsText = ADOConnection1->ConnectionString;
    
       if(FileExists("c:\\database.ini"))
       {
          ofstream f("c:\\database.ini", ios::binary);
          if(!f)
             ShowMessage("Fehler beim öffnen");
          f.write(pfadK.c_str(), pfadK.Length());
          if(!f)
             ShowMessage("Fehler beim schreiben");
    
          f.close();  // evtl. überflüssig Dateireservierung vom OS, wird normal
                      // beim verlassen der Verbundanweisung automatisch geschlossen
       }
       else
       {
          ofstream f("c:\\database.ini", ios::binary);
    
       }
    
    }
    

    Der Vorschlag von gh brachte mich auf die Lösung. Trotzdem würde mich noch die Funktion checkLocalMachine() Interessieren, aber das hat keine Eile. Nun muss ich nur noch das mit dem fstream einlesen hin bekommen.

    Danke für Euere Tipps

    mfg
    gil 🙂


Anmelden zum Antworten