System() Rückgabewert als String



  • Hallo zusammen,

    ich möchte die Liste der verfügbaren SQL-Instanzen in einer Kombobox ausgeben. Ich habe heraufgefunden das die einfachste Methode um dies zu verwirklichen ist dieser Informationen aus der Kommandozeilen abzulesen. Und zwar mit dem Befehl "SQLCMD -L". Das Problem ist ich kenne nur die system() Methode um CMD-Befehle auszuführen. Und system() liefert kein String zurück sondern gibt lediglich an ob der Befehl ausgeführt worden ist oder nicht. Hier im Forum habe ich von _popen und Pipes gelesen. Habe mir beide angeschaut aber es sieht so aus dass das was ich möchte nicht mit dieser Funktionen zu erreichen ist. Falls eine Lösung bereits im Forum vorhanden ist, wäre ich über ein Link dankbar.

    Frage: Wie kann ich das Ergebnis eines CMD-Befehls als String ablesen?

    Ideal wäre wenn die Lösung wie folgt aussehen würde.

            UnicodeString cmdErgebnis = L"";
    	cmdErgebnis = irgendwas("sqlcmd -L");
    	Memo1->Lines->Add(cmdErgebins);
    

    Getestete _popen() Methode die nicht funktioniert hat.

       char   psBuffer[128];
       FILE   *pPipe;
    
       if( (pPipe = _popen( "sqlcmd -L", "rt" )) == NULL ){
    	  return;
       }
       while(fgets(psBuffer, 128, pPipe)){
    	Memo1->Lines->Add(psBuffer);
       }
    

    Danke im Voraus.



  • @SNMN
    So einfach ist das nicht. MS beschreibt hier wie man das macht. Das Beispiel ist ohne Helm und Sicherheitsgurt, da musste noch etwas drumrumbasteln.
    Einfacher ist es da vielleicht herauszufinden, was sqlcmd -L eigentlich macht und das nachbauen. Viel mehr als die Registry zu durchsuchen wird das vermutlich auch nicht sein.



  • Zumindestens für C# via Ado.Net gibt es eine funktion die das gleiche macht.
    https://docs.microsoft.com/de-de/dotnet/framework/data/adonet/sql/enumerating-instances-of-sql-server

    Ansonsten gibt es eine Erklärung wo es in der Registry steht (wenn es eh nur um lokale instanzen geht)

    https://stackoverflow.com/questions/141154/how-can-i-determine-installed-sql-server-instances-and-their-versions

    Und hier eine Beschreibung für Network discovery:
    https://mbielanczuk.com/2013/07/browsing-network-for-sql-server-instances-in-c/



  • So liebe Leute,

    ich habe jede Vorschlag von hier mir etwas genauer angeschaut aber keins hat auf Anhieb funktioniert. Selbst mit etwas Recherche haben dieser Dinge mir nicht die Ergebnisse geliefert die ich haben wollte. Also habe ich selbst etwas gebastelt. Die Lösung sieht leider nicht so professionell aus aber funktioniert sehr gut.

    Ich habe eine Batch-Datei erstellt mit dem Befehl "sqlcmd -L". Dieser Datei wird ausgeführt und schreibt das Ergebnis in einer Andere Datei. Anschließend lese ich dieser Datei aus und lösche die danach. Das beste an dieser Methode ist, ES FUNKTIONIERT. Alle anderen Methoden sind unnötig kompliziert und funktionieren am ende immer noch nicht. Ich rede nur von C++ in Embarcadero C++ Builder Entwicklungsumgebung. Sollte jemand ne andere Meinung vertreten kann er gerne seiner Sourcecodes posten dann schaue ich mal ob es genau so simple und zuverlässig funktioniert.

    Ansonsten Vielen Dank für die Hilfe.



  • @SNMN sagte in System() Rückgabewert als String:

    Alle anderen Methoden sind unnötig kompliziert und funktionieren am ende immer noch nicht.

    Soso... wenn du das so sagst dann muss das ja stimmen 👍🏼



  • @DocShoe willst du mir sagen das die anderen Methoden einfacher sind?



  • @SNMN
    Nein, ich will dir sagen, dass sie robuster sind.


Anmelden zum Antworten