Dataset only -> DB / Welches System und wie?

  • VB.NET
  • .NET 4.0

Es gibt 71 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Dataset only -> DB / Welches System und wie?

    Mahlzeit zusammen.

    Ich durfte heute mein Dataset Only-Projekt im Unternehmen vorstellen und es soll nun zu einer Testphase kommen.
    Allerdings brauche ich dafür zwingend Multi-User Zugriff, das wird wohl nur mit Datenbank funzen, damit sich
    Änderungen nicht gegenseitig überschreiben.

    Meine Fragen dazu nun:
    - für die Testphase wird das nicht an die große Glocke gehangen, sprich die IT wird mir keinen DB-Server zur Verfügung stellen.
    Die Mittel, die ich selbst habe wäre ein Netzlaufwerk und ggf. auch einen PC den ich an meinem Standort einfach "dauerhauft laufen lassen kann" (pseudo-server sozusagen)

    Access kommt nicht in Frage, da die anderen PC's dann die Runtime dazu bräuchten, die die IT wieder installieren müsste.
    Gibt's was "kleines", was mal grad eben auf einem lokalen PC installiert werden und somit als DB-Server fungieren kann?
    wenn ja:

    - wie wäre der nun nächste Schritt mein Projekt von DataSet Only auf DB umzurüsten? Recordlock ist sinnvoll aber nicht vorrangig zu betrachten - wenn's natürlich
    im Zuge der Umstrukturierung Sinn macht, dann nehm ich das natürlich gerne direkt mit ;)

    oder ist das alles doch irgendwie über XML und DataSet Only lösbar?

    LG
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Wenn du zwingend multiuser Zugriff brauchst geht das nicht mehr mit Dataset only.
    Wie wäre es mit sql Express. Das kannst du auf einem extra Rechner laufen lassen. Zumindest für die Testphase.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Ich hätte gedacht, auch SqlServer kann man auf einem lokalen Rechner installieren. Da gibts glaub auch kostenlose Versionen - achja, glaub SqlExpress heisst die.

    Access wäre imo noch nicht draussen. AFAIK brauchen die Clients da keine RunTime.
    Die Client-Technologie heisst "OleDB", und ist im Framework OnBoard (ebenso wie die SqlServer-Client-Technologie: "SqlClient")
    Vielleicht irre ich mich auch, und kenne einfach nur keinen Windows-Rechner, auf dem OleDb nicht installiert ist. Da gibts iwie den "Jet-OleDb"-und den "OleDb.ACE 12.0"-Provider - (meist sind beide da, und ich weiss nie, was ich in den ConnectionString schreiben muss.)

    Aber SqlExpress besser - ist zB in Dts->Db eleganter gecodet.
    Hmm - mir war, ich hätte eine SqlServer-VAriante reingecodet, aber vielleicht auch nicht. Wenn nicht und wolle, melde dich.

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

    Akanel schrieb:

    Wie wäre es mit sql Express.

    hört sich gut an, teste ich dann mal

    ErfinderDesRades schrieb:

    Die Client-Technologie heisst "OleDB"

    das hatte ich bereits beim Importieren bzw. Einlesen von Excel-Dateien, das lief nicht ohne die runtime....

    also bleibt erstmal nur SQL-Express zum Probieren.
    Ich les' mir dein DTS->DB mal durch und schau' mal, wie weit ich damit komme...

    EDIT: Ist MySQL auch machbar? Ich hab' noch nen raspberry hier rumfliegen, da könnte ich mysql / mariadb auf debian aufsetzen und die kiste in der firma anklemmen...
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

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

    Also wie oben schon erwähnt wäre mysql der für mich beste Weg.
    Müssen die Tabellen schon in der MySQL-Datenbank vorhanden sein oder kann ich die mit meiner Anwendung da auch erstellen lassen (mit den Relations)? Wenn ja, wie?
    Das wäre jetzt erstmal der 1. Schritt :)

    Mein "Schlachtplan":
    1. Datenbank bereitstellen - Tabellen manuell anlegen / durch Anwendung anlegen lassen
    2. Programm für MySQL vorbereiten
    3. Aktuellen Datenstand aus XML-Datei an Datenbank übergeben
    4. weitere Schritte
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Ich hab mit MySql keine guten Erfahrungen gemacht. Immer iwelche Versionskonflikte.
    Dataset->Db müsstest du dir eine MySql-Variante zu coden.
    Wenn MySql In-Out-Parameter nicht unterstützt, musst du in einem Event den neu generierten PrimKey abrufen und einpflegen (ähnlich dem AccessSample).
    Wenn du dann mal auf SqlServer wechselst, kann das entfallen, weil SqlServer unterstützt In-Out-Parameter.

    Ich kenns auch nur, dass MySql-Datenmodelle mittels PHP-Admin gebaut werden, und dassis ist eine echt mega-dämliche Oberfläche, bei der man blöde wird, wenn man Relationen anlegen will, Not-Null-Felder, DefaultValues und Kram.

    Du wirst schon so einen Vogel kriegen, selbst wenn du einen brauchbaren Datenbank-Designer zur Verfügung hast.
    Etwa ein brauchbarer Datenbank-Designer finde ich das Access-Frontend - "Beziehungen"-Ansicht.
    Bastel damit mal zur Übung einen Teil deines Datenmodels in eine Access-DB (zum wegschmeissen). Nur dass du eine Vorstellung vom Aufwand kriegst, mit einem brauchbaren Tool.
    Und dann sieh zu, dass du für MySql ein ebenso komfortables Managment-Tool herbeikriegst.
    Weil wenn ich recht erinnere hast du echt einen Haufen Tabellen und Relationen und Kram - das muss alles ganz ganz akkurat ebenso in der DB aufgebaut sein.



    Ich hab übrigens eine DB-Generator-Anwendung gebastelt, vor langem, und weiss jetzt nicht, ob die auch MySql unterstützt.
    DbGenerator heisst das Ding, im SourceCode-Austausch.
    Das analysiert das typDataset und generiert dann Sql-Statements (und kann auch ausführen), mit denen ein passendes Datenmodell inne Db konstruiert wird.
    Crux wird sein, das Ding ans Laufen zu bringen - ist vlt. zickig, weil abhängig von installierten DB-Providern oder sowas.

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

    So, mit deinem DB-Generator hab' ich nu' schonma die Tabellen in die Access-Datenbank bekommen :thumbup:
    Wenn wir schonmal bei Access sind - wäre nun der nächste Schritt mal zu schauen, mein DataSet mit der Access-DB zu
    verbinden und gucken dass ich die Daten darein bekomme?

    LG

    Edit: Hab die Persistance nun in mein Projekt eingefügt OleDbPersistance.vb
    und wie folgt auf meiner frmMain eingebunden:

    VB.NET-Quellcode

    1. Private _Persistance As OleDbPersistance
    2. Private _sCon As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\dtsLogistik.accdb" 'aktuell: ACE-SqlCe
    3. Public Sub New()
    4. InitializeComponent()
    5. _Persistance = New OleDbPersistance(_sCon, Dts)


    und einen Button erstellt, der eigentlich mein DataSet rüberschmeißen sollte...
    bzw. ich glaube ich liege richtig mit meinem Gedanken, dass er mit Save() nur gerade gemachte Änderungen rüberschmeißt?

    Visual Basic-Quellcode

    1. Case sender Is tsFillDB
    2. _Persistance.Save()
    3. msgInformation("OK")


    also was tun, um erstmal den aktuellen Datenstand darein zu bekommen?
    EDIT: Ich glaub' ich brauch deine DB-Extensions - allerdings bin ich mir nicht sicher wie ich die korrekt einbinde, denn ich hab ja nur einen Teil
    deiner Helpers...
    Bilder
    • unbenannt.png

      290,17 kB, 3.790×1.645, 50 mal angesehen
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „tragl“ ()

    tragl schrieb:

    wäre nun der nächste Schritt mal zu schauen, mein DataSet mit der Access-DB zu
    verbinden und gucken dass ich die Daten darein bekomme?
    Ja, da ist nichts vorgesehen.
    Musste dir wohl eine Spezial-Methode bauen, die das Dataset von Platte lädt - nicht die Lade-Methode meiner Helpers.
    Und dann das Dataset mitte DbPersistance abspeichern.

    Weil meine Helpers setzen glaub nach dem Laden alle Datensätze auf Unchanged, und dann denkt die Persistance, es gebe nix zu speichern.
    Aber ist lange her, müsste man evtl nochmal untersuchen, ob meine Helpers wirklich so böse sind.
    In deinem Youtube-Video DbGenerator machst du genau das. Du erstellst aus deinem DTS die Tabellen in der Datenbank,
    dann schreibst du per Click die Daten aus dem DTS in die Datenbank...

    Wäre schön, wenn du helfen könntest die Helpers dann ordentlich zusammen mit den DBExtensions einzufädeln.. :)
    Folgende Helpers habe ich bei mir drin:
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    von DbExtensions rate ich ab - die sind zu fett, und abhängig von meine Gesamt-Helpers zum damaligen Stand.
    Die Gesamt-Helpers passen eh nicht mehr zu dem, was du hast, weil du hast die HelpersSmallEd ja glaub teilweise ziemlich verändert.
    Nimm DbPersistance - dassis vergleichsweise schlank und ohne Abhängigkeiten (oder nur ganz simple).
    Ok, dann damit.
    Würdest du mir dabei bei folgenden Sachen helfen:

    - alle Daten im DTS an Access-DB übergeben (egal ob geändert oder nicht)
    - Erkennen, ob Tabelle aus DTS bereits in der Access-DB existiert - falls nicht, dann dort anlegen (mit Relations)
    oder annersrum: Kann eine Table im DTS angelegt werden (mit Relations) wenn ich diese in Access hinzufüge? (was wäre hier sinnvoller?`)

    Ich denke das wäre für's Erste das Wichtigste - den "Rest" stellt DBPersistance ja schon bereit.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Tabellen in DB oder Dataset anlegen ist nicht sinnvoll.
    Das sollte mit dem DBGenerator erledigt sein, bzw. annersrum kann VisualStudio das.

    Der DatenTransfer der bestehenden Dataset-Daten in leere Access-Tabellen ist das Thema (so wie ich verstehe).
    Jo, und das kannich demnächst mal machen, vielleicht als Extra-Funktion der Persistance.

    ErfinderDesRades schrieb:

    Jo, und das kannich demnächst mal machen, vielleicht als Extra-Funktion der Persistance.

    das wär' prima :thumbup: gern helf' ich auch dabei...

    ErfinderDesRades schrieb:

    Das sollte mit dem DBGenerator erledigt sein, bzw. annersrum kann VisualStudio das.

    überschreibt der db-generator denn ggf. vorhandene tables?
    Hier geht's mir darum, dass wenn mein Programm erweitert wird (Felder oder eben komplette Tables), dass ich irgendwie die Änderungen am DataSet auch
    an die Datenbank weitergeben kann. Wenn ich dazu den DB-Generator nutzen kann soll's mir auch recht sein - er soll mir dann nur nix zerschießen inne DB ;)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    zeig mal die Transfer-Methode.
    Und du hast wirklich alle Doof-Fehler ausgeshlossen?
    Also das Dataset ist befüllt, wenn DbPersistance.Save ausgeführt wird, und die DbPersistance.Save-Methode wird wirklich durchlaufen (die muss ja im einzelschritt ziemlich kompliziert herumhopsen), und DBP saved wirklich das befüllte Dts (nicht eine annere Instanz), und so Zeugs?
    Und FAQ: Db speichern failt isses auch net?
    Also dann zeig mal die Transfer-Methode, und wenn ich da nix sehe, musste wohl malwieder das Projekt anhängen, mit allem drum und dran, und getestet, dasses auch läuft, wenn mans downloaded.
    Moin.

    Ich hab die Datenbankdatei garnet ins Projekt eingebunden, die liegt "einfach nur" im Datenverzeichnis bei der XML und dem DataSet.
    Zeile 69-81 ist deine originale Save()-Methode, Zeile 55-67 wäre die SaveAll()-Methode, wo dann nicht mehr nach geänderten oder
    gelöschten Datensätzen selektiert wird. Datenbank bleibt aber leer. :huh:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Public Class OleDbPersistance
    3. Private _Con As OleDbConnection
    4. Private _Adapters As Dictionary(Of DataTable, OleDbDataAdapter)
    5. Private _RankedTables As New List(Of DataTable)
    6. Private _dts As DataSet
    7. Private _RequeryIdCommand As OleDbCommand ' not neccessary, if in-/out-DbParameter-Support is present
    8. Private _hshTempTables As HashSet(Of DataTable)
    9. Public Sub New(connectionString As String, dts As DataSet)
    10. _dts = dts
    11. _Con = New OleDbConnection(connectionString)
    12. _RequeryIdCommand = New OleDbCommand("SELECT @@IDENTITY", _Con)
    13. _hshTempTables = New HashSet(Of DataTable)(_dts.Tables.Cast(Of DataTable))
    14. While _hshTempTables.Count > 0 : BuildRankedTables(_hshTempTables.First) : End While
    15. _Adapters = New Dictionary(Of DataTable, OleDbDataAdapter)
    16. For Each tb In _RankedTables
    17. Dim adp = New OleDbDataAdapter("Select * from [" & tb.TableName & "]", _Con)
    18. Dim cmb = New OleDbCommandBuilder(adp)
    19. cmb.QuotePrefix = "`"
    20. cmb.QuoteSuffix = "`"
    21. If tb.PrimaryKey.Length = 1 AndAlso tb.PrimaryKey(0).AutoIncrement Then
    22. AddHandler adp.RowUpdated, AddressOf Table_RowUpdated ' not neccessary, if in-/out-DbParameter-Support is present
    23. End If
    24. _Adapters.Add(tb, adp)
    25. Next
    26. End Sub
    27. Public Sub FillAll()
    28. _dts.Clear()
    29. _Con.Open()
    30. For Each tb In _RankedTables
    31. _Adapters(tb).Fill(tb)
    32. Next
    33. _Con.Close()
    34. End Sub
    35. ''' <summary> since SELECT- and FROM-Clause are predefined by the tables-structure sqlAfterFrom can contain any other valid Sql-clauses, especially WHERE. To prevent Sql-Injection-attacs it is strongly recommended to use '?' as Parameter-PlaceHolder and submit appropriate args</summary>
    36. Public Sub CustomFill(table As DataTable, sqlAfterFrom As String, ParamArray args() As Object)
    37. ClearRecursive(table)
    38. Using adp = DirectCast(DirectCast(_Adapters(table), ICloneable).Clone, OleDbDataAdapter)
    39. Dim cmd = adp.SelectCommand
    40. cmd.CommandText &= " " & sqlAfterFrom
    41. For i = 0 To args.Length - 1
    42. cmd.Parameters.AddWithValue("@p" & i, args(i))
    43. Next
    44. _Con.Open()
    45. adp.Fill(table)
    46. _Con.Close()
    47. End Using
    48. End Sub
    49. Public Sub SaveAll()
    50. _Con.Open()
    51. For Each tb In _RankedTables
    52. Dim rows = tb.Select("", "")
    53. _Adapters(tb).Update(rows)
    54. Next
    55. Dim skipSubOrderedRowsConfig = New _AcceptruleCascadeConfig(_dts)
    56. For Each tb In _RankedTables
    57. Dim n = _Adapters(tb).Update(tb) ' send the remaining Deletes, skipping Cascade-Deleted-Rows, which will be deleted by Db itself
    58. Next
    59. skipSubOrderedRowsConfig.Restore()
    60. _Con.Close()
    61. End Sub
    62. Public Sub Save()
    63. _Con.Open()
    64. For Each tb In _RankedTables
    65. Dim rows = tb.Select("", "", DataViewRowState.Added Or DataViewRowState.ModifiedCurrent)
    66. _Adapters(tb).Update(rows) ' first send Inserts and Updates
    67. Next
    68. Dim skipSubOrderedRowsConfig = New _AcceptruleCascadeConfig(_dts)
    69. For Each tb In _RankedTables
    70. Dim n = _Adapters(tb).Update(tb) ' send the remaining Deletes, skipping Cascade-Deleted-Rows, which will be deleted by Db itself
    71. Next
    72. skipSubOrderedRowsConfig.Restore()
    73. _Con.Close()
    74. End Sub
    75. ''' <summary> on Insert-Statements requery the database-generated primary-key. This is not neccessary on in-/out-DbParameters supporting Databases </summary>
    76. Private Sub Table_RowUpdated(sender As Object, e As OleDbRowUpdatedEventArgs)
    77. If e.StatementType <> StatementType.Insert Then Return
    78. Dim primCol = e.Row.Table.PrimaryKey(0)
    79. Dim primVal = _RequeryIdCommand.ExecuteScalar
    80. e.Row(primCol) = Convert.ChangeType(primVal, primCol.DataType)
    81. End Sub
    82. Private Class _AcceptruleCascadeConfig : Inherits List(Of Tuple(Of ForeignKeyConstraint, AcceptRejectRule))
    83. ' AccepRule.Cascade removes subordered rows from datasets change-tracking, during Updating Database
    84. ' Required while Updating deleted rows, since the db deletes subordered rows already by itself.
    85. Public Sub New(ByVal dts As DataSet)
    86. For Each rl As DataRelation In dts.Relations
    87. Dim ck = rl.ChildKeyConstraint
    88. If ck Is Nothing Then Continue For
    89. MyBase.Add(Tuple.Create(ck, ck.AcceptRejectRule))
    90. ck.AcceptRejectRule = AcceptRejectRule.Cascade
    91. Next
    92. End Sub
    93. Public Sub Restore()
    94. For Each tpl In Me
    95. tpl.Item1.AcceptRejectRule = tpl.Item2
    96. Next
    97. End Sub
    98. End Class
    99. Private Sub BuildRankedTables(tb As DataTable)
    100. If Not _hshTempTables.Remove(tb) Then Return 'prevent run in Cycles
    101. For Each rl As DataRelation In tb.ParentRelations
    102. If rl.ChildKeyConstraint IsNot Nothing Then BuildRankedTables(rl.ParentTable)
    103. Next
    104. _RankedTables.Add(tb)
    105. End Sub
    106. Private Sub ClearRecursive(tb As DataTable)
    107. If tb.Rows.Count = 0 OrElse Not _hshTempTables.Add(tb) Then Return 'prevent run in Cycles
    108. For Each rl As DataRelation In tb.ChildRelations
    109. If rl.ChildKeyConstraint IsNot Nothing Then ClearRecursive(rl.ChildTable)
    110. Next
    111. _hshTempTables.Remove(tb)
    112. tb.Clear()
    113. End Sub
    114. End Class


    Eingebunden nachwievor auf meiner frmMain:

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Private _Persistance As OleDbPersistance
    3. Private _sCon As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\..\Daten\dtsLogistik.accdb" 'aktuell: ACE-SqlCe
    4. Public Sub New()
    5. InitializeComponent()
    6. _Persistance = New OleDbPersistance(_sCon, Dts)


    VB.NET-Quellcode

    1. Case sender Is tsFillDB
    2. _Persistance.SaveAll()
    3. msgInformation("OK")


    Das DataSet wird korrekt aus der XML befüllt beim Starten des Programms und es wird das korrekte DataSet an die Persistance übergeben.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    tragl schrieb:

    Das DataSet wird korrekt aus der XML befüllt beim Starten des Programms
    Wie gesagt: das Dataset nicht mit meine helper-Methoden einlesen, sondern mit Dataset.ReadXml.
    wie gesagt: schreib eine Extra-Methode für den Datentransfer, und zeige den Code.
    Nochmal zum Debuggen: Haltepunkte auf #71 und v.a. #73 müssen erreicht werden - das sieht man sogar, was da passiert:

    VB.NET-Quellcode

    1. For Each tb In _RankedTables
    2. Dim rows = tb.Select("", "", DataViewRowState.Added Or DataViewRowState.ModifiedCurrent)
    3. _Adapters(tb).Update(rows) ' first send Inserts and Updates
    4. Next
    er speichert die Zufügungen und die Modifikationen.
    Und rows darf kein leeres Array sein, sondern muss DataRows enthalten.

    ErfinderDesRades schrieb:

    wie gesagt: schreib eine Extra-Methode für den Datentransfer, und zeige den Code.

    ich krieg' mit access noch das Kotzen wegen der Runtimes... auf der Arbeit kann ich ma wieder nix testen.
    Wie wär's an der Stelle mit SQLite? Das kann wohl bis zu nem bestimmten Grad auch MultiUser, allerdings kann dein DBGenerator da grad mal
    nicht mit umgehen...obwohl's ja drin steht. Hab System.Data.SqLite nochmal nachinstalliert - aber keine Änderung, DBGenerator lässt mich da nix machen :(



    Wär' das machbar den DBGenerator für SQLite vorzubereiten? Dann bräuchte ma keinen Rechner, keinen Server kein nix für die "Datenbank"
    und vor allem keine Runtimes. Programm wird mit allem ausgeliefert, die Datenbankdatei käme auf's Netzlaufwerk.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

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

    tragl schrieb:

    ErfinderDesRades schrieb:

    wie gesagt: schreib eine Extra-Methode für den Datentransfer, und zeige den Code.

    ich krieg' mit access noch das Kotzen wegen der Runtimes... auf der Arbeit kann ich ma wieder nix testen.


    versuche es mit einer .mdb statt mit .accdb
    die .mdb sollte zum test doch reichen

    hier ein Bsp.
    ändere verzeichnis

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. 'set references to COM MS ADO Ext. 2.x for DDL and Security
    3. Public Class Form1
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. '.mdb erstellen
    6. Dim cat As New ADOX.Catalog()
    7. Dim sSQL As String
    8. cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\XMLFolder\Xml.mdb")
    9. cat = Nothing
    10. 'öffne .mdb
    11. Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\XMLFolder\Xml.mdb")
    12. conn.Open()
    13. 'tabelle in .mdb erstellen
    14. sSQL = " Create Table tbl_Material"
    15. sSQL &= "( [MA_ID] AutoIncrement CONSTRAINT PRIMARYKEY PRIMARY KEY"
    16. sSQL &= ", [MA_Nr] Int Not Null"
    17. sSQL &= ", [MA_Text] varChar(15)"
    18. sSQL &= ", [TM_UserNameOpend] varChar(35)" 'Record in Edit By User
    19. sSQL &= ", [TM_UserLocked] varChar(15)" 'Record Locked = Status
    20. sSQL &= ")"
    21. Dim cmd As New OleDb.OleDbCommand("", conn)
    22. cmd.CommandText = sSQL
    23. cmd.ExecuteNonQuery()
    24. 'Bsp. Daten
    25. sSQL = "Insert Into tbl_Material (MA_Nr,MA_Text,TM_UserNameOpend,TM_UserLocked)Values(123,'Test','tragl','InEdit')"
    26. ExecuteSQL(conn, sSQL)
    27. sSQL = "Insert Into tbl_Material (MA_Nr,MA_Text)Values(13,'Test2')"
    28. ExecuteSQL(conn, sSQL)
    29. conn.Close()
    30. End Sub
    31. Public Function ExecuteSQL(ByVal Con As OleDb.OleDbConnection, _
    32. ByVal sSQL As String, _
    33. Optional ByRef ErrMessage As String = Nothing, _
    34. Optional ByVal TransAction As _
    35. OleDb.OleDbTransaction = Nothing) As Integer
    36. ErrMessage = Nothing
    37. Try
    38. Dim Result As Integer = 0
    39. Using Cmd As New OleDb.OleDbCommand(sSQL, Con, TransAction)
    40. Result = Cmd.ExecuteNonQuery
    41. End Using
    42. Return Result
    43. Catch ex As Exception
    44. ErrMessage = ex.Message
    45. Return 0
    46. End Try
    47. End Function
    48. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    49. Dim sSql As String
    50. sSql = "Select MA_Nr As [Material Nr] ,MA_Text AS [Bezeichnung],TM_UserNameOpend AS [Locked durch],TM_UserLocked AS Status From tbl_Material;"
    51. Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.jet.oledb.4.0;data source=E:\XMLFolder\Xml.mdb")
    52. Dim cmd As OleDbCommand = New OleDbCommand(sSql, con)
    53. con.Open()
    54. Dim myDA As OleDbDataAdapter = New OleDbDataAdapter(cmd)
    55. Dim myDataSet As DataSet = New DataSet()
    56. myDA.Fill(myDataSet, "MyT")
    57. DataGridView1.DataSource = myDataSet.Tables("MyT").DefaultView
    58. con.Close()
    59. con = Nothing
    60. End Sub
    61. End Class