SQL Exception mit Northwind Datenbank

  • VB.NET

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

    SQL Exception mit Northwind Datenbank

    Ich habe mir ein "Datareader" geschrieben um im DataGridView zu nach vorhandenen Datensätze zu Filtern. Dabei habe ich einfach die SQL Datenbank von Northwind (bei mir unter C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Samples gespeichert) über Datenquellen hinzugefügt. ;)

    Nun bekomme ich aber beim Debuggen eine SQL Exception. :S
    Fehlermeldung

    Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob SQL Server Remoteverbindungen zulässt. (provider: SQL Network Interfaces, error: 26 - Fehler beim Bestimmen des angegebenen Servers/der angegebenen Instanz)


    Was das bedeutet, ist mir klar. Er kann einfach die SQL Datenbank nicht finden. Normalerweise sind auch alle Datenbankverbindungen bei mir unter C:\Users\MeinPC\Documents gespeichert. Die Northwind hingegen nicht. Eine ZIP Datei konnte ich hier leider nicht hochladen, weil diese zu groß war. Sie steht aber hier zur Verfügung .

    Um eure Hilfe freue ich mich sehr... :thumbsup:
    Dim conn as New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Nordwind.mdb;")

    Hierbei mußt du anstatt Nordwind.mdb den Namen deiner Datenbank angeben. Dieser String setzt allerdings voraus, dass die Datenbank im Debug-Verzeichnis liegt, ansonnsten mußt du den Pfad mit angeben.
    Grundsätzlich arbeite ich mit typ. Datasets. ;) Ich wollte nun einmal ausprobieren, mit einer SQL Datenbank zu arbeiten.
    Jetzt habe ich es einfach ein bissl umgestöpselt und versuche, über das DataGridView zu Filtern.

    VB.NET-Quellcode

    1. Private Sub txtSearch_TextChanged(sender As System.Object, e As System.EventArgs) Handles txtSearch.TextChanged
    2. Dim dv As DataView
    3. Dim str As String
    4. str = txtSearch.Text
    5. dv = New DataView(NorthwindDataSet.Tables(0))
    6. dv.RowFilter = "Contact Name = '" & str & "'"
    7. CustomersDataGridView.DataSource = dv.ToTable
    8. End Sub


    Hm, nun bekomme ich aber den Fehler: Syntaxfehler: Fehlender Operand nach dem Operator 'Name'. :S Klar funktionieren SQL Commands nicht im Dataset, nur wie ist der richtige Lösungsansatz?
    Ah, Danke! :thumbsup:
    Es hat mir erstmal weitergeholfen. Das Filtern nach einem kompletten String funktioniert wunderbar.

    VB.NET-Quellcode

    1. If txtSearch.Text = "" Then
    2. CustomersBindingSource.Filter = ""
    3. Else
    4. CustomersBindingSource.Filter = "City = '" & txtSearch.Text & "'"
    5. End If


    Nun möchte ich zB., dass alle Städte beginnend mit dem eingegebenen String gefiltert werden. Dazu muss der Operator LIKE verwendet werden. Wie funktioniert dies genau? :S
    Lies das Tut.
    Wenns da nicht direkt drinsteht (glaub ich aber), dann ist dort zumindest auf die Syntax-Doku inne MSDN verlinkt, was zu studieren ja eh empfehlenswert wäre.

    Drüber hinaus kanns du die Sample-Anwendung bischen als Syntax-Tester nutzen, als selbst was mit "Like" formulieren, und gugge, was passiert.
    Ich habe jetzt keinen Link gefunden, aber bei Google nochmal bissl recherchiert. Ich habe es jetzt so gelöst... ;)

    VB.NET-Quellcode

    1. CustomersBindingSource.Filter = "City Like '" & txtSearch.Text & "*'"

    Ist die Lösung doof und zum Lernen nicht geeignet?


    Komisch ist auch, wenn ich City einfach in Contact Name ändere, so wie es im DataSet und DataGrid (als Name und Source) angegeben ist, bekomme ich den Fehler: "Syntaxfehler: Fehlender Operand nach dem Operator 'Name'."

    VB.NET-Quellcode

    1. CustomersBindingSource.Filter = "Contact Name Like '" & txtSearch.Text & "*'"
    "Contact Name" (Ansprechpartner) ist

    StormySunshine schrieb:

    im DataSet und DataGrid (als Name und Source) angegeben
    Wieso sollte er das also nicht filtern können? :S
    Komischerweise findet er auch

    VB.NET-Quellcode

    1. CustomersBindingSource.Filter = "Postal Code Like '" & txtSearch.Text & "*'"
    2. CustomersBindingSource.Filter = "Customer ID Like '" & txtSearch.Text & "*'"
    nicht.

    Wiederrum aber

    VB.NET-Quellcode

    1. CustomersBindingSource.Filter = "Phone Like '" & txtSearch.Text & "*'"
    2. CustomersBindingSource.Filter = "Fax Like '" & txtSearch.Text & "*'"
    ah "Contact Name" ist ein SpaltenName!

    Jaja, das kommt immer gut, in Benamungen Spaces reinzumachen, dass ein Interpreter denken muß, es seien 2 Worte ;).

    Lösung: bename Spalten mit nur einem Wort, und PascalCase.

    Weitergehende Benamungs-Empfehlungen: mein Benamungs-Schema für DB-Entitäten

    Ach, K...! - die Benamung ist ja garnet von dir.
    Naja - weißt du Bescheid, für wenndemal selbst eine DB aufsetzst.

    najanaja, 's gibt sogar eine Escape-Syntax für so Benamungs-Katastrophen:

    VB.NET-Quellcode

    1. Me.CustomersBindingSource.Filter = "[Contact Name] like 'ma*'"


    Hmm - ich hätt Lust, die Lösung wieder wegzueditieren, weil ich annehmen muß, dass du dir nun nichtmal mehr die Mühe machst, die SyntaxReferenz zu suchen. Und das nur, weil sie in diesem Tut: DataExpressions weiterverlinkt ist, du aber zu den "Suchern" gehörst, die nur Google können (oder gar YouTube :pinch: ).
    vlt. in letzterem Zusammenhang auch interessant: Visual-Studio richtig nutzen

    Hingegen was du mal googeln kannst: "PascalCase".
    Naja - such es besser auf Wikipedia - also Google ist wirklich eine Recherche-Source von sehr geringer Relevanz, weil listet ja auch jedes DeppenGeschwätz als "Treffer".

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Guten Morgen und Danke :thumbsup:

    ErfinderDesRades schrieb:

    Lösung: bename Spalten mit nur einem Wort, und PascalCase.
    Okay. Ich habe schon vermutet, dass es daran liegt. Denn komischerweise konnte er Spalten mit nur einem Wort finden. Meine Überlegung war also auch schon, wie ich es löse. Als ich jedoch Änderungen im DataSet vorgenommen habe, blieb das Grid leer... :S

    Pascal Case habe ich inzwischen auch in Erfahrung gebracht. :)
    Jo, das gehört zum Generv, wenn man mit DBs entwickelt: Änderungen am Datenmodell müssen in der DB ansetzen, und anschließend muss mans Dataset ganz neu generieren.
    Und weil das so umständlich ist, besteht die Gefahr, dass man einfach mit Designfehlern weiter-lebt, statt sie zu bereinigen.

    Auch deswegen empfehle ich ja immer DB-Programmierung ohne Datenbank, und die DB erst ganz zuletzt zu hinterlegen, wenn sich das Datenmodell schon vielfach als auskonzipiert und praxistauglich erwiesen hat.