'Convert' Funktion in SQL Statement

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von raist10.

    'Convert' Funktion in SQL Statement

    Hallo,

    ich habe folgendes Problem. Ich würde in einer Abfrage gern ein Feld mit dem Datentyp DateTime in Text umwandeln. Hab alle möglichen Variationen des Convert Befehls versucht doch komme ich nicht weiter - "ungültiger Typname 'xxxx'".
    Soll am Ende also in etwa so aussehen:

    SQL-Abfrage

    1. select * from stammdaten where Convert(Gebdatum,char) LIKE ...


    Kann mir da wer helfen?

    Gruß
    Dirk

    achso...das ganz läuft über Jet OleDB 4.0
    Boah ey ... das kann nicht funzen. ^^

    Wie auch ... SQL versteht KEIN VB.NET. In VBA klappt sowas schon, aber nicht mehr in NET ... ausser Du legst eine eigene Funktion in einem Public Modul als Public Function an. Dann müsste eigentlich der Connection zur Ausführung die Funktion finden und ausführen können. Aber das wäre so oder so Bullshit ... Du wandelst das Abfragefeld um und das muss bei jedem DS ausgeführt werden, was erstens die Indexnutzung verhindert und zweitens exorbitant Zeit kostet.

    Wandel lieber das Kriterium um, das wird nur ein einziges mal beim erstellen der SQL-Strings ausgeführt.

    Also eher so:

    VB.NET-Quellcode

    1. strSQL = "select * from stammdaten where Gebdatum LIKE #" & convert.ToDate(MeinChar).ToString("yyyy-MM-dd") & "#"


    Ist die viel elegantere Lösung und ca. um den Faktor 1000 schneller.

    Merke: NIEMALS links vom Operator im WHERE-Teil die Formatierung anpassen oder sonstwas damit anstellen, IMMER NUR rechts vom Operator.

    Gruß

    Rainer
    Danke erstmal für die Antworten. Dann verabschiede ich mich von dem Gedanken. Hintergrund war einfach der, dass ich eine Tabelle Stammdaten habe mit mehreren Spalten (Vorname, Nachname, Straße, Ort, PLZ, Gebdatum...). Diese Daten werden in einem DGV dargestellt.
    Oberhalb des DGV ist ein Textfeld und jedesmal wenn ich in dieses Textfeld etwas eingebe wird der DataView Rowfilter aktualisiert und alle Spalten durchsucht.
    Also so:

    VB.NET-Quellcode

    1. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    2. dv.RowFilter = "Vorname Like '%" & TextBox1.Text & "%' OR Nachname Like '%" & TextBox1.Text & "%' OR Kundennummer Like '%" & TextBox1.Text & "%' OR Straße Like '%" & TextBox1.Text & "%' OR [b]convert(Gebdatum, text) Like '%" & TextBox1.Text & "%'[/b] OR Ort Like '%" & TextBox1.Text & "%'"
    3. DGVStammdaten.DataSource = dv
    4. End Sub

    Dann müsste ich wohl 2 Abfragen machen einmal mit dem Geburtsdatum und einmal ohne. Ich prüfe dann über RegEx ob in Textbox1 ein Date-konformes Format steht und starte dann eine der beiden Abfragen. Oder?

    picoflop schrieb:

    - WENN es T-SQL wäre, was wir ja nicht wissen


    Verdammt ... u are right. Hatte Transact völlig vergessen. ^^

    @ kinobi

    Du kannst die Abfrage ja so stehen lassen, bloss eben nicht links vom Operator anpassen sondern rechts vom Operator eben die TextBox prüfen/kontrollieren und in entsprechendes Format bringen und jut ist.

    Gruß

    Rainer
    Ja gut...dann mach ich es so und prüfe den Inhalt der Textbox. Wäre halt nur sehr schön gewesen, dass wenn ich in das Textfeld ne 1961 eingebe, alle Kunden angezeigt werden die 1961 im Geburtsdatum haben. Deswegen auch die Umwandlung in Text. Wäre halt super bequem gewesen.

    Gruß
    Dirk

    kinobi schrieb:

    Ja gut...dann mach ich es so und prüfe den Inhalt der Textbox. Wäre halt nur sehr schön gewesen, dass wenn ich in das Textfeld ne 1961 eingebe, alle Kunden angezeigt werden die 1961 im Geburtsdatum haben. Deswegen auch die Umwandlung in Text. Wäre halt super bequem gewesen.

    Gruß
    Dirk


    Mach das doch. ^^

    VB.NET-Quellcode

    1. " ... Gebdatum >= #" & DateValue("01.01." & textbox.Text) & "#"


    Geht alles mit SQL, man muss nur lernen etwas kreativer zu denken. *fg*

    Klar ... das es nicht ganz so einfach ist, aber Du kannst ja den Wert in TextBox einer eigenen Funktion überprüfen und dann je nach Inhaltsfall passend für das SQL-Statement zurück werfen.

    Gruß

    Rainer

    picoflop schrieb:

    raist10 schrieb:

    " ... Gebdatum >= #" & DateValue("01.01." & textbox.Text) & "#"

    Oder man macht's gleich richtig und verwendet eine parametrisierte Abfrage und nicht diesen vorsintflutlichen Kram ...

    BTW:
    msdn.microsoft.com/en-us/library/ms186313.aspx

    Daraus folgt:
    SELECT * FROM tabelle WHERE YEAR(GebDatum) = @year_param


    Aber eine Parameter-Abfrage kann nicht als Row.Filter eingesetzt werden. ;)

    Gruß

    Rainer

    kinobi schrieb:


    Steht also die abschließende Aussage, dass es keine Möglichkeit gibt per SQL Befehl ein DateValue in einen String zu wandeln um diesen dann für einen RowFilter zu nutzen. (Das Gemeinte ist zu entnehmen :P )


    Natürlich gibt es den. *seufz*

    VB.NET-Quellcode

    1. " ... WHERE DAY(GebDatum) + '.' + MONTH(GebDatum) + '.' + YEAR(GebDatum) = '" & MeinDateString & "' .... "
    2. '// oder wenn nur das Jahr verglichen werden soll:
    3. " ... WHERE YEAR(GebDatum) = '" & MeinDateString & "' .... "


    Gruß

    Rainer