SQL Abfrage-String problem

  • VB.NET

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    SQL Abfrage-String problem

    Hallo,

    ich möchte eine SQL DB abfragen mit mehreren bedingungen:

    VB.NET-Quellcode

    1. Dim statement As String = "SELECT * FROM FSK_IO_DATA WHERE LINE_NR = " & line & " AND DATE_FROM >=CONVERT(DATETIME," & date1 & ", 104) AND DATE_TO <=CONVERT(DATETIME," & date2 & ", 104) "


    nun wird per msg ausgegeben: incorect syntax near'.2014'.

    VB.NET-Quellcode

    1. Dim line As String = TB3.Text
    2. Dim date1 As Date = VonCalendar1.SelectionStartDim date2 As Date = BisCalendar2.SelectionEnd
    3. Dim sch1 As String = VonSchicht.TextDim sch2 As String = BisSchicht.Text
    4. Dim statement As String = "SELECT * FROM FSK_IO_DATA WHERE LINE_NR = " & line & " AND DATE_FROM >=CONVERT(DATETIME," & date1 & ", 104) AND DATE_TO <=CONVERT(DATETIME," & date2 & ", 104) "Dim dt As New DataTable("Temp")
    5. Dim Sql_DA As New SqlDataAdapter(statement, m_SqlCon)
    6. Try
    7. Sql_DA.Fill(dt)
    8. Catch ex As ExceptionMessageBox.Show(ex.Message)
    9. End TryWith DGV
    10. .DataSource = Nothing
    11. .DataSource = dt.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
    12. .ShowCellErrors = False
    13. .ShowRowErrors = False
    14. End With


    was mache ich falsch?
    Verwende für solche SQL-Abfrage IMMER Db-Paramater:
    [VB.NET] Tipp & Trick: DbParameter

    Mit dieser Methode werden die Parameter, welche du übergibst, automatisch korrekt für den SQL-Server übersetzt.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    P8310 schrieb:

    VB.NET-Quellcode

    1. "... DATE_FROM >=CONVERT(DATETIME," & date1 & ", 104) ..."

    Das löst auf zu:
    "... DATE_FROM >=CONVERT(DATETIME, 24.02.2014, 104) ..."
    Und mit dieser Form des Datums kann SQL gar nix anfangen.

    Wie fichz schon sagte: Benutze DbParameter. Oder wenn es partout nicht anders geht, sorge dafür, dass der Teil, wo das Datum steht, korrekt zusammengebaut wird. Da ich vermeiden möchte, dass du dich zugunsten einer "heißgestrickten" Quick-and-Dirty-Lösung gar nicht erst mit DbParametern auseinandersetzt, gebe ich zu korrekten Formatierung von Datumswerten in SQL erstmal keine Tipps... 8-)
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    aktueller stand:



    VB.NET-Quellcode

    1. Dim line As String = TB3.Text
    2. Dim date1 As String = TB5.TextDim date2 As String = TB6.Text
    3. Dim statement As String = _
    4. "SELECT* FROM [FSK_IO_DATA] WHERE [LINE_NR] = '" & line & "' AND [DATE_FROM] BETWEEN '" & date1 & "' AND '" & date2 & "'"




    bis line geht es , aber mit der Between mag es noch nicht so gehen.Der DB wert in Spalte date_from sieht z.B so aus 25.02.2014 22:00:00, was auch TB6 wieder gibt



    TB-Parameter ist sicher die beste lösung, aber mich da jetzt durchfuchsen...schwer für mich

    P8310 schrieb:

    [...] aber mich da jetzt durchfuchsen...schwer für mich

    Besser jetzt und gleich alles richtig machen, als später und alles wieder ändern müssen!
    Ich Antworte nach bestem Wissen und Gewissen. Ich übernehme keine Garantie für die Richtigkeit oder Fehlerfreiheit meiner Texte.


    Ich konnte dir helfen?
    - Das ist schön :) Ich würde mich über ein "Hilfreich" freuen ^^
    Normalerweise gilt ja immer: "Viel hilft viel!". Aber manchmal gilt auch eher: "viele Köche verderben den Brei."
    Versuche also lieber nicht, dich durch 2 Threads gleichzeitig durchzufuchsen, denn da musste evtl. auch noch durchfuchsen, worin sich die verschiedenen Ansätze unterscheiden.
    ...bitte um hilfe, ich raf das mit parameter einfach nicht...

    derzeit immer noch:

    VB.NET-Quellcode

    1. Dim line As String = TB3.Text
    2. Dim date1 As DateTime = VonCalendar1.SelectionStartDim date2 As DateTime = BisCalendar2.SelectionStart
    3. Dim statement As String = _
    4. "SELECT* FROM [FSK_IO_DATA] where [LINE_NR] = '" & line.ToString() & "' And [DATE_FROM] > = CONVERT(datetime, '" & date1 & "', 120) " '"Dim dt As New DataTable("Temp")
    5. Dim Sql_DA As New SqlDataAdapter(statement, m_SqlCon)
    6. Try
    7. Sql_DA.Fill(dt)
    8. Catch ex As ExceptionMessageBox.Show(ex.Message)
    9. End TryWith DGV
    10. .DataSource = Nothing
    11. .DataSource = dt.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
    12. .ShowCellErrors = False
    13. .ShowRowErrors = False
    14. End With




    bekomme auch werte, aber vertauscht also gehe ich auf calendar 01.02.2014 kommen werde von 02.01.2014
    sieht mir sehr nach einem völlig vermurksten Einstieg in die Datenbänkerei aus.
    Einzige wirkliche Hilfe könnte sein, es nochmal von vorne und richtig zu lernen: Datenbänkerei-Einstieg
    Das lehnst du vmtl. aus Zeitmangel ab, hmm.

    Und u.U. ist selbst dein Datenmodell in der Datenbank fehlerhaft. Mit welchem Datentyp sind denn in der DB die folgenden Tabellenspalten angelegt?
    1. LINE_NR
    2. DATE_FROM
    3. datetime
    haste eiglich mal die von mir gegebenen Links angeguckt?
    Ein Buch empfehle ich ja garnet. Bücher zur Datenbänkerei führen ja meist in den vermurksten Einstieg, weil sie auch nur die DB-Seite beleuchten, und die .Net-Seite vernachlässigen.
    Ordentliche Architektur wird aber auf der .Net-Seite gemacht.
    Die Db ist dabei nur eine Datensenke, und zumindest während der Entwicklung die schlechtere von beiden Möglichkeiten.

    zB DbParameter zu verwenden ist schon auf dem Holzweg, denn beim typisierten Dataset nimmt man besser gleich DataAdapter. Die können alle 4 Sachen: SELECT, DELETE, INSERT, UPDATE in einer Einheit, und die DbParameter dafür haben sie bereits eingebaut.
    Also guck mal die Links, und nicht wieder allen möglichen Kram gleichzeitig.
    ja hab alles gesehen, ausser DataAdapter

    unsere DB'en sind fertig und werden automatisiert gefüllt, darin kann ich nichts machen. und nun seit meinem vba ausstieg, kommt das thema DB was ich eben nie brauchte bis jetzt. aber ! alles hat ein anfang.

    also: nur nochmal kurz, DB'en ordendlich lesen, schreiben, löschen sollte über DataAdapter gemacht werden?
    ja
    aber zuvor noch: aus der Db das typisierte Dataset generieren. Dabei werden dann auch typisierte TableAdapter generiert, und wenn du das Gesamtsystem typDataset+typTableAdapter niemals mehr modifizierst, dann funzt das auch, so Gott will.
    Nur meist muss man doch dran rumfummeln, und dann kommts zu Fehlern, weil der eine Generator nicht weiß, was der annere macht.


    Ich empfehle trotzdem die Entwicklung ohne DB, weil das ist viel stabiler, lädt schneller, und in deim Fall zerschiesst du nicht das Produktiv-System.

    Also einmal das ganze gesummse generieren, mit den typTableAdaptern möglichst alles befüllen, und dann das typDataset mit .WriteXml auf Platte schreiben.
    Hoffentlich geht das, und eure Db ist nicht zu fett - so 20MB ist kein Problem, mw auch 100MB - man kann ja aus dem TestDataset auch sehr einfach 3/4 wieder rauslöschen.

    jdfs. wenn das typDataset als xml auf Platte liegt, am besten die typTableAdapter ganz entfernen, und DatasetOnly entwickeln.

    also die Dataset-Generiererei geht ungefähr (achtung: veraltet) wie in "Datenbank in 10 Minuten" auf Movie-Tuts.
    Oder gugge dir auch die Forms over Data Videos an - nur hüte dich vor den bescheuerten TryCatchens, die die überall hinbaut - TryCatch ist ein heißes Eisen
    okay so wird ein schuh drauß, ich sehe mir das an und erstelle auf dieser basis mein proj. danke dir



    "09:23" hab mal kurz geschaut, das ist ein vollkommen anderer ansatz als ich verwende, schau mir das heute abend in ruhe an. danke

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „P8310“ ()

    kleine frage: der datenquell assistent, ist dieser unter express eingeschränkt ?



    "11:51" okay hab die info





    Brauchst du doch garnet.
    Ich empfehle eh immer, erst ohne DB zu entwickeln, und eine DB später unterzuschieben.
    Wäre dann natürlich einfacher, wenn man Assistenten nutzen könnte, die dann aus der DB das Dataset generieren. Aber tatsächlich sind als erstes die ganzen generierten TableAdapter aus dem Dataset-Designer wieder rauszuschmeißen, denn die Dinger sind irrsinnig und unnötig aufgeblasen.



    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „P8310“ ()