VB.NET 2 Tabellen aus Dataset an Datenbank Updaten
Hallo zusammen,
als endlich VB6 zu VB.Net Umsteiger versuche ich beim Thema Datenbank Anbindung nun meine Grundlagen zu schaffen. Ich teste mit einer MSSQL Datenbank und habe 2 Tabellen:
Products [ID,Name,ArtikelNr]
ProductsDetails [ProductsID, Infotext,usw.]
Auf einer Form habe ich 2 Grids, welche die Daten anzeigen sollen und beim ändern innerhalb des Grids die Daten anschließend speichern sollen. Nach vielen Googlen und probieren de verschiedenen Möglichkeiten habe ich das mit dem Anzeigen bisher so gemacht:
Ich hab die Verknüpfung der beiden Tabellen mit DataRelation gemacht, da ich dachte, dass diese Variante professioneller ist, als beim klick auf Zeile von Tabelle1 die Datensatz ID der Zeile zu ermitteln und zeitglich die Daten für die Detailansicht in einer zweiten Abfrage durchzuführen?!?!
Mein Problem ist nun dass Updaten der Daten zurück in die BEIDEN Tebellen der Datenbank nach dem manuellen Editieren in den Tabellen.
Das Updaten in eine Tabelle klappt eigentlich ganz gut, aber in beide das klappt nicht, da beim update nach der ersten Tabelle die geänderten Daten aus dem zweiten grid wieder zurück gesetzt werden. Das muss irgendwie mit der Datenrelation zu tun haben.
Könnt Ihr mir einen sauberen Weg geben wie ich den Inhalt beider angezeigten Tabellen sauber in die DB zurück schreiben kann?
als endlich VB6 zu VB.Net Umsteiger versuche ich beim Thema Datenbank Anbindung nun meine Grundlagen zu schaffen. Ich teste mit einer MSSQL Datenbank und habe 2 Tabellen:
Products [ID,Name,ArtikelNr]
ProductsDetails [ProductsID, Infotext,usw.]
Auf einer Form habe ich 2 Grids, welche die Daten anzeigen sollen und beim ändern innerhalb des Grids die Daten anschließend speichern sollen. Nach vielen Googlen und probieren de verschiedenen Möglichkeiten habe ich das mit dem Anzeigen bisher so gemacht:
Dim connectionString As String
Dim MAINTABLE As String = "Products" ' / Costumers
Dim sqlstr_SEARCH_filter1 As String = " WHERE ID > 0 "
Dim DetailsTable As String = "Details"
Dim sqlstr_Master As String = ""
Dim sqlstr_Details1 As String = ""
Dim DS As New DataSet
Private WithEvents masterBindingSource As New BindingSource
Private Details1BindingSource As New BindingSource()
Public Sub load_data()
sqlstr_Master = "select * from " & MAINTABLE & sqlstr_SEARCH_filter1
sqlstr_Details1 = "select * from " & MAINTABLE & DetailsTable '& sqlstr_SEARCH_filter1
GetSQLDBConect() ' return SQLconn and SQLConnStr
connectionString = SQLConnStr
Dim myAdapter_Master As New SqlDataAdapter(sqlstr_Master, connectionString)
Dim myAdapmyAdapter_Details1 As New SqlDataAdapter(sqlstr_Details1, connectionString)
DS.Clear()
' DS.Reset()
DS.Relations.Clear()
'myAdapter_Master.FillSchema(DS, SchemaType.Source, MAINTABLE)
myAdapter_Master.Fill(DS)
myAdapmyAdapter_Details1.Fill(DS)
' *** Primärschlüssel-Informationen beim Fill mit übernehmen
myAdapter_Master.MissingSchemaAction = MissingSchemaAction.AddWithKey
myAdapmyAdapter_Details1.MissingSchemaAction = MissingSchemaAction.AddWithKey
myAdapter_Master.Fill(DS, MAINTABLE)
myAdapmyAdapter_Details1.Fill(DS, MAINTABLE & DetailsTable)
masterBindingSource.DataSource = DS
masterBindingSource.DataMember = MAINTABLE
Try
' Establish a relationship between the two tables.
Dim relationDetails1 As New DataRelation(MAINTABLE & DetailsTable, _
DS.Tables(MAINTABLE).Columns("ID"), _
DS.Tables(MAINTABLE & DetailsTable).Columns("Product_ID"), False)
DS.Relations.Add(relationDetails1)
Details1BindingSource.DataSource = masterBindingSource
Details1BindingSource.DataMember = MAINTABLE & DetailsTable
Catch ex As Exception
'error: Diese Einschränkung kann nicht aktiviert werden, da nicht alle Werte entsprechende übergeordnete Werte besitzen.
'' Grund: Das Problem das bestand war das in den Detaildatensätze Einträge vorhanden waren, die nicht als Hauptdatensätze exsistierten. Und so verwaiste Dateien existieren würden.
End Try
'Bind Controls to BindingSources:
'Master view:
GridControl_MasterView.DataSource = masterBindingSource
'GridView1.OptionsView.RowAutoHeight = True
CardViewMasterview.OptionsBehavior.FieldAutoHeight = True ' for displaying images in view
'Details view
DataGridView1.DataSource = Details1BindingSource
Ich hab die Verknüpfung der beiden Tabellen mit DataRelation gemacht, da ich dachte, dass diese Variante professioneller ist, als beim klick auf Zeile von Tabelle1 die Datensatz ID der Zeile zu ermitteln und zeitglich die Daten für die Detailansicht in einer zweiten Abfrage durchzuführen?!?!
Mein Problem ist nun dass Updaten der Daten zurück in die BEIDEN Tebellen der Datenbank nach dem manuellen Editieren in den Tabellen.
Das Updaten in eine Tabelle klappt eigentlich ganz gut, aber in beide das klappt nicht, da beim update nach der ersten Tabelle die geänderten Daten aus dem zweiten grid wieder zurück gesetzt werden. Das muss irgendwie mit der Datenrelation zu tun haben.
Private Sub BarButtonItem_save_record_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem_save_record.ItemClick
'save masterview:
Dataset_save_toSQLDB(DS, MAINTABLE, sqlstr_Master, connectionString)
'save current detail view:
Dataset_save_toSQLDB(DS, MAINTABLE & DetailsTable, "select * from " & MAINTABLE & DetailsTable, connectionString) 'sqlstr_Details1
'load_data() ' reload data in grids
End Sub
Public Function Dataset_save_toSQLDB(ByVal DS As DataSet, ByVal targetTable As String, ByVal Savesqlstr As String, ByVal connectionString As String) As Boolean
'änderungen in die DB speichern
Try
Dim myAdapter As New SqlDataAdapter(Savesqlstr, connectionString)
Dim cb As New SqlCommandBuilder(myAdapter)
myAdapter.Update(DS, targetTable)
Return True
Catch ex As Exception
MsgBox(ex.ToString())
Return False
End Try
End Function
Könnt Ihr mir einen sauberen Weg geben wie ich den Inhalt beider angezeigten Tabellen sauber in die DB zurück schreiben kann?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 276369
Url: https://administrator.de/contentid/276369
Ausgedruckt am: 23.11.2024 um 01:11 Uhr
1 Kommentar