Announcement

Collapse
No announcement yet.

Firebird und SQL

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

  • Firebird und SQL

    hallo,

    ich greife mit ADO.NET 2.0 auf eine Firebird-Datenbank zu (.net Data Provider 2.1.0) und wundere mich darüber, dass die SQL-Befehle wie LIKE oder BETWEEN nicht richtig funktionieren.

    Das DB-Feld ist ein string-Feld und enthält Datums-Angaben (deutsches Format). Wenn ich jetzt z.B. nur alle Einträge für 2006 haben möchte, könnte man das ja mit LIKE oder BETWEEN erledigen.

    LIKE '*2006' bringt jedoch keine Datensätze (bei ACCESS geht's).

    BETWEEN '01.01.2006' AND '31.12.2006' bringt zuwenig Datensätze.

    Woran könnte das liegen? Leider habe ich von Firebird zu wenig Ahnung. Gibt es hier vielleicht eine andere SQL-Syntax? Oder kann es noch andere Gründe geben?

    Vielen Dank im Voraus.

    MfG Michael Strauß

  • #2
    Verwende parametriesierte Abfragen. Datumsfelder sind bei direkter Verwendung immer Query kritisch! Das es bei ACCESS ist eher Glück als das man dies als Referenz verwenden sollte

    Comment


    • #3
      Hallo Bernhard,

      vielen Dank für die schnelle Antwort. Ich habe deinen Rat gleich mal ausprobiert.

      Leider immer noch das gleiche Verhalten!

      Hier mein C#-Code:

      string SQL = "SELECT * FROM xyz WHERE DATUM BETWEEN @Zeitraum1 AND @Zeitraum2";

      // Create a connection object.
      FbConnection connection = new FbConnection(ConnString);

      // Create a Command oject
      FbCommand cmd = new FbCommand();
      cmd.Connection = connection;
      cmd.CommandText = SQL;
      cmd.Parameters.AddWithValue("@Zeitraum1", "01.01.2006");
      cmd.Parameters.AddWithValue("@Zeitraum2", "31.12.2006");
      ....

      Hast Du noch eine Idee, woran es liegen könnte?

      Danke Michael Strauß

      Comment


      • #4
        Welchen Typ hat das Feld?
        Code:
        ... where Extract (year from <feld>) = 2006 ...

        Comment


        • #5
          Hallo,

          ich habe die Vermutung, dass Du das Problem des Datentyps damit nur verlagerst. Meine Idee ist: AddWithValue interpretiert das an dieser Stelle als String und übergibt es als String an Firebird.

          Du solltest sicherstellen, dass AddWithValue den Wert wirklich und zweifellos als DateTime erkennt, z.B.:
          Code:
          cmd.Parameters.AddWithValue("@Zeitraum1", new DateTime(2006,1,1));
          cmd.Parameters.AddWithValue("@Zeitraum2", new DateTime(2006,12,31));
          Viel Erfolg! Jürgen

          Nachtrag:
          Zitat von michael.strauss
          Das DB-Feld ist ein string-Feld und enthält Datums-Angaben (deutsches Format).
          Ach je, wer lesen kann, ist klar im Vorteil. Datumsangaben wollte ich "selbstverständlich" als Date(Time) speichern...

          Du kannst noch die Standard-UDF SUBSTR() bzw. SUBSTRING() sowie EXTRACT(YEAR FROM DATE) verwenden.
          Zuletzt editiert von Jürgen Thomas; 11.07.2007, 17:50. Reason: Nachtrag hinzugefügt

          Comment


          • #6
            Originally posted by michael.strauss View Post
            ...
            Das DB-Feld ist ein string-Feld und enthält Datums-Angaben (deutsches Format). Wenn ich jetzt z.B. nur alle Einträge für 2006 haben möchte, könnte man das ja mit LIKE oder BETWEEN erledigen.
            ...
            Wenn das Feld in der DB vom Datentyp String ist, dann wirst du mit Parametern hoch und runterspringen können er wird dir immer einen (zur Not impliziten) String-Vergleich machen. Hier hilft nur die explizite Typkonvertierung. Leider kenn ich den Funktionsumfang vom Firebird nicht aber irgend sowas wie TO_DATE, TO_CHAR oder CAST sollte es eigentlich geben.

            Originally posted by michael.strauss View Post
            ...
            LIKE '*2006' bringt jedoch keine Datensätze (bei ACCESS geht's).
            ...
            Der Platzhalter in SQL ist das % und nicht *! (Wer ist ACCESS )

            Gruß Falk

            <offToppic>Den Doppelpost im Firebird-Forum habe ich gelöscht und den dortigen Beitrag von Markus Kinzler hierher verschoben</offToppic>
            Zuletzt editiert von Falk Prüfer; 11.07.2007, 17:10.
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Hallo Leute,

              vielen Dank für die rege Anteilnahme.

              Die Sache funktioniert jetzt. Mein Fehler war, dass Access zuviel Datensätze selectiert hat (weil ich das DISTINCT vergessen habe), und nicht Firebird zuwenig.

              Da das Datenbankfeld string ist, funktioniert sowohl DateTime(2006,1,1) als auch "01.01.2006" in der Parameterliste.

              Trotzdem nochmals vielen Dank.

              Gruß, Michael

              Comment

              Working...
              X