Abfrage Access Datenbank mit leeren Feldern

  • SQL

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von DingDangDong.

    Abfrage Access Datenbank mit leeren Feldern

    Guten Morgen zusammen !

    Ich habe da ein kleines Problem mit meiner Datenbank-Abfrage wenn Felder keinen Wert enthalten :|
    Zum Aufbau:
    In der Datenbank habe ich mehrere Spalten, ich nenne sie einfach mal Wert_1 bis Wert_15. Diese möchte ich über einen SQL-String abfragen und anschließend in eine ListView schreiben - das klappt auch soweit.

    Quellcode

    1. abfrage = "SELECT Wert_1, Wert_2, Wert_3, Wert_4, Wert_5, ... FROM Tabelle1 WHERE Wert_4 = 'X'"

    Jetzt ist es aber so, dass auch mal ein oder mehrere Felder keinen Wert enthält. Nach ein wenig suchen habe ich die IsNull Funktion gefunden, aber es will mir nicht wirklich gelingen sie richtig anzuwenden 8|
    Im Grunde wäre es doch so aufgebaut, oder ?

    Quellcode

    1. abfrage = SELECT IIF(IsNull(Wert_1), 'kA') AS Wert_1, ...

    Also wähle Wert_1, wenn Null, dann gib "kA" zurück, ansonsten Wert_1 ?
    Soweit sogut, funktioniert auch mit dem Leerfeld. Nachdem ich mich gefreut habe, dass es so gut funktioniert habe ich das ganze mit allen Werten gemacht die ich abfrage, weil es fast immer sein kann das mal ein leeres Feld dabei ist - und schon wurde ich wieder auf den kalten Boden der Tatsachen zurückgebracht X/
    Denn jetzt gibt mir die Abfrage an den Stellen in denen ein Wert steht eine Fehlermeldung aus ?(

    Fehler beim Auflösen der Überladung. Kein Public Add kann mit diesen Argumenten aufgerufen werden: " & vbCrLf & " 'Public Function Add(item As System.Windows.Forms.ListViewItem.ListViewSubItem) As System.Windows.Forms.ListViewItem.ListViewSubItem':" & vbCrLf & " Der mit dem Argument übereinstimmende Parameter item kann nicht von DBNull in ListViewSubItem konvertieren." & vbCrLf & " 'Public Function Add(text As String) As System.Windows.Forms.ListViewItem.ListViewSubItem':" & vbCrLf & " Der mit dem Argument übereinstimmende Parameter text kann nicht von DBNull in String konvertieren.."} System.Reflection.AmbiguousMatchException


    Habe ich was falsch gemacht ? Muß ich die Abfrage nochmal anders umstellen ?
    Ich hoffe mir könnte da nochmal jemand hilfreich unter die Arme greifen ||

    LG,
    DDD
    In Access würde man das so schreiben:

    SQL-Abfrage

    1. SELECT NZ(Wert_1, 'kA') AS Wert_1,
    Das ist meine Signatur und sie wird wunderbar sein!

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

    Hi Mono !

    Ups, ich hätte wohl noch dazu sagen sollen, dass ich die Abfrage in VB-Projekt mache - sry :whistling:

    + $exception {"Extra ) in query expression ''kA')'."} System.Runtime.InteropServices.COMException

    Kommt als Fehlermeldung wenn ich es mit NZ versuche :|

    LG,
    DDD
    jetzt kommt

    - $exception {"Falsche Anzahl an Argumenten für Funktion angegeben in Abfrageausdruck 'IsNull(Stueckzahl_uebrig, 'kA''."} System.Runtime.InteropServices.COMException


    In den Verweisen habe ich bei COM Microsoft ActiveX Data Objects 6.0 Library und Microsoft ADO Ext. 6.0 for DDL and Security aktiviert.
    Fehlt mir hier noch einer ? :huh:
    Du kannst den Microsoft.ACE.OLEDB.12.0 grundsätzlich verwenden (der ist für Access 2007). Der Link war nur ein Beispiel (von einer leider schon älteren Version)

    Microsoft.ACE.OLEDB.12.0 hattest du bisher nicht erwähnt das du den verwendest sondern:
    COM Microsoft ActiveX Data Objects 6.0 Library und Microsoft ADO Ext. 6.0 for DDL

    Hier ein Link für 12.0
    microsoft.com/en-us/download/confirmation.aspx?id=23734
    Das ist meine Signatur und sie wird wunderbar sein!
    Auwei danke :)
    Ich weiß, mir muß man grad die Informationen aus der Nase ziehen - sry :huh:
    Ich fange nochmal von vorne an und packe möglichst viele Infos mit rein:
    In Access 365 habe ich eine Datenbank erstellt.
    In Visual Studio 2017 RC würde ich gerne in VB.Net eine ListView mit bestimmten Daten aus der Datenbank füllen.
    Das ganze mache ich über eine ADODB.Connection mit dem Microsoft.ACE.OLEDB.12.0 Provider.
    Hab mein Test-Projekt nochmal eben komplett neu erstellt und setze als einzigen Verweis in COM auf Microsoft ActiveX Data Objects 6.0 Library.
    Soweit funktioniert auch alles:

    abfrage = "SELECT Wert_1, Wert_2, Wert_3 FROM Tabelle1 WHERE STATUS = 'NEU'"

    Nur wenn in der Tabelle Nullwerte sind klappt es nicht

    abfrage = "SELECT IsNull(Wert_1, 'kA') AS Wert_1, IsNull(Wert_2, 'kA') AS Wert_2, IsNull(Wert_3, 'kA') AS Wert_3 WHERE STATUS = 'NEU'"
    Fehler: {"Falsche Anzahl an Argumenten für Funktion angegeben in Abfrageausdruck 'IsNull(Stueckzahl_uebrig, 'kA''."}

    funktioniert leider genauso wenig wie

    abfrage = "SELECT NZ(Wert_1, 'kA') AS Wert_1, NZ(Wert_2, 'kA') AS Wert_2, NZ(Wert_3, 'kA') AS Wert_3, WHERE STATUS = 'NEU'"
    Fehler: - $exception {"Undefinierte Funktion 'NZ' in Ausdruck."} System.Runtime.InteropServices.COMException


    so wäre jetzt der letzte Stand

    LG,
    DDD

    Quellcode

    1. Dim ADOC As New ADODB.Connection
    2. Dim dbs As New ADODB.Recordset
    3. Dim sPfad As String
    4. Dim lstItem As New ListViewItem
    5. Dim abfrage As String
    6. ADOC.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sPfad)
    7. abfrage = "SELECT STATUS, Wert_1, Wert_2, Wert_3 FROM Tabelle1 WHERE STATUS = 'NEU'"
    8. ListView1.View = View.Details
    9. With List_Auftraege.Columns
    10. .Add("STATUS", 150, HorizontalAlignment.Left)
    11. .Add("Wert_1", 150, HorizontalAlignment.Left)
    12. .Add("Wert_2", 150, HorizontalAlignment.Left)
    13. .Add("Wert_3", 150, HorizontalAlignment.Left)
    14. End With
    15. With dbs
    16. .ActiveConnection = ADOC
    17. .CursorType = ADODB.CursorTypeEnum.adOpenKeyset
    18. .LockType = ADODB.LockTypeEnum.adLockPessimistic
    19. .Open(abfrage)
    20. .MoveFirst()
    21. Do Until .EOF
    22. lstItem = ListView1.Items.Add(.Fields("STATUS").Value)
    23. lstItem.SubItems.Add(.Fields("Wert_1").Value)
    24. lstItem.SubItems.Add(.Fields("Wert_2").Value)
    25. lstItem.SubItems.Add(.Fields("Wert_3").Value)
    26. .MoveNext()
    27. Loop
    28. dbs.Close()
    29. End With


    öööhm, ich denke ich verwende keinen OleDbDataAdapter :whistling:

    LG,
    DDD
    Die Antwort wird dir jetzt nicht direkt weiterhelfen, aber nutze bitte ADO.NET und nicht das "veraltete" ADO Recordset.
    Dataset, Dataadapter, Connections, etc. machen dir das Leben einfacher.
    Das Recordset ist min. ein Schritt zurück für dich.
    Ich glaube vb-paradise.de/index.php/User/11507-ErfinderDesRades/ hat da ein paar passende Tutorials zu dem Thema.

    Grundkurs Datanbank Programmierung
    oder
    vb-paradise.de/index.php/Board/934-Datenbanken/

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

    Oh weeeeeeeeh ;(
    Ich habe es bereits befürchtet :(
    Dieses Tutorial habe ich mir grad angeschaut und habe meinen Code nun so aufgebaut:

    Quellcode

    1. Imports System
    2. Imports System.Data
    3. Imports System.Data.OleDb
    4. Public Class Form1
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. Dim sPfad As String
    7. sPfad = ("C:\DB-TEST\Daten.accdb")
    8. Dim myCon As New OleDbConnection
    9. myCon.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sPfad)
    10. Dim myCom As New OleDbCommand("SELECT STATUS, Wert_1, Wert_2, Wert_3 FROM Tabelle1 WHERE STATUS = 'NEU'", myCon)
    11. Dim myAdapter As New OleDbDataAdapter(myCom)
    12. Dim Table As New Data.DataTable
    13. Dim LstView As New ListViewItem
    14. ListView1.View = View.Details
    15. With ListView1.Columns
    16. .Add("STATUS", 150, HorizontalAlignment.Left)
    17. .Add("Wert1", 150, HorizontalAlignment.Left)
    18. .Add("Wert2", 150, HorizontalAlignment.Left)
    19. .Add("Wert3", 150, HorizontalAlignment.Left)
    20. End With
    21. myAdapter.Fill(Table)
    22. For Each Row As Data.DataRow In Table.Rows
    23. LstView = ListView1.Items.Add("")
    24. For Each Column As Data.DataColumn In Table.Columns
    25. If ListView1.Items(ListView1.Items.Count - 1).SubItems.Count = 1 Then
    26. ListView1.Items(ListView1.Items.Count - 1).SubItems(0).Text = CStr(Row.Item(Column))
    27. Else
    28. ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(CStr(Row.Item(Column)))
    29. End If
    30. LstView.SubItems.Add("")
    31. Next
    32. Next
    33. End Sub
    34. End Class

    Die Verbindung hat anscheinend auch soweit funktioniert, aber wie fülle ich hier jetzt Daten in mene ListView ?
    Bei der anderen Variante war ich froh zumindest ansatzweise in der Nähe von durchblicken gewesen zu sein... :/

    Nachtrag:
    Ok, jetzt füllt sich meine ListView zumindest - zwar nur mit einem Teilinhalt, aber immerhin schonmal etwas ^^
    Den Inhalt aus der Datenbank-Spalte "Wert_1" schreibt er in die ListView-Spalte "Wert2", STATUS schreibt er in die richtige 8-)
    LstView = ListView1.Items.Add("")
    Zwischen die beiden " " kann ich egal was eintragen, er füllt trotzdem wie oben auf.
    Bei LstView.SubItems.Add("") hingegen füllt er mit dem was ich zwischen die beiden Anführungszeichen ListView-Spalte "Wert1" und "Wert3" auf ?(
    Bin ich da mehr oder weniger auf dem richtigen Weg ?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „DingDangDong“ ()

    Guten Morgen !
    Ich hoffe ihr hattet alle einen schönen Vater / Herrentag :)

    Mit dem DGV habe ich auch schonmal ein bissl rumgespielt. Es wäre eine Alternative, nur wie bekomme ich da die erste Spalte weg ?
    Also die, die immer mit erzeugt wird und wo dann dieses kleine Dreieck zur Auswahl der Zeile anschließend drin ist. ?(

    Nichtsdestotrotz würde ich gerne für mich wissen wie ich die Listview richtig fülle ^^

    LG,
    DDD
    RowHeadersVisible = false
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."