Announcement

Collapse
No announcement yet.

TIBSql ( IBX 4.52 )

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TIBSql ( IBX 4.52 )

    Hi,

    Ich setze in einer Anwendung Generatorwerte mittels TIBSql. Nun habe ich da ein paar Kanditaten, bei denen ergibt das Setzen recht kuriose Ergebnisse. Das SQL-Statment 'SET GENERATOR AUFTRAEGE TO 1' trägt plötzlich irgendwelche Zahlen ein.

    Der gleiche Befehl über IBConsole abgesetzt funktioniert einwandfrei.

    Und ich bin mir sehr sicher, dass es auch über TIBSQL funtkionierte.

    Hat irgendwer schon ähnliches erlebt ?

    Gruß Gesine

  • #2
    Hallo,

    wie sieht ein konkreter Aufruf in der Implementierung mit TIBSQL aus

    Comment


    • #3
      Hi,

      Folgende Prozedur setzt die Generatoren:

      <PRE><CODE>
      procedure SetGenerator( const sTableName: String; const NewID: Integer; const InDB: TIBDataBase );
      var
      Generator : TIBSQL;
      Trans : TIBTransAction;
      begin
      Generator := TIBSQL.Create( FormMain );
      Trans := TIBTransAction.Create( FormMain );
      Try
      Trans.DefaultDatabase := InDB;
      Generator.Database := InDB;
      Generator.Transaction := Trans;
      Generator.SQL.Add( 'Set Generator '+sTableName+' to '+ IntToStr( NewID ) );
      Generator.Transaction.StartTransaction;
      Generator.ExecQuery;
      Generator.Close;
      Generator.TransAction.Commit;
      except
      on E: Exception do
      MessageDlg('Ich konnte den Generator '+sTableName+' nicht mir der Satzanzahl initialisieren.'+#13+#10+E.Message, mtError, [mbOK], 0);
      end;
      Generator.Free;
      Trans.Free;
      end;

      </PRE></CODE>

      Gru0 Gesin

      Comment


      • #4
        Hallo,

        ich habe das einmal nachgebaut, konnte das Problem jedoch nicht reproduzieren. Trotzdem habe ich die Implementierung etwas umgestellt:
        <pre>
        procedure SetGenerator( const sTableName: String; const NewID: Integer; const InDB: TIBDataBase );
        var
        Generator : TIBSQL;
        Trans : TIBTransAction;
        begin
        Generator := TIBSQL.Create( FormMain );
        Trans := TIBTransAction.Create( FormMain );
        Try
        Trans.DefaultDatabase := InDB;
        Generator.Database := InDB;
        Generator.Transaction := Trans;
        Generator.SQL.Add( 'SET GENERATOR '+sTableName+' TO '+ IntToStr( NewID ) );
        Generator.Transaction.StartTransaction;
        Generator.ExecQuery;
        Generator.TransAction.Commit;
        Generator.Close;
        except
        on E: Exception do
        MessageDlg('Ich konnte den Generator '+sTableName+' nicht mir der Satzanzahl initialisieren.'+#13+#10+E.Message, mtError, [mbOK], 0);
        end;
        Generator.Free;
        Trans.Free;
        end;
        </pre>
        Wird die Prozedur aus dem eigenen Programm mehrfach aufgerufen, so aktualisiert jeder Aufruf den Generator auf den richtigen Wert:
        <pre>
        procedure TFormMain.Button1Click(Sender: TObject);
        begin
        SetGenerator('GEN_TERMINID', StrToInt(EditGen.Text), FormMain.IBDatabaseMain);
        end;
        </pre>
        P.S: Ich würde sowohl die TIBSQL-Instanz als auch die zusätzliche TIBTransaction-Instanz im Datenmodul (Formular) ablegen und nicht bei jedem Aufruf neu erzeugen.
        &#10

        Comment


        • #5
          Hi,

          Wie ich befürchtet habe, lag das Problem an der Datenbank selbst. In dieser befanden sich Generatoren, deren Namen Umlaute enthielten. Das hat IB offensichtlich so gestört, dass auch 'korrekte' Namensangaben nicht mehr ordentlich funktionierten. Nach einem kompletten Neuaufbau ( Backup/Restore ging natürlich auch nicht mehr ) der DB funktioniert wieder alles wie erwartet. Extrem ärgerlich und gefährlich ist, dass IB Namensvergaben mit enthaltenen Umlauten nicht abfängt. Damit strebt die Tauglichkeit von Interbase für den 'echten' SQL-Einsatz bei den Nutzern gegen Null.

          Danke für die Bemühungen

          Gruß Gesin

          Comment


          • #6
            Hallo,

            in meinen Datenbank-Büchern steht dazu immer der Rat, nach <b>jeder</b> Änderung der Schemadaten (Metadaten) einen vollständigen Backup- und Restore-Zyklus abzuarbeiten. Der InterBase hat nun mal die Eigenheit, dass das Veto erst beim Restore kommt, aber nicht bereits beim Backup

            Comment


            • #7
              Hi,

              Ich glaub' mindestens ein solches ein Buch hab' ich auch ;-). Das IB erst beim Restore eine 'korrekte' Überprüfung der Daten vornimmt ist unpraktisch aber zu verkraften. Das der IB-Parser aber DDL-Statements durchlässt, die den selbst definierten Standard verletzen, ist in Verbindung damit mehr als nur ärgerlich. Ein einziger Tippfehler beim Erzeugen eines Views reicht ja offensichtlich schon, IB in einen undefinierten Zustand zu versetzen. Und ein Befehl CREATE VIEW WÄHRUNGEN... ist schnell abgesetzt. Hat man nun User, die eine DB auch so anfassen, dann wird das mit dem Backup/Restore schon schwierig.

              Gruß
              Gesin

              Comment

              Working...
              X