Syntaxfehler in From Klausel

  • VB.NET

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

    Syntaxfehler in From Klausel

    Hallo zusammen,

    mit VB.net 2017 bin ich dabei, eine Datenbankanwendung (Datenbank ist eine Access-DB) aufzubauen.

    Ich rufe eine zweite Form auf und dort habe ich folgendes in den Form_Load stehen

    VB.NET-Quellcode

    1. Private Sub Belege_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. ' Einschränkungen deaktivieren ??? Welche Einschränkungen auch immer gemeint sind ???
    3. Me.DBDatenDataSet.EnforceConstraints = False
    4. 'TODO: Diese Codezeile lädt Daten in die Tabelle "DBDatenDataSet.Artikel_Hersteller". Sie können sie bei Bedarf verschieben oder entfernen.
    5. Me.Artikel_HerstellerTableAdapter.Fill(Me.DBDatenDataSet.Artikel_Hersteller)
    6. 'TODO: Diese Codezeile lädt Daten in die Tabelle "DBDatenDataSet.Artikel_Rabattberechnungen". Sie können sie bei Bedarf verschieben oder entfernen.
    7. Me.Artikel_RabattberechnungenTableAdapter.Fill(Me.DBDatenDataSet.Artikel_Rabattberechnungen)
    8. 'TODO: Diese Codezeile lädt Daten in die Tabelle "DBDatenDataSet.Artikel_Belege". Sie können sie bei Bedarf verschieben oder entfernen.
    9. Me.Artikel_BelegeTableAdapter.Fill(Me.DBDatenDataSet.Artikel_Belege)
    10. end sub


    Die ersten beiden Fill-Befehle laufen auch ordnungsgemäß durch, nur der dritte bring mir immer die o. g. Fehlermeldung.

    Wenn ich im Einzelschrittmodus durchgehe (ab dem dritten Fill), dann lande ich hier (DBDatenDataSet4.Designer.vb)

    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
    2. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "15.0.0.0"), _
    3. Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"), _
    4. Global.System.ComponentModel.DataObjectMethodAttribute(Global.System.ComponentModel.DataObjectMethodType.Fill, true)> _
    5. Public Overloads Overridable Function Fill(ByVal dataTable As DBDatenDataSet.Artikel_BelegeDataTable) As Integer
    6. Me.Adapter.SelectCommand = Me.CommandCollection(0)
    7. If (Me.ClearBeforeFill = true) Then
    8. dataTable.Clear
    9. End If
    10. Dim returnValue As Integer = Me.Adapter.Fill(dataTable)
    11. Return returnValue
    12. End Function


    Die Fehlermeldung kommt dann in der vorletzten Zeile.

    Kann mir einer von Euch sagen, wo ich evtl. suchen muss, damit ich die From-Klausel überprüfen kann?

    Vielen Dank

    Volker

    Volker Bunge schrieb:

    nur der dritte bring mir immer die o. g. Fehlermeldung.
    Welche?

    Volker Bunge schrieb:

    in der vorletzten Zeile.
    Ist das so -Zeile 11?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Kommentarzeile Einschränkungen deaktivieren ??? Welche Einschränkungen auch immer gemeint sind ??? weist darauf hin, dass Du es ausprobieren solltest, was passiert, wenn Du die Codezeile auskommentierst. Ich kann mir sehr gut vorstellen, was passiert, aber es ist wahrscheinlich einprägsamer, wenn Du es selbst testest.
    Um was für ein From geht es. Ich les nur Fill im Code.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo zusammen,

    vielen Dank erst einmal für die schnellen Rückmeldungen

    @RodFromGermany: Fehlermeldung: Syntaxfehler in From Klausel (siehe Betreffzeile)

    Ich rechne eigentlich die End Function Zeile nicht mit, so das es die Zeile 10 im zweiten Coding ist.

    @VaporiZed: So, habe mal die beiden ersten Fill Zeilen deaktiviert und dann die Zeile "Me.DBDatenDataSet.EnforceConstraints = False" auch noch.
    Leider bekomme ich dort die gleiche Fehlermeldung wie bisher auch.

    @ErfinderDesRades: Habe mal nach 'SelectCommand' gesucht und bekomme nur immer pro Tabelle diese drei Blöcke.

    Der erste und dritte wird im Einzelschrittmodus garnicht angesprungen, nur der zweite.

    Alle drei sind im DBDatenDataSet4.Designer.vb zu finden

    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
    2. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "15.0.0.0")> _
    3. Private Sub InitCommandCollection()
    4. Me._commandCollection = New Global.System.Data.OleDb.OleDbCommand(0) {}
    5. Me._commandCollection(0) = New Global.System.Data.OleDb.OleDbCommand()
    6. Me._commandCollection(0).Connection = Me.Connection
    7. Me._commandCollection(0).CommandText = "SELECT ID, ArtikelID, ArtikelIDa, ArtikelIDAlt, EingabemaskenID, Belegnr, Kaufdat"& _
    8. "um, Stückzahl, Preis, Währung, RabattProzente, HerkunftID, Gutschein, Spesen, Ve"& _
    9. "rsicherung, Geschenk, Originalverpackung, Sammlerwert, Rabattberechnung, EndPrei"& _
    10. "s FROM Artikel_Belege"
    11. Me._commandCollection(0).CommandType = Global.System.Data.CommandType.Text
    12. End Sub
    13. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
    14. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "15.0.0.0"), _
    15. Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"), _
    16. Global.System.ComponentModel.DataObjectMethodAttribute(Global.System.ComponentModel.DataObjectMethodType.Fill, true)> _
    17. Public Overloads Overridable Function Fill(ByVal dataTable As DBDatenDataSet.Artikel_BelegeDataTable) As Integer
    18. Me.Adapter.SelectCommand = Me.CommandCollection(0)
    19. If (Me.ClearBeforeFill = true) Then
    20. dataTable.Clear
    21. End If
    22. Dim returnValue As Integer = Me.Adapter.Fill(dataTable)
    23. Return returnValue
    24. End Function
    25. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
    26. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "15.0.0.0"), _
    27. Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"), _
    28. Global.System.ComponentModel.DataObjectMethodAttribute(Global.System.ComponentModel.DataObjectMethodType.[Select], true)> _
    29. Public Overloads Overridable Function GetData() As DBDatenDataSet.Artikel_BelegeDataTable
    30. Me.Adapter.SelectCommand = Me.CommandCollection(0)
    31. Dim dataTable As DBDatenDataSet.Artikel_BelegeDataTable = New DBDatenDataSet.Artikel_BelegeDataTable()
    32. Me.Adapter.Fill(dataTable)
    33. Return dataTable
    34. End Function

    Hab dann noch im DBDatenDataSet.xsd folgendes gefunden

    VB.NET-Quellcode

    1. <SelectCommand>
    2. <DbCommand CommandType="Text" ModifiedByUser="false">
    3. <CommandText>SELECT ID, ArtikelID, ArtikelIDa, ArtikelIDAlt, EingabemaskenID, Belegnr, Kaufdatum, Stückzahl, Preis, Währung, RabattProzente, HerkunftID, Gutschein, Spesen, Versicherung, Geschenk, Originalverpackung, Sammlerwert, Rabattberechnung, EndPreis FROM Artikel_Belege</CommandText>
    4. <Parameters />
    5. </DbCommand>
    6. </SelectCommand>

    Die Select Anweisung habe ich dann mal in einer Access-Abfrage eingefügt, keine Fehlermeldung.

    Die Fehlermeldung bezieht sich doch in diesen Falle immer auf die Select-Anweisung, da ich hier ja nur füllen will. Eine Delete-Anweisung hat doch hier erst einmal nicht damit zu tun, oder doch?

    Habe ich soweit eigentlich alles richtig gemacht?

    Wenn ja, gibt es eine Möglichkeit, dass mir die Fehlermeldung die entsprechende Zeile anzeigt, so dass man gezielt suchen kann.

    Gruß

    Volker
    Jo, das zweite Snippet ist wohl die Select-Anweisung, die ich meinte. Nur dass du sie als xml anguckst ist suboptimal.
    Normal vorgesehen ist dafür der Dataset-Designer - weisst du, was das ist?
    Doppelklicks mal im SolutionExplorer auf die .xsd-Datei.

    Ja, und inhaltlich sehe ich da auch nix, was einen Fehler verursachen könnte - zumal deine DB die Abfrage ja scheints ausführen kann.

    Ist das die Original Nordwind-Datenbank - oder eine selbstgemachte (oder ist das gar eine von mir)?
    Weil wenn man selbst eine DB designed, sollte man Umlaute in Tabellen/spaltenNamen lieber vermeiden (und noch einiges andere beachten).

    Ja, und sieht alles aus wie richtig gemacht - nur dasses halt net ganz funzt ist blöd, oder?
    Hallo ErfinderDesRades,

    also die DB ist meine selbst erstellte und funktioniert mit einer Access-FrontDB bisher auch. Mit dieser BackgroundDB will ich mir jetzt eine VB-Prg. schreiben.

    Das mit den Umlauten ist mir zwar bekannt (und müsste auch mal geändert werden), sollte aber doch jetzt erst einmal nicht das Problem darstellen.

    Also wenn ich im Projektmappen-Explorer (ist doch der SolutionExplorer?) auf die DBDatenDataSet.xsd klicke, bekomme ich ja alle Abfragen und (in meinem Falle) ein paar Verknüpfungen zwischen ein paar Tabellen, angezeigt.

    Ich habe mir dann mal die Artikel_Belege Tabelle herausgesucht und dann mit einem Rechtsklick auf den Tabellennamen habe ich die Datenvorschau aufgerufen. Anschließend in dem neuen Fenster auf Vorschau geklickt und alles wurde richtig angezeigt.

    Noch eine Frage am Rande: Macht es Sinn, hier die ganzen Tabellen miteinander zu verbinden oder sollte ich dies lieber über die Programmierung lösen? Denn die Tabellen so anzuordnen, dass man dann mit der Ansicht auch etwas anfangen kann, ist ja auch schon eine Lebensaufgabe. Oder liegt es vielleicht sogar daran? Meine Tabelle ist mit 2 weiteren Tabellen verbunden (siehe Codes). Eigentlich macht doch eine solche Verknüpfung keinen Sinn, denn in den Eingabemasken sind doch dann Combinationsfelder vorhanden, die ihre Werte dann aus den anderen Tabellen bekommen.

    Du schreibst: "... (und noch einiges andere beachten).". Was wäre das zum Bsp. und kann es evtl. daran liegen?

    Gruß

    Volker
    Kurzer Zwischeneinwurf: Das mit den Constraints zielt genau darauf ab: Es gibt z.B. 2 Tabellen, wobei Tabelle2 auf Tabelle1 verweist:

    FahrzeugTabelle
    ID
    Name
    0
    Tayoto
    1
    BWM

    ModellTabelle
    ID
    Name
    FahrzeugID
    0
    Coralle
    0
    1
    3Z
    1

    Wenn nun EnforceConstraints True ist und ModellTabelle vor FahrzeugTabelle geladen wird, knallt's, weil das tDS (typ. DataSet) nix mit FahrzeugID 0 anfangen kann, weil die FahrzeugTabelle noch nicht geladen wurde.

    Ja, die Tabellenrelationen werden im tDS-Designer modelliert und beim Laden zusammengestöpselt. Das heißt, dass die Tabellen einzeln inhaltlich befüllt werden und das tDS kümmert sich um die Verknüpfungen - wenn die denn vorher auch im tDS-Designer hinterlegt wurden. Das mit der Eingabemaske ist ja dann wieder ne andere Geschichte (Schau mal bei EdRs VVV rein. Da gibt's genügend Infos zum schnellen Einstieg.) Aber so wie es aussieht, wird ja beim letzten Fill auch "nur" eine Tabelle geladen. Ja, mit Verweisen auf andere Tabellen, aufgrund der ForeignKeys, die ich da vermute. Aber direkte Verknüpfungen sind da nicht in irgendeiner Form dabei, also JOINs oder so. Nur zur Info das Ganze.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Volker Bunge schrieb:

    Also wenn ich im Projektmappen-Explorer (ist doch der SolutionExplorer?) auf die DBDatenDataSet.xsd klicke, bekomme ich ja alle Abfragen und (in meinem Falle) ein paar Verknüpfungen zwischen ein paar Tabellen, angezeigt.
    Das sind keine Abfragen, sondern du bekommst da alle Tabellen angezeigt, die im typisierten Dataset enthalten sind.
    Und die Verknüpfungen zwischen diesen (alias "Relationen") sind total total wichtig. Relationen sind das Relationale an relationalen Datenbanken.
    Ich nehme mir immer die Zeit, meine Tabellen zurechtzuschieben, dasses möglichst wenig Überkreuzungen gibt.
    Diese Ansicht ist das Entity-Relation-Diagram deines Datenmodells.
    Wenn du relationale DAtenmodellierung verstehst, dann ist das ERD ein total nützliches Instrument, um ein Datenmodell korrekt zu konstruieren, bzw ein gegebenes Datenmodell zu verstehen.
    Ein Datenmodell, was die Realität nicht richtig modelliert, ist Müll, und ebenso jede Anwendung, die auf sowas aufbaut - no Chance!
    Relationale Datenmodellierung ist nicht schwer zu lernen, aber ohne es gelernt zu haben, sollte man sich nicht mit Datenbanken befassen - hat kein Sinn.
    Hier die absoluten Basics: Grundlagen: Relationale Datenmodellierung
    Hier ein 3-teiliger Crashkurs: codeproject.com/Articles/10309…l-Datamodel-for-Beginners

    Volker Bunge schrieb:

    Noch eine Frage am Rande: Macht es Sinn, hier die ganzen Tabellen miteinander zu verbinden oder sollte ich dies lieber über die Programmierung lösen?
    Ähm - die Verknüpfungen müssen in der Datenbank bestehen, und wenn du dein typDataset dir erstellen lässt, dann muss der Dataset-Assistent die Datenbank auslesen, und im Dataset die Verknüpfungen richtig anlegen.
    Also wenn man mit DB arbeitet, tut man keine Relationen erstellen, nicht im Dataset-Designer, und schon garnet per Code.
    Man muss aber oft die Relationen nacharbeiten, weil der Assistent ist oft zu doof, die Relationen aus der DB korrekt zu übertragen.



    Gut - dassis nur ein Exkurs vom Exkurs.
    Also du siehst im DatasetDesigner deine Tabelllen. Unten dran an den Tabellen kleben die TableAdapter für die jeweilige Tabelle. Da kannn man draufklicksen, und das Property-Fenster zeigt dann die im TableAdapter enthaltenen Command: Select-Command, UpdateCommand, InsertCommand, Delete-Command - (Du merkst schon: Das ist der sogenannte SUID-Pattern, der hier implementiert ist - die 4 GrundOperationen der Datenhaltung überhaupt)
    Jedenfalls, da, im TableAdapter hätte ich denkt, solltest du dein SelectCommand suchen, hatte ich gemeint - nicht inne Xml-Ansicht der .xsd-Datei.



    So, nun ist auch dieser Exkurs zuende, kommen wir zum Thema: Was stimmt mit der From-Klausel nicht?
    Hmm, tja, ähh... ich hab keine Ahnung (aber das sagte ich bereits).

    Wird wahrscheinlich nichtmal was nützen, wenn du die DB als DateiAnhang postest, weil meine Access-Version ist aus dem vorigen Jahrtausend.

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

    Hallo zusammen,

    @VaporiZed: Vielen Dank für den Hinweis. Das bedeutet also, dass ich immer erst die "tiefste" Tabellen laden muss und danach die in der nächsten Ebene bis zum Schluss die oberste geladen wird. (Wenn man das ganze mal wie im Explorer betrachtet sich vorstellt).
    Muss/sollte man pro "Ebene" eine gewisse Reihenfolge der Tabellenaufrufe einhalten oder ist das pro "Ebene" egal (müsste es eigentlich, da ja die nächst höhere "Ebene" erst festlegt, welche Tabellen Sie ggf. haben muss).

    @ErfinderDesRades: Also heißt es jetzt erst einmal alle Relationen der Tabellen in der DB erstellen. Führt ja leider kein Weg daran vorbei.

    Hoffe einmal, dass dadurch ggf. auch mein Fehler verschwindet (sehe aber ehr schwarz dafür).

    Was ich doch einmal ausprobieren könnte, ist die DB kpl. neue zu erstellen und die Tabellen einzelnen zu importieren um so evtl. den Fehler einzugrenzen.

    Ich hatte ja schon einmal gefragt, ob es eine Möglichkeit gibt, dieser Fehlermeldung eine Programmzeile zu entlocken, in der dann der Fehler angezeigt wird. Aber dies geht wohl nicht. Ist dann leider wie der berühmte Sack Reis der China umgefallen ist.

    Vielen Dank

    Volker
    Zum genannten Fehler: Manchmal hilft auch alles löschen und neu machen.
    Da sind sehr komplizierte Assistenten, die verhaspeln sich auch schonmal.

    Ansonsten das Datenmodell sauber zu machen ist immer gut.

    Noch ansonstener empfehle ich immer, die Datenbank ganz wegzulassen.
    Man kann seine Daten viel einfacher ohne DB laden und speichern, und das Datenmodell pflegen. Datenverarbeitungs-Vorraussetzungen
    @Volker Bunge: Nee, meinte ich so nicht. Das kannst Du machen, bedarf aber mehr Organisationsaufwand, weil Du quasi immer sortieren müsstest. Besser so: Vor dem Tabellen-Laden EnforceConstraints auf False setzen, nach dem Laden auf True. Dann werden während des Ladens auch die Tabellen akzeptiert, die eben Verweise auf bisher nicht geladene Tabellen haben. Wenn aber Verweise nach dem Wiedereinschalten von EnforceConstraints fehlen, weil einige Tabellen vergessen wurden, gibt's eben ne Exception, und zwar ne ConstraintException. Zurecht: Es fehlen zu dem Zeitpunkt wichtige Daten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo zusammen,

    Hole das Thema noch mal nach oben.

    Ich habe jetzt vor, noch einmal von vorne anzufangen und habe da noch so ein paar Fragen.

    Habe jetzt meine Access 2019 DB soweit geändert, dass alle ID Felder Long Integer sind und die Beziehungen habe ich auch fertig. Wenn ich nun die DB einbinde, werden mir auch alle Verbinden angezeigt (ist aber das totale Chaos, müsste ich dann so wie in Access noch schön machen, aber erst einmal egal).
    1. Problem: Habe zum Testen erst einmal nur 3 Tabellen angehakt. Die beiden Verbindungen sind auch alle richtig (lt fourView Vidoes). Wenn ich nun ein neues Form erzeuge und dort die Tabelle Belege (ist mit Tabelle Artikel verbunden) hereinziehe, dann noch den blöden Navigator lösche sieht mein Form Code so aus
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Belege
    2. Private Sub Belege_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. ' Einschränkungen deaktivieren ??? Welche Einschränkungen auch immer gemeint sind ???
    4. 'Me._Modelldatenbank_VB_Net_2019_DatenDataSet.EnforceConstraints = False
    5. 'TODO: Diese Codezeile lädt Daten in die Tabelle "_Modelldatenbank_VB_Net_2019_DatenDataSet.Artikel_Belege". Sie können sie bei Bedarf verschieben oder entfernen.
    6. Me.Artikel_BelegeTableAdapter.Fill(Me._Modelldatenbank_VB_Net_2019_DatenDataSet.Artikel_Belege)
    7. End Sub
    8. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    9. Dim FilterStr As String
    10. FilterStr = "ArtikelID = " & TextBox1.Text
    11. Artikel_BelegeBindingSource.Filter = FilterStr
    12. End Sub
    13. End Class



    Nach dem Starten kommt diese Fehlermeldung

    Spoiler anzeigen
    System.Data.ConstraintException
    HResult=0x8013192A
    Nachricht = Einschränkungen konnten nicht aktiviert werden. Mindestens eine Zeile enthält Werte die die Einschränkungen non-null, unique or foreign-key verletzen.
    Quelle = System.Data
    Stapelüberwachung:
    bei System.Data.DataSet.EnableConstraints()
    bei System.Data.DataSet.set_EnforceConstraints(Boolean value)
    bei System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
    bei System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    bei System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
    bei System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
    bei Modelldatenbank._Modelldatenbank_VB_Net_2019_DatenDataSetTableAdapters.Artikel_BelegeTableAdapter.Fill(Artikel_BelegeDataTable dataTable) in R:\VB Modelldatenbank\Modelldatenbank\_Modelldatenbank_VB_Net_2019_DatenDataSet.Designer.vb: Zeile5975
    bei Modelldatenbank.Belege.Belege_Load(Object sender, EventArgs e) in R:\VB Modelldatenbank\Modelldatenbank\Belege.vb: Zeile12
    bei System.EventHandler.Invoke(Object sender, EventArgs e)
    bei System.Windows.Forms.Form.OnLoad(EventArgs e)
    bei System.Windows.Forms.Form.OnCreateControl()
    bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
    bei System.Windows.Forms.Control.CreateControl()
    bei System.Windows.Forms.Control.WmShowWindow(Message& m)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
    bei System.Windows.Forms.Form.WmShowWindow(Message& m)
    bei System.Windows.Forms.Form.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)

    das Ganze passiert in DataSetDesigner bei
    Spoiler anzeigen

    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
    2. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "15.0.0.0"), _
    3. Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"), _
    4. Global.System.ComponentModel.DataObjectMethodAttribute(Global.System.ComponentModel.DataObjectMethodType.Fill, true)> _
    5. Public Overloads Overridable Function Fill(ByVal dataTable As _Modelldatenbank_VB_Net_2019_DatenDataSet.Artikel_BelegeDataTable) As Integer
    6. Me.Adapter.SelectCommand = Me.CommandCollection(0)
    7. If (Me.ClearBeforeFill = true) Then
    8. dataTable.Clear
    9. End If
    10. Dim returnValue As Integer = Me.Adapter.Fill(dataTable) ''' Hier steht das Programm
    11. Return returnValue
    12. End Function



    Frage: Müssen denn immer alle Tabellen in der Form sein, die in irgendeiner Beziehung stehen? Sehen will ich ja nur die Belege und nicht alle anderen. Dabei ist es egal gewesen, welche Tabelle ich nehme, die einzelne oder die unter Artikel zu finden ist.
    Gibt es eine Möglichkeit, den Datensatz bzw. das Feld herauszubekommen, welches diesen Fehler verursacht? Kann könnte man hier gezielter suchen.

    Klar, wenn ich Artikel und Belege gleichzeitig in einer Form sehen will, muss ich Belege aus der Artikelanzeige (also Artikel aufklappen und dort dann die entsprechende verknüpfte Tabelle nehmen) weil sonst der Datensatzwechsel Artikel / Belege nicht funktioniert.

    Frage: Ob ein Feld Nullwerte enthalten kann, kann ich doch in der DB festlegen? Auch die Länge des Inhaltes und so weiter lege ich doch in der DB fest?

    Wenn ich jetzt aber die Zeile Me._Modelldatenbank_VB_Net_2019_DatenDataSet.EnforceConstraints = False reaktiviere, dann funktioniert auch der Filterbutton und ich kann nach der ArtikelID filtern. (ist ja auch logisch, da es so etwas wie ein On Error Resume next ist). Habe ja schon gelernt, dass diese Lösung nicht richtig ist. Aber aktuell die einzige Lösung.

    Die Belegdaten für den aktuellen Artikel werden in einer separaten Form angezeigt. Wird der Artikel geändert, so sollen sich auch die Belegdaten entsprechend ändern. Dazu würde ich einfach Belege.TextBox1.Text = ArtikelDataGridView.Item(1, ArtikelDataGridView.CurrentCell.RowIndex).Value sagen. Das aktualisieren wird dann über TextBox1_TextChanged realisieren).

    Frage: Gibt es hier eine bessere typisierte Aufruf für das Filtern?

    @EDR: Habe mir jetzt auch mal die DataExpressions2010 und die FourViews Zipdateien runtergeladen.

    Frage: Gibt es für die ganzen Sub und Functions eine Erklärung, was die im einzelnen machen? Muss/kann ich dann um für das typsierte DB Arbeiten die ganzen Subs/Functions in mein Projekt einbinden?

    Gibt es eine Möglichkeit, die Datenbankstruktur zu übernehmen (also ohne DB zu arbeiten) oder muss ich leider die Tabellen alle manuell anlegen? Danach müsste man doch "nur noch" ein paar Musterdatensätze mir einer Schleife generieren und könnte dann somit erst einmal ohne DB arbeiten. Oder kann man bspw. die ersten 10 Artikeldaten übernehmen und dazu passend aus den ganzen anderen Tabellen die passenden Daten. Natürlich wäre eine kpl. Datenübernahme ohne DB die Luxusvariante.

    So, dass wäre es erst einmal.

    Schönes Wochenende noch.

    Volker

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

    naja - guck den Code doch an - was macht der?
    Er lädt die Artikel-Belege.
    Und wo sind die Artikel? Wie sollen Artikelbelege geladen werden, deren Artikel garnet da sind?
    Was soll ein Programm mit einem ArtikelBeleg anstellen, wo der Artikel für fehlt?
    nee nee - da gibts gleich diesen Fehler, und dassis auch gut so.

    Genau darüber informiert dich ja auch die Fehlermeldung: "Mindestens eine Zeile enthält Werte die die Einschränkungen non-null, unique or foreign-key verletzen."
    Ich würde sogar sagen: Alle Zeilen verletzen die foreign-key-Einschränkung.

    Soviel zur Fehlermeldung - ich würde das Thema Datenbank gern fallenlassen - wie gesagt: ohne isses einfacher.

    Volker Bunge schrieb:

    Frage: Gibt es für die ganzen Sub und Functions eine Erklärung, was die im einzelnen machen?
    Eiglich sollten die ganzen Subs und Functions sich selbst erklären.
    Aber wenn du Fragen hast, dann frag.
    Aber frag bitte konkret - was alle Subs und Functions machen, kann ich natürlich nicht erklären - jede macht ja was anneres.

    Volker Bunge schrieb:

    Gibt es eine Möglichkeit, die Datenbankstruktur zu übernehmen (also ohne DB zu arbeiten) oder muss ich leider die Tabellen alle manuell anlegen?
    Naja, du kannst ein typDataset dir generieren lassen, wie du ja schon hast - nur mit allen Tabellen.
    Wie du siehst, hängen die miteinander zusammen, und man kann nicht unreflektiert irgendwelche davon weglassen. (Man kann schon Tabellen weglassen, nur muss man dann alle deren untergeordnete Tabellen auch weglassen)

    Jo, damit hast du bereits ein typDataset, und kannst damit arbeiten - alle Tabellen sind dann darin angelegt. Es zwingt dich ja niemand, die TableAdapter und Kram zu verwenden, sondern steht dir frei, ganz wie du sagst:

    Volker Bunge schrieb:

    "nur noch" ein paar Musterdatensätze mir einer Schleife generieren und könnte dann somit erst einmal ohne DB arbeiten.
    Oder

    Volker Bunge schrieb:

    kann man bspw. die ersten 10 Artikeldaten übernehmen und dazu passend aus den ganzen anderen Tabellen die passenden Daten. Natürlich wäre eine kpl. Datenübernahme ohne DB die Luxusvariante.
    geht natürlich auch. Alle zu laden ist sogar einfacher als 10 Artikeldaten auszuwählen.
    Speichern kannst du das Dataset mit Dataset.WriteXml(<DateiPfad>), oder - wenn du meine Helper-Methoden benutzt - mit Dataset.Save(Me) (dazu musste aber vorher - ebenfalls mit meine Helpers - den Dateipfad festlegen).

    Jedenfalls wenn du alle Daten laden willst, musst du sie in der richtigen Reihenfolge laden (haste jetzt ja gemerkt).
    Also übergeordnete Tabellen müssen als erste geladen werden, damit wenn die untergeordneten Tabellen dran kommen, dass dann deren ForeignKeys nicht "in der Luft" hängen.

    Wenn du's geschafft hast, alle Tabellen zu laden, und das Dataset als Datei abzuspeichern, dann würde ich empfehlen, alle TableAdapter, und TableAdapterManager (wenns da einen gibt) aus dem Dataset wieder wegzulöschen.
    Das sind zehntausende Zeilen generierter Code, und funktioniert nichtmal out of the box.

    Und danach nur noch mit dem aus der Datei geladenen Dataset arbeiten - etwa mein Helperlein Dataset.Fill() hat das Problem der Tabellen-lade-reihenfolgen intern zuverlässig gelöst.

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

    Hallo ErfinderDesRades,

    vielen Dank erst einmal für Deine Geduld und Deine Antworten.

    Jetzt habe ich das mit den anderen Tabellen und den damit verbundenen Fehler verstanden.

    Habe jetzt mal Deine Hilfsroutinen aus FourView und DataExpressions2010 in mein Testprojekt eingebunden und auch den Verweis auf die beiden Projekte gesetzt.

    Dann habe ich die DB normal eingebunden und danach mit Deiner SAVE Methode meine XML Datei erstellt. Gibt es hier eigentlich eine Sub, die aus einer DB eine XML Datei macht?
    (Habe das jetzt über reinziehen aller Tabellen in die Form und dann einen Button angelegt, der die SAVE-Methode aufruft, gelöst. Ging zwar, aber doch etwas zeitraubend)

    Anschießend habe ich den Verbindungsstring gelöscht und in als normalen String angelegt.

    Im Form_Load habe ich dann noch folgendes eingegeben.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. My.Settings.Modelldatenbank_VB_Net_2019_DatenConnectionString = _DataFile.FullName
    3. My.Settings.Save()
    4. End sub


    Jetzt schreibst Du, dass ich die Daten mit "etwa mein Helperlein Dataset.Fill()" befüllen soll. Gebe ich Dataset.Fill ein, bekomme ich nur meine Eingabe rot unterstrichen.

    Da ja in Deinen Hilfsroutinen so einiges drin steckt, mal noch eine Frage: Wie kann ich die einzelnen Sub den überhaupt aufrufen? (Klärt wahrscheinlich auch dann das DataSet.Fill-Problem.

    Gruß

    Volker
    Ein Programm-Startup könnte so aussehen:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Me._Modelldatenbank_VB_Net_2019_DatenDataSet.Register(me, True).DataFile( _DataFile.FullName).Fill
    3. End sub
    was vorher drinne war löschen.

    Abspeichern geht so

    VB.NET-Quellcode

    1. Private Sub btSave_Click(sender as object, e as eventargs)handles btSave.Click
    2. Me._Modelldatenbank_VB_Net_2019_DatenDataSet.Save(me)
    3. end sub


    Ich glaub übrigens, du hast die TableAdapter noch nicht gelöscht - kannste mal Bildle vom DatasetDesigner posten?
    Hallo und sorry, dass ich mich jetzt erst melde.

    Vielen Dank erst einmal für die beiden Tipps. Hat soweit auch alles geklappt.

    Die DataTabelAdapter im DataSet habe ich entfernt. (siehe Bild 2)
    Frage: Gibt es hier eine einfache und schnelle Methode, alle auf einmal zu löschen?

    Der Verbindungsstring ist jetzt ein String und keine Verbindung und ohne Wert (siehe Bild 6)

    Habe mal ein paar Tabellen als DataGridView eingefügt und in einem eine Spalte als ComboBox eingestellt (siehe Bild 2 + 4).
    Bekomme aber pro Zeile diese Fehlermeldung (siehe Bild 3) und natürlich auch, wenn ich über die ComboBox mit der Maus mich bewege (je 2 mal).
    Das Aktualisieren der Daten untereinander funktioniert super. Also hier ist auch alles Richtig.

    Die Beziehung aus Access heraus sieht bei allen Beziehungen so aus (siehe Bild 5).

    Habe das ganze mit und ohne DataSet-TableAdapter ausprobiert, leider ohne Erfolg.

    Alle ID Felder und deren Beziehungsfelder sind in Access Long Integer und in VB.Net Int32. Müsste somit also passen.

    Die DataSet-Verbindungen sehen alle so aus (siehe Bild 7).
    Komisch ist aber, dass ich hier nichst anklicken kann um es so einzustellen wie in Deinen Videos. Sobald ich den Haken setzen will, wird mir dieses Fenster geschlossen und die Änderung natürlich nicht übernommen.
    Fehler ist in diesem Fall: TableAdapter war noch vorhanden. (ist beim Ganzen Probieren leider vorgekommen). Danach ging alles wieder und ich konnte alles wie in den Videos einstellen.

    Wenn dann alle TableAdapter entfernt sind, aber alle Beziehungen noch nicht geändert sind, bekomme ich diese Fehlermeldung (siehe Bild 8) (bei einer Tabelle, die in keinerlei Beziehungen steht, und am Ende eigentlich auch überflüssig ist)

    Frage: Gibt es hier eine Möglichkeit, alle Beziehungen in einem Rutsch so zu ändern, wie in den Videos?

    Bevor ich mich noch einmal daran mache, alle VB-Net Beziehungen zu ändern, würden mich mal ein paar grundsätzliche Voraussetzungen interessieren.

    1. Das DataSet bekomme ich doch nur durch Einbinden der DB, dem anschließenden Umstellen des Verbindungsstring hin (siehe Bild 6) , oder geht das auch direkt über die XML Datei? Dort habe ich aber keine Verbindungsinformationen gefunden und somit dürften eigentlich alle Beziehungen nicht vorhanden sein, sofern das Erstellen der Tabellen geht.
    2. Muss ich eigentlich alle Tabellen im DataSet haben, die auch in der XML-Datei sind, oder kann ich auch ein paar weg lassen (klar, die nicht vorhandenen können dann natürlich nicht angezeigt bzw. gespeichert werden)
    3. Bei den Beziehungen: Was sagt die Einstellung "Löschregel = Cascade" aus? Ich will eigentlich nicht, dass wenn ich bspw. ein Artikel gelöscht wird, alle damit verbundenen Daten gelöscht werden. Also müsste ich hier es auf None stehen lasse. Bei Aktualisieren ist dann Cascade richtig.
    4. Hintergrundwissen zu den o. g. Fragen bzw. Problemen

    Schönes Wochenende noch.

    Gruß

    Volker
    Bilder
    • Bild1.jpg

      46,75 kB, 712×178, 69 mal angesehen
    • Bild2.jpg

      177,65 kB, 1.372×807, 71 mal angesehen
    • Bild3.jpg

      50,75 kB, 462×338, 66 mal angesehen
    • Bild4.jpg

      178,8 kB, 857×827, 60 mal angesehen
    • Bild5.jpg

      148,92 kB, 522×594, 65 mal angesehen
    • Bild6.jpg

      33,37 kB, 657×142, 61 mal angesehen
    • Bild7.jpg

      94,01 kB, 614×601, 59 mal angesehen
    • Bild8.jpg

      139,55 kB, 744×503, 59 mal angesehen

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

    ErfinderDesRades schrieb:

    Ich glaub übrigens, du hast die TableAdapter noch nicht gelöscht - kannste mal Bildle vom DatasetDesigner posten?
    Noch immer kein Bild vom Dataset-Designer.
    Es gibt viele Wege den zu öffnen. ZB im SolutionExplorer einen Doppelklick auf die Dataset-Datei (*.xsd) ausführen.

    Dort die TablaAdapter - die kleben unten an den Tabellen dran - anwählen und rauslöschen.
    Aber zuvor muss es geklappt haben, dass du alle Daten aus der Datenbank ins Programm lädst, und von da in eine DatasetDatei (*.xml) abspeicherst.

    Und immer Backup machen vor so Aktionen.
    Und verifizieren, dass das Backup sich auch problemlos wiederherstellen lässt.
    Einfachstes Backup wäre zunächstmal, den ganzen Ordner, mit Code und Datenbank (*.mdf) zu zippen.

    Volker Bunge schrieb:

    1. Das DataSet bekomme ich doch nur durch Einbinden der DB, dem anschließenden Umstellen des Verbindungsstring hin (siehe Bild 6) , oder geht das auch direkt über die XML Datei? Dort habe ich aber keine Verbindungsinformationen gefunden und somit dürften eigentlich alle Beziehungen nicht vorhanden sein, sofern das Erstellen der Tabellen geht.
    Was bedeutet "Dataset hinkommen"?

    Volker Bunge schrieb:

    2. Muss ich eigentlich alle Tabellen im DataSet haben, die auch in der XML-Datei sind, oder kann ich auch ein paar weg lassen (klar, die nicht vorhandenen können dann natürlich nicht angezeigt bzw. gespeichert werden)
    Was du nicht brauchst, brauchst du halt nicht.
    Kannste weglassen, wenn du dir ganz sicher bist, und wenn auch keine Relationen zu iwelchen anneren Tabellen bestehen, die du doch brauchst.
    Also ich würde das Rauswerfen von üflüssigem in einem eigenen Schritt vollziehen, (und vorher Backup machen!).

    Volker Bunge schrieb:

    3. Bei den Beziehungen: Was sagt die Einstellung "Löschregel = Cascade" aus? Ich will eigentlich nicht, dass wenn ich bspw. ein Artikel gelöscht wird, alle damit verbundenen Daten gelöscht werden. Also müsste ich hier es auf None stehen lasse.
    Muss aber.
    Mach dir klar, dass mit "verbundenen Daten" die ChildRows gemeint sind.
    ZB bei einer ArtikelRow typischerweise als ChildRows Bestellposten geben, die auf den Artikel verweisen, und die aussagen, wieviel von diesem Artikel bestellt ist.
    Wenn du nun den Artikel löschst - wohin sollen die Bestellposten dann verweisen?
    Das gibt sofort Exceptions ohne Ende.

    Ein Datenmodell ist nix beliebiges, sondern ist Abbild der Realität:
    Wenn du ein Schiff versenkst, dann sind logischerweise auch sämtliche Kabinen dieses Schiffes unter Wasser.
    Das wird inne Realität nicht diskutiert, und das ist auch im Datenmodell nicht diskutierbar.

    Also bei Artikeln mag geboten sein, diese eben nicht zu löschen. Aber wenn einer gelöscht wird, dann sind zwangsläufig alle Bestellposten, die ihn bestellt haben, auch futsch.

    Volker Bunge schrieb:

    Bei Aktualisieren ist dann Cascade richtig.
    Aktualisieren-Cascade hab ich nie recht verstanden. Also es geht dabei darum, dass wenn ein PK geändert wird, dass dann auch alle auf ihn verweisende FK nachziehen.
    Zum einen tut man das nicht - Primärschlüssel ändern.
    Zum andern: Natürlich! Wenn mans doch tut müssen die FKs dann nachziehen, was denn sonst - also warum wird das überhaupt als Option angeboten?



    Aber zurück zu den praktischen Erfordernissen, also zu post#16:
    • Alle Daten aus der DB abrufen und in eine Dataset-Datei (*.xml) schreiben
    • die xml öffnen und sich vergewissern, dass das geklappt hat
    • Backup machen und vergewissern, dass das Backup wiederherstellbar ist
    • TableAdapter aus dem Dataset-Designer löschen, und alle Zeilen mit FolgeFehlern ebenfalls löschen.
      Davon würde ich gern Bildle sehen, weil bisher scheinst du den DatasetDesigner noch nicht gefunden zu haben.
    • Das Laden des Datasets aus der Dataset-Datei (*.xml) coden.
    • Backup machen - dassis quasi die BaseLine, von der die weitere Entwicklung ausgeht.

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

    Hallo EFD,

    vielen dank erst einmal für die schnelle Rückmeldung.

    Im Bild 1 sieht man eigentlich die TableAdapter nicht mehr, aber hier noch einmal ein Bild mit mehr Tabellen (siehe Bild 9).

    Das mit dem "DataSet hinbekommen" meine ich, dass ich erst die DB einbinden muss, um die einzelnen Tabellen und Beziehungen zu bekommen (will sie ja nicht alle von Hand machen). Oder geht das auch ohne?

    Vielen Dank für den Tipp mit dem Backup, habe mir die XML-Datei schon gesichert. Wenn ich mit dem Programm richtig anfange, dann werden natürlich Sicherungen gemacht.

    Das richtige Vorgehen (letzter Absatz) ist also so, wie ich es bisher gemacht habe.

    Gruß

    Volker
    Bilder
    • Bild9.jpg

      155,5 kB, 1.081×535, 50 mal angesehen

    Volker Bunge schrieb:

    Im Bild 1 sieht man eigentlich die TableAdapter nicht mehr
    Stimmt - habich garnet erkannt, dass das ein Bild aussm DatasetDesigner ist.
    Du müsstest jetzt noch ausdrücklich bestätigen, dass das auch richtig funktioniert hat mit der Abschaffung der TableAdapter.
    Also dass du jetzt deine Daten auch wirklich wie in post#16 gezeigt ins Programm laden kannst, und zwar nun aus der Dataset-Datei anstatt aus der Access-DB.
    und dann wieder Backup machen, und dann im Dataset-Designer alle Relationen korrigieren:




    Mit Backup machen meine ich mitnichten nur die DatenDatei - sondern aller Code + Datendatei zusammen.
    In der weiteren Entwicklung wirste das Datenmodell womöglich ändern, minimal etwa Spalten besser benamen.
    Mit sowas kann man sich die ganze Anwendung zerschiessen, und wenn du da nur ein DAten-Backup hast, nützt dir das nix.

    Hier ein klein Proggi, mit dem man mit einem Click sämtliche Dateien zippt, die in der Solution eingebunden sind: SolutionExplorer - OpenSource
    Wenn du also die DatenDatei dem Projekt hinzufügst, erhälst du damit immer einen Komplett-Zipp aller Sourcen + der Daten, die aktuell mit diesen Sourcen zusammen funktionieren.