Programm funzt im englischen Windows aber nicht im deutschen Windows



  • Hi!

    Ich habe ein Programm geschrieben, welches auf jedem Computer, der das englische Windows drauf hat super laeuft, aber nicht funktioniert, wenn das deutsche Windows installiert ist. Woran kann das liegen? Der komplizierteste part des programmes ist eigentlich wenn das Programm (welches in reinem C programmiert ist) per SQL auf eine Access datenbank zugreift, daten ausliest und daten reinschreibt.
    Oder kann es daran liegen, dass das programm auf nem englischem Windows compiled wurde? (ich benutze Dev-Cpp)

    Eigentlich funktioniert das Programm auf beiden Betriebssystemen wunderbar und stuerzt auf keinen der beiden ab. Jedoch erscheinen die in die Datenbank geschriebenen Daten nicht in der Access datei, wenn das Programm auf dem deutschen Windows ausgefuehrt wurde... 😕

    Hat jemand eine Idee, woran es liegen koente und wie es behoben werden koennte?

    Es kommt nie eine Fehlermeldung etc, nur im deutschen Windows erscheint nix in der Datenbank (wurde also nix reingeschrieben) und im englischen Windows funktioniert es wunderbar!

    Mfg funword



  • funword schrieb:

    Es kommt nie eine Fehlermeldung etc,

    Du bist ja drollig. Wie soll denn eine Fehlermeldung kommen, wenn du im Fehlerfall einfach nichts machst?

    Ich vermute, retcode ist eben nicht SQL_SUCCESS oder SQL_SUCCESS_WITH_INFO. Ich vermute weiter, dass das an den Verbindungsdaten liegt, die du ja leider nicht gezeigt hast.



  • Entweder hast du ein Problem mit dem Datumswert. Englisch ist anders als Deutsch oder es gibt in der DE reservierte Schlüsselworter in der Datenbank die es im EN nicht gibt.
    Gibt dir mal den SQLQUERY in einer Datei oder so aus und versuche es direkt in der Datenbank abzusetzen. Die DB teilt dir dann schon mit wo das Problem liegt. BZw. kannst du dir den Fehler auch beim Code ausgeben lassen.



  • Vielen Dank fuer die schnellen Antworten...

    @MFK:

    MFK schrieb:

    funword schrieb:

    Es kommt nie eine Fehlermeldung etc,

    Du bist ja drollig. Wie soll denn eine Fehlermeldung kommen, wenn du im Fehlerfall einfach nichts machst?

    Ich vermute, retcode ist eben nicht SQL_SUCCESS oder SQL_SUCCESS_WITH_INFO. Ich vermute weiter, dass das an den Verbindungsdaten liegt, die du ja leider nicht gezeigt hast.

    Ja, da hast du recht 😮 Ich gebe echt nichts im Fehlerfall aus! Sollte ich mal machen 😉
    Die Verbindungsdaten sollten jedoch drinne sein! Und warum sollten die Verbindungsdaten aufm englischen Rechner funktionieren und auf dem deutschen nicht? Hier nochmal die verbindungsdaten:

    @Unix-Tome: Welchen Datumswert meinst du denn? Wenn du dich auf die Datumswerte im Sendestring beziehst, dann ist es unwahrscheinlich, da diese vorher korrekt ausgelesen, berechnet und ausgeben werden (Kann man hier nicht sehen, da ich nur diese Funktion gepostet habe 😛

    Du meinst dass die Datenbank anders ist? Das ist die gleiche Datei. Die sende ich vom einen auf den anderen PC.

    Waere nett, wenn du dies noch einmal erlaeutern koenntest:

    Unix-Tom schrieb:

    Entweder hast du ein Problem mit dem Datumswert. Englisch ist anders als Deutsch oder es gibt in der DE reservierte Schlüsselworter in der Datenbank die es im EN nicht gibt.
    Gibt dir mal den SQLQUERY in einer Datei oder so aus und versuche es direkt in der Datenbank abzusetzen. Die DB teilt dir dann schon mit wo das Problem liegt. BZw. kannst du dir den Fehler auch beim Code ausgeben lassen.

    Das Problem ist, dass ich nicht wirklich gut testen kann, da ich selber keinen deutschen PC habe und immer auf einen Freund zuruekcgreifen muss...is ja aber Wochenende und da muss er jetzt durch :p

    Koennte es vielleicht auch daran liegen, dass ich es auf dem englischen Computer compiled habe? Eigentlich doch nicht, oder?

    Vielen Dank
    Funword



  • Zum Testen verschiedener Betriebssystemvarianten bzw. Sprachversionen eignet sich VMWare gut. Die Testversion ist einen Blick wert.

    Ich verstehe auch nicht recht, warum du mit klassischem C auf eine Access-DB zugreifst.
    Unter C++ kann man die Datenzugriffsobjekte nutzen, die den Code doch sehr entschlacken von Overhead.

    Bei deiner Lösung fällt es mir schwer zu verstehen, was du eigentlich machen willst. Vielleicht könnte man auch das ganze Problem mit einem einzigen SQL-Statement lösen.

    Wenn du keinen C++ Compiler hast, dann würde ich das lieber direkt in Access mit VBA lösen. Außer natürlich das Problem ist zeitkritisch.
    Für reines C spricht eigentlich nur, wenn das Programm auf anderen Plattformen als Windows laufen soll.



  • Hi Fincki,

    Das Problem ist nur, dass ich bis jetzt nur reines C gelernt habe. Ich habe keine Zeit im Moment um eine andere Sprache zu lernen und dann das ganze Programm, welches bereits mehr als 3000 Zeilen hat, zu uebersetzen! 😕

    VMWare ist eine gute Idee, wenn ich hier drueben das deutsche Windows zur Verfuegung haette! (Ich bin im Moment ein Austauschschueler in den USA)!!

    Was ich machen will ist eigentlich recht simple. Ich habe zwei Datenbanken, wo eigentlich nur eine interessant ist. Die eine ist channellist und die andere scheduler. Aus der channellist wird nur ein Name ausgelesen.

    In die scheduler soll eine komplette Zeile hinzugefuegt werden, allerdings nur wenn dafuer nichts gefunden wird:

    sprintf (szSqlStr2, "SELECT ScheduleID FROM Schedules WHERE StartTime BETWEEN %f AND %f OR EndTime BETWEEN %f AND %f OR %f<StartTime AND %f>EndTime", starttime, endtime, starttime, endtime, starttime, endtime);
    

    Falls es dort einen Return Wert gibt, soll einfach nur ne Fehlermeldung ausgegeben werden. Funktioniert ja auch alles....auf dem englischen Windows *lol*

    Ist das ganze jetzt etwas verstaendlicher fuer dich?

    Mfg funword



  • Ich glaube, das einzige was dir jetzt helfen könnte wäre, daß du die Fehlerbehandlung erweiterst, so daß eine konkrete Fehlermeldung kommt.

    funword schrieb:

    Ist das ganze jetzt etwas verstaendlicher fuer dich?

    Ja, ein wenig, aber das nutzt jetzt nicht viel 😉

    Ich mache mal einen auf Oberlehrer:

    Der Schritt zu C++ ist nicht groß, wenn man schon C kann, da man auch erstmals wie gewohnt weiter programmieren kann und dann nach und nach die Vorzüge der Objektorientierung kennen lernt.

    Die Datenzugriffsobjekte (von MS z.B. DAO/ADO oder von Borland die BDE/DBExpress) vereinfachen den Umgang mit der Datenbank ungemein und ermöglichen es einem, sich beim Programmieren um die eigentlichen Probleme zu kümmern. Das macht den Code ungemein leserlicher (aber nur wenn man sich nicht zum "Zusammklicken" verleiten lässt und deswegen mit gebunden Steuerelementen arbeitet).

    Das sieht dann vereinfacht so aus:

    /*--------------------------------------------------------------
      PSEUDOCODE, nur fürs Prinzip (aber nahe angelehnt an BCB C++)
    ----------------------------------------------------------------*/
    
    try
    {
       //lesen aus Quelldatenbank
       DatabaseSrc->qrySchedule->SQLString = 
                   "SELECT ScheduleID "
                      FROM Schedules "
                    "WHERE StartTime "
                  "BETWEEN "+ f + 
                      "AND" + g + 
                      "OR (" + undsoweiterundsofort + ");
    
       DatabaseSrc->qrySchedule->Open(); //Abfrage ausführen
    
       while (!DatabaseSrc->qrySchedule->EOF) //durch alle Sätze blättern (EOF prüft auf letzten Datensatz)
       {
          //prüfen ob Satz in Zieldatenbank vorhanden ist
          DatabaseDes->qrySchedDes->SQLString = 
                     "SELECT ScheduleID "
                        FROM Schedules "
                      "WHERE " + DatabaseSrc->qrySchedule->FieldByName("Feldname")->AsString +
                       " and " + DatabaseSrc->qrySchedule->FieldByName("AnderesFeld")->AsString;
    
          DatabaseDes->qrySchedDes->Open(); //Abfrage ausführen
    
          if (DatabaseDes->qrySchedDes->EOF) //Kein Satz gefunden
          {
              DatabaseDes->qrySchedDes->SQLString = 
                         "INSTER INTO .... die ganzen Felder";
              DatabaseDes->qrySchedDes->Execute(); //Satz einfügen
          }
    
          DatabaseSrc->qrySchedule->MoveNext(); //auf den nächsten Datensatz in der Quelldatenbank blättern
       }
       DatabaseDes->Commit(); //Alle Inserts am Ende wegschreiben
    }
    catch(DatabaseError) //Datenbankfehler abfangen und Fehlermeldung ausgeben
    {
       DatabaseDes->Rollback(); //Alle Änderungen an der Datenbank rückgängig machen
       Fehlermeldung("Datenbankfehler beim Lesen" + DatabaseSrc->qrySchedule->ErrorMessage + "/nSQL: " + DatabaseSrc->qrySchedule->SQLString;
    }
    catch(...) //algemeiner Fehlerhandler
    {
       DatabaseDes->Rollback(); //Alle Änderungen an der Datenbank rückgängig machen
       Fehlermeldung(jajalauterFehler);
    }
    

    Das hilft die jetzt nicht viel bei deinem Problem, aber vielleicht siehst du wie man sich doch viel Arbeit sparen kann und auch den Code übersichtlich halten kann.
    Ich hoffe du kannst mein Beispiel nachvollziehen, C++ ist eigentlich einfacher.

    Aber erstmal solltest du die Fehlerbehandlung bei dir ausbauen, wie gesagt...

    Wow, das war ja jetzt ein riesen Post von mir 😃



  • Hey,
    Danke fuer den megapost 😃
    Man sieht wirklich, dass es einfacher ist 😮 Wenn ich Zeit habe, werde ich mich mit der C++ Entwicklung auseinandersetzen, das ist sicher!! 🕶

    Allerdings werde ich das nicht mehr auf diesem Programm einsetzen, da ich bereits fertig bin (wenn ich das Problem denn loese)...Ich habe mir mal nen logfile gebastelt und da ist alles von forne bis hinten gleich, bis auf die Returnwerte ab dem folgenden Punkt:

    Von da an returned jedes SQL Statement -1 im deutschen Windows, wobei im Englischen Windows immer 0 returned wird. 😮 Seltsam...Hat jemand eine Idee? 😕

    Naja, ich ahne es schon...Es wird wieder eine lange Nacht, aber das nimmt man als Hobbyprogrammierer ja gerne in Kauf 😋 🕶

    Mfg funword 🕶



  • hey...

    Ich habe es ja gleich gewusst, dass die Nacht lang wird 🙄
    Naja, auf jeden Fall habe ich das Problem analysiert, obwohl nocht nicht wirklich geloest! 🕶

    Das Problem ist das folgende (und eigentlich ganz simple und logisch):
    Im Englischen schreibt man Gleitkommazahlen so: 123.456
    Im Deutschen schreibt man Gleitkommazahlen so: 123,456

    Da kommt das Programm durcheinander. Jetzt weiss ich aber nicht, wie ich das aendern kann, da ich ja mit float arbeite und wie soll ich da das komma zu einem Punkt verwandeln 😕

    Hat irgendjemand eine Idee?

    Mfg funword



  • Den Verdacht hatte ich von Anfang an, aber dann habe ich nicht gesehen, wo du Floats einfügst und habe den Gedanken wieder verworden 🙄

    Vielleicht hilft dir der Thread hier ein bisschen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-137858



  • @everybody:
    Vielen Dank fuer die ausfuehrliche Unterstuetzung! Mein Problem ist jetzt geloest. THHHHHXXX 😃

    funword


Anmelden zum Antworten