VB zu Access "Datentypenkonflikt in Krierienausdruck"

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    VB zu Access "Datentypenkonflikt in Krierienausdruck"

    Hallo Community,

    vorab, sollte ich die Frage im falschen Thread gestellt haben, bitte verschieben.
    Und zwar bin ich in Access jetzt nicht der ,,fitteste". So ein paar grundlegende Dinge wie Daten von VB zu in eine Access Tabelle zu schieben habe ich mittlerweile verstanden, aber komplexere Themen schaffe ich noch nicht.

    Nun kommen wir zur eigentlichen Frage. Wie der Fehler in dem Titel zustande kommt weiß ich (denke ich mal). Und zwar will ich ein "," in die Datenbanktabelle einfügen, sieht dann ungefähr so aus: "1, 2". Das mag Access denke ich mal nicht,
    und daher frage ich euch ob es machbar ist. Sollten Code schnipsel benötigt werden, einfach fragen.

    Mfg Silvergreen
    ?(

    EaranMaleasi schrieb:


    Zeig doch mal wie du es bisher versuchst den Text in die Access Tabelle einzufügen


    Ok, ich erkläre erstmal was die Funktion dahinter ist. Und zwar ist es ein Bestellformular, wo alle Benutzer ihre Bestellungen eintagen können. Dazu hatte ich eine Funktion gedacht eine Bestellung zu einer Vorhandenen hinzuzufügen. Qussie so: Ich bestelle mir die Nummer 1, möchte aber dazu noch die Nummer 4 haben. Also gehe ich in das Formular zum bearbeiten und tippe die 4 ein. In der Tabelle (DGV) wird es dann so stehen: 1, 4. Allerdings nimmt Access das nicht an, ich nehme an wegen dem Komma, aber der sollte schon dort bleiben.

    VB.NET-Quellcode

    1. Public con1 As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Silvergreen\Desktop\DB_Bestellformular.accdb") 'Liegt nur temporär auf dem Desktop, erstmal soll das Programm laufen.

    VB.NET-Quellcode

    1. Dim sqlinsert As String
    2. sqlinsert = "UPDATE Bestellungen SET Name=@Name, BestNr=@BestNr, " &
    3. "Größe=@Größe, Extrawunsch=@Extrawunsch, Gesammt=@Gesammt WHERE Name='" & dgv_bestellungen.CurrentRow.Cells(0).Value & "'"
    4. Dim cmd As New OleDbCommand(sqlinsert, Form1.con1)
    5. cmd.Parameters.Add(New OleDbParameter("@Name", cb_name.SelectedItem))
    6. cmd.Parameters.Add(New OleDbParameter("@BestNr", add_nummer))
    7. cmd.Parameters.Add(New OleDbParameter("@Größe", add_groeße))
    8. cmd.Parameters.Add(New OleDbParameter("@Extrawunsch", add_wunsch))
    9. cmd.Parameters.Add(New OleDbParameter("@Gesammt", add_preis))
    10. Form1.con1.Open()
    11. cmd.ExecuteNonQuery()
    12. Form1.con1.Close()


    Die add_ Strings sind wie folgt aufgebaut:

    VB.NET-Quellcode

    1. Dim temp6 As String
    2. If cb_groeße.Enabled = False Then
    3. temp6 = "-"
    4. Else
    5. temp6 = cb_groeße.SelectedItem
    6. End If
    7. Dim temp7 As String = dgv_bestellungen.Rows(0).Cells(2).Value
    8. Dim add_groeße As String = temp7 + ", " + temp6


    "temp" steht wie wahrscheinlich vermutet für temporär, ein wenig unübersichtlich, ich weiß,
    aber tut in dem Fall ja nichts zur Sache.

    Und eine Sache gäbe es da auch noch, ich habe die Werte für den Preis in dem Textfeld sowie in der Access Tabelle perfekt mit €-Zeichen stehen.
    Wenn ich den Preis allerdings aus der Access Tabelle in mein DGV lade ist es einfach nur ein Decimal, sprich ohne €-Zeichen und ",00". Ist jetzt nichts Weltbewegendes, aber schön ist halt was anderes.

    HenryV schrieb:

    Ist das "," ein Satzzeichen oder ein Dezimaltrennzeichen?Was für einen Typ ist das Feld in der Tabelle? (Text, Zahl, ...)Falls Zahl, welche Feldgrösse hat das Feld? (Single, Integer, ...)
    Das Komma ist genau "," so in dem String ,,verbaut", daher nehme ich mal an es ist ein Satzzeichen.In dem Fall der Bestellnummer ist es ein Zahlenfeld mit der Feldgröße Long Integer
    ?(

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Silvergreen“ ()

    Thisoft schrieb:

    Mit welchem Datentyp sind denn die Felder in deiner Access-Tabelle definiert?


    Unterschiedlich, gröchstenteils Text, einmal Zahl und einmal Währung

    Der Fehler entsteht bei

    VB.NET-Quellcode

    1. cmd.ExecuteNonQuery()
    Fehlermeldung ist dann:
    System.Data.OleDb.OleDbException
    HResult=0x80040E07
    Nachricht = Datentypenkonflikt in Kriterienausdruck.
    Quelle = System.Data
    Stapelüberwachung:
    bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
    bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
    bei System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
    bei System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
    bei System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
    bei System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
    bei Bestellformular.Form2.bt_hinzufuegen_Click(Object sender, EventArgs e) in C:\Users\Krupa\source\repos\Bestellformular\Form2.vb: Zeile211
    bei System.Windows.Forms.Control.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
    bei System.Windows.Forms.Button.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    bei Bestellformular.My.MyApplication.Main(String[] Args) in : Zeile81

    Vielleicht könnt ihr ja damit etwas mehr abfangen
    ?(

    Silvergreen schrieb:

    Unterschiedlich, gröchstenteils Text, einmal Zahl und einmal Währung


    Das meinst du aber jetzt nicht ernst - oder? Ich gehe mal nicht davon aus dass du uns absichtlich häppchenweise mit Halbwahrheiten füttern willst :(
    Es wäre schon wichtig zu wissen welches Feld welchen Datentyp hat - und zwar von jedem Feld! Schließlich sagt ja die Fehlermeldung dass damit was nicht stimmt...

    Thisoft schrieb:


    Ich gehe mal nicht davon aus dass du uns absichtlich häppchenweise mit Halbwahrheiten füttern willst :(

    Tut mir Leid, war nicht meine Absicht.

    Name = Text
    BestNr = Zahl (Long Integer)
    Größe = Text
    Extrawunsch = Text
    Gesammt = Währung

    *Vollzitat entfernt* ~NoFear23m
    ?(

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

    Naja, drei spalten sind mit dem Komma betroffen, einmal die BestNr, die Größe und der Wunschtext, also müsste es an einem der drei liegen.

    Edit: Ok... hätte ich auch selbst drauf kommen können. Ich habe die BestNr auf Text geändert, nun funktioniert es. Weißt jemand noch eine Lösung wegen dem €-Zeichen?

    *Unnötiges Zitat enternt* ~NoFear23m
    ?(

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

    AndPod schrieb:

    Setz das Textformat der Spalte im DGV auf "C2" (C=Currency, 2=Anzahl Dezimalstellen)

    Hmmm, ich habe es versucht, aber es scheint nicht zu funktionieren, wahrscheinlich machen ich es einfach nur falsch.

    VB.NET-Quellcode

    1. For i As Integer = 0 To dgv_bestellungen.Rows.Count - 1
    2. FormatCurrency(dt.Rows(i).Item(4), -1)
    3. Next
    4. dgv_bestellungen.DataSource = dt

    oder auch so

    VB.NET-Quellcode

    1. ​ dgv_bestellungen.DataSource = dt
    2. For i As Integer = 0 To dgv_bestellungen.Rows.Count - 1
    3. FormatCurrency(dgv_bestellungen.Rows(i).cells(4).value, -1)
    4. Next

    passiert beides nichts. Vermutlich mache ich es einfach falsch.
    ?(
    Jo, wie man DatagridviewSpalten bearbeitet, sollte dir mal jemand zeigen. Mit 'rows' gehts auf keinen Fall, denn 'Spalte' heisst auf englisch 'Column', und nicht 'Row'.
    Aber hat mit dem Fehler sicher nix zu tun.



    Ich versteh die Meldung auch nur zur Hälfte.
    Nämlich, dass du einen Datentyp-Konflikt bekommst, wenn du "1, 4" in eine Long-Spalte der Datenbank eintragen willst, ist ja logisch.
    "1, 4" ist keine Zahl, sondern das ist Text/String.

    Denk dir ein brauchbares Datenmodell aus, wo eine Bestellung aus mehreren Bestllposten besteht, die man hinzufügen kann.

    Dazu brauchts einiges Verständnis von relationaler Datenmodellierung.
    Wenn wolle studiere mal diese Tuts - da wird ein Bestellsystem entwickelt (allerdings erstmal ohne Datenbank, die ist nämlich erstmal garnet nötig, und nur höchst problematisch).
    codeproject.com/Articles/10309…l-Datamodel-for-Beginners
    dort ist auf 2 weiterführende Tuts verlinkt, im 3. Tut kann man dann die fertige Anwendung auch downloaden.
    (Hihi - so nebenbei kommen da auch DGV-Columns vor, die mit "C2" formatiert sind)

    ErfinderDesRades schrieb:

    ist ja logisch.
    "1, 4" ist keine Zahl, sondern das ist Text/String.


    Ja, da hast du recht. Viele Fehler kann man vor allem auch durch einfaches Nachdenken beheben...
    Aber naja, ich schauen mir das Tut mal an und werde dann mal mein DGV mit C2 formatieren.

    *Vollzitat korrigiert* ~NoFear23m
    Bitte unterlasse das vollständige Zitieren.

    ?(

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