none
Datenbank,SELECT,DATE RRS feed

  • Frage

  • Hallo, ich bitte wieder einmal um Hilfe.
    Wann immer ich mit SELECT und DATE etwas unternehme gibt es Troubles !
    Als Anfänger möchte ich meine Fortschritte mit dem wahrscheinlich sattsam bekannten Geburtstagsprogramm erproben.
    Daraus meine Frage :
    - Ich habe eine PuTag.mdb angelegt
    - darin ua. ein Datumsfeld vglDat in der Form #mm/dd/yyyy#
    - zur Laufzeit erzeuge ich ein Datum aktDat, ebenfalls in der Form #mm/dd/yyyy#
    - zur Laufzeit erzeuge ich auch die beiden Grenzen 'von' und 'bis' (zB. von -3 bis +3 Tagen um aktDat)
    - ich möchte alle Sätze selectieren bei denen
            der Name nicht 'NN' ist
            das Jahr nicht '0000' ist
            und bei denen die Differenz zwischen den beiden Daten vglDat und aktDat innerhalb von 'von' bis 'bis' liegt.
    - liegt vglDat in diesem Bereich um aktDat möchte ich eine Meldung ausgeben
    - dazu verwende ich nachfolgenden Code :
         
    da = new OleDbDataAdapter("SELECT ID,Name,vglDat,Tag,Mon,Jahr FROM PuTag " +
            "WHERE NOT(Name = 'NN') " +
            "AND NOT(Jahr = '0000') " +
            "AND DATEDIFF('d',vglDat,'"+aktDat+"', BETWEEN von AND bis) " +
            "ORDER BY Tag ASC", conn);

    Es ist zum verzweifen !
    Welche DatenFormate ich auch immer für von/bis/vglDat/aktDat verwende, es kommt immer :
    Datentypen in Kriterienausdruck unverträglich !
    Die Differnz von aktDat und vglDat in Tagen müsste doch ein +-int sein oder ?

    Kann mir bitte jemand zeigen, wie man diese Grössen in den SELECT - String einbauen muss ?
    Ich verwende Visual C# 2008 EXPRESS, Access Datenbanken

    Nachträglich noch alles Gute für 2010 !!
    Vielen Dank für Eure Mühe.
    Hermann
     
    Freitag, 1. Januar 2010 20:03

Antworten

  • Hi Hermann,
    versuche bitte erst einmal mein Beispiel. "Datentypen in Kriterienausdruck unverträglich" bedeutet, dass die von dir gewählten Typen nicht zueinander passen. Die Reihenfolge der Parameter muss genau zur Reihenfolge (von links nach rechts) der Platzhalter (Fragezeichen) passen. DATEDIFF ist keine SQL-Funktion. Darauf solltest du verzichten und analog meinem Beispiel verfahren, z.B. so:

    da = new OleDbDataAdapter("SELECT ID, Name, vglDat, Tag, Mon, Jahr FROM PuTag WHERE NOT Name = ? AND NOT Jahr = ? AND vglDat BETWEEN ? AND ? ORDER BY Tag ASC")

    Danach sind dem Command-Objekt nur noch die Parameterobjekte mit den Werten hinzuzufügen:

    da.SelectCommand.Parameters.AddWithValue("@p1", "NN");
    da.SelectCommand.Parameters.AddWithValue("@p2", '0000');
    da.SelectCommand.Parameters.AddWithValue("@p3", von);
    da.SelectCommand.Parameters.AddWithValue("@p4", bis);

    --
    Peter
    Samstag, 2. Januar 2010 22:02
  • Hallo Hermann,
    eine SQL-Anweisung ist eine Zeichekette. Wenn du darin Datzmswerte einbauen (verketten) willst, dann musst du die Datumswerte in die von der Jet gewünschte Datumsdarstellung konvertiertieren, so dass das leztendlich so aussehen muss:

    SELECT ID, Name, vglDat, Tag, Mon, Jahr FROM PuTag WHERE NOT Name = 'NN' AND NOT Jahr = 0 AND #01/02/2010# BETWEEN von AND bis ORDER BY Tag ASC

    Besser ist es in jedem Fall aber mit Parameter-Objekten zu arbeiten. Da brauchst du dir um die Typkonvertierung kein Gedanken mehr zu machen. Die Jet erartet für jeden Parameter ein Fragezeichen als Platzhalter, z.B. so:


    da = new OleDbDataAdapter("SELECT ID, Name, vglDat, Tag, Mon, Jahr FROM PuTag WHERE NOT Name = ? AND NOT Jahr = ? AND ? BETWEEN von AND bis ORDER BY Tag ASC")

    Danach sind dem Command-Objekt nur noch die Parameterobjekte mit den Werten hinzuzufügen:

    da.SelectCommand.Parameters.AddWithValue("@p1", "NN");
    da.SelectCommand.Parameters.AddWithValue("@p2", 0);
    da.SelectCommand.Parameters.AddWithValue("@p3", datumswert);

    --
    Peter
    Samstag, 2. Januar 2010 04:43

Alle Antworten

  • Hallo Hermann,
    eine SQL-Anweisung ist eine Zeichekette. Wenn du darin Datzmswerte einbauen (verketten) willst, dann musst du die Datumswerte in die von der Jet gewünschte Datumsdarstellung konvertiertieren, so dass das leztendlich so aussehen muss:

    SELECT ID, Name, vglDat, Tag, Mon, Jahr FROM PuTag WHERE NOT Name = 'NN' AND NOT Jahr = 0 AND #01/02/2010# BETWEEN von AND bis ORDER BY Tag ASC

    Besser ist es in jedem Fall aber mit Parameter-Objekten zu arbeiten. Da brauchst du dir um die Typkonvertierung kein Gedanken mehr zu machen. Die Jet erartet für jeden Parameter ein Fragezeichen als Platzhalter, z.B. so:


    da = new OleDbDataAdapter("SELECT ID, Name, vglDat, Tag, Mon, Jahr FROM PuTag WHERE NOT Name = ? AND NOT Jahr = ? AND ? BETWEEN von AND bis ORDER BY Tag ASC")

    Danach sind dem Command-Objekt nur noch die Parameterobjekte mit den Werten hinzuzufügen:

    da.SelectCommand.Parameters.AddWithValue("@p1", "NN");
    da.SelectCommand.Parameters.AddWithValue("@p2", 0);
    da.SelectCommand.Parameters.AddWithValue("@p3", datumswert);

    --
    Peter
    Samstag, 2. Januar 2010 04:43
  • Hallo Peter,
    vielen Dank für die prompte Antwort.
    Ich habe sie sofort wie unten angewendet.

    da = new OleDbDataAdapter("SELECT ID,Name,vglDat,Tag,Mon,Jahr FROM PuTag " +
                                    "WHERE NOT Name = ? " +
                                    "AND NOT Jahr = ? " +
                                    "AND DATEDIFF('d',vglDat,?) BETWEEN ? AND ? " +
                                    "ORDER BY Tag ASC", conn);

          da.SelectCommand.Parameters.AddWithValue("@p1", "NN");
          da.SelectCommand.Parameters.AddWithValue("@p2", "0000");
          da.SelectCommand.Parameters.AddWithValue("@p3", aktDat);
          da.SelectCommand.Parameters.AddWithValue("@p4", von);
          da.SelectCommand.Parameters.AddWithValue("@p5", bis);

    Leider kommt noch immer die genannte Fehlermeldung.
    Es kommt immer noch : Datentypen in Kriterienausdruck unverträglich !

    Übrigens : Beim Erstellen kommt folgende Warnung 2 mal (also für 2 Parameter ?) :
    Warnung    1    Mindestens ein Argument für "IasHelper.Process" kann nicht vom Laufzeitmarshaller gemarshallt werden. Diese Argumente werden deshalb als Zeiger übergeben und erfordern zum Ändern möglicherweise unsicheren Code.   
    Und dazu :Warnung    3    Der Typbibliothekimporter konnte die Signatur für den Member "_IAS_OCTET_STRING.lpValue" nicht konvertieren. 

    Kann das weiter helfen ?
    Damit alles klar ist :
    -Name,Tag,Mon,Jahr sind Strings
    -vglDat ist ein Datum ( #mm/dd/yyyy#) , Spalte in der Datenbank
    -aktDat ist ein zurLaufzeit erstelltes Datum, Format wie vorhin
    -von und bis sind int, zur Laufzeit erstellt

    Angeregt durch deinen Hinweis habe ich auch folgende Form für die Parameter gefunden :

          da.SelectCommand.Parameters.Add("?", OleDbType.VarWChar).Value = "NN";
          da.SelectCommand.Parameters.Add("?", OleDbType.VarWChar).Value = "0000";
          da.SelectCommand.Parameters.Add("?", OleDbType.DBDate).Value = aktDat;
          da.SelectCommand.Parameters.Add("?", OleDbType.Integer).Value = von;
          da.SelectCommand.Parameters.Add("?", OleDbType.Integer).Value = bis;

    Aber damit geht es auch nicht !
    Ist es richtig, dass die Folge der Fragezeichen im SELECT mit der Folge der Parameterdefinition
    übereinstimmen muss ?
    Ist die DATEDIFF zwischen 2 Datumswerten  eine integer, oder anders : Welches Format hat 'd' in
    der DATEDIFF-Anweisung ?

    Was kann ich sonst noch machen, um das Ding zum Laufen zu bringen ?
    Vielen Dank für deine Hilfe !
    Hermann
    Samstag, 2. Januar 2010 11:45
  • Hi Hermann,
    versuche bitte erst einmal mein Beispiel. "Datentypen in Kriterienausdruck unverträglich" bedeutet, dass die von dir gewählten Typen nicht zueinander passen. Die Reihenfolge der Parameter muss genau zur Reihenfolge (von links nach rechts) der Platzhalter (Fragezeichen) passen. DATEDIFF ist keine SQL-Funktion. Darauf solltest du verzichten und analog meinem Beispiel verfahren, z.B. so:

    da = new OleDbDataAdapter("SELECT ID, Name, vglDat, Tag, Mon, Jahr FROM PuTag WHERE NOT Name = ? AND NOT Jahr = ? AND vglDat BETWEEN ? AND ? ORDER BY Tag ASC")

    Danach sind dem Command-Objekt nur noch die Parameterobjekte mit den Werten hinzuzufügen:

    da.SelectCommand.Parameters.AddWithValue("@p1", "NN");
    da.SelectCommand.Parameters.AddWithValue("@p2", '0000');
    da.SelectCommand.Parameters.AddWithValue("@p3", von);
    da.SelectCommand.Parameters.AddWithValue("@p4", bis);

    --
    Peter
    Samstag, 2. Januar 2010 22:02
  • Hallo Peter,
    dank deiner Hilfe habe ich es geschafft.
    Der SELECT - Command macht jetzt was ich will.
    Ich musste dazu nur noch die beiden Grenzwerte von-bis auf
    ein Datumsformat umstellen.

    Vielen Dank !!
    Hermann
    Dienstag, 5. Januar 2010 18:21