LinQ2SQL - BindingSource

29/01/2009 - 14:42 von Harald Bacik | Report spam
Hallo NG

Ich spiele im Moment mit LinQ2SQL herum & bin von der Stàrke beeindruckt.

Trotzdem habe ich dazu eine Frage.
Ich binde meine Daten in der Sub New() der Form an eine BindingSource. Das
mache ich in etwa so:

Dim qKunden = From Query in DProvider.Kundenstamm Select Query
BindingSource.DataSource = qKunden
Soweit, so gut. - Die Bindingsource Ihrerseits steht als Datencontainer
eines Grids zur Verfügung.
Soweit, so gut.
Wie aber speichere ich jetzt Änderungen, die im Grid (& somit auch in der
Bindingsource) gemacht wurden, wieder zurück in die DB?

Beim Surfen im Netz bin ich immer wieder darauf gestoßen, dass die Variablen
Formweit zur Verüfgung stehen. - Dass ist aber bei größeren Projekten nicht
der richtig weg. - ODER doch? - Da ja das SQL erst bei Anfrage an die DB
geschickt werden.

Bitt um Tipps. - Bzw. Erklàrung zu diesem Thema

DANKE
 

Lesen sie die antworten

#1 Elmar Boye
30/01/2009 - 10:10 | Warnen spam
Hallo Harald,

Harald Bacik schrieb:
Ich spiele im Moment mit LinQ2SQL herum & bin von der Stàrke beeindruckt.

Wie aber speichere ich jetzt Änderungen, die im Grid (& somit auch in der
Bindingsource) gemacht wurden, wieder zurück in die DB?



In dem Du für den gleichen DataCountext SubmitChanges aufrufst.


Beim Surfen im Netz bin ich immer wieder darauf gestoßen, dass die
Variablen Formweit zur Verüfgung stehen.



In einem kleineren Projekt für Windows Forms / WPF kann das durchaus
akzeptabel sein.
Dabei kannst Du zwei Ansàtze verfolgen:
- Jede Formularinstanz verwaltet ihren eigenen Datenkontext.
- Es gibt einen Datenkontext für die gesamte Anwendung.

Beim ersten Ansatz kann es zu Konflikten kommen, wenn mehrere
Formulare die gleichen Daten aus der Datenbank verwenden -
und nun eines die Daten veràndert, andere Formulare bekommen
das logischerweise nicht mit.

Beim zweiten passiert das nicht, aber auf die Dauer können
sehr viele Daten lokal gehalten werden. Wodurch die Anwendung
tràge und ressourcenintensiv werden kann.

Unten habe ich mal ein einfaches Beispiel für die Northwind
gemacht. Dort ist Variante 1 implementiert, was aber leicht
dadurch geàndert werden kann, indem Du den Datenkontext
nicht im Formular erzeugst, sondern beim Aufruf mitgibst
(zusàtzlicher Konstruktor).

- Dass ist aber bei größeren Projekten nicht der richtig weg.

Die Alternative ist eine mehrschichtige Anwendung, wo der
Datenkontext (Datenschicht) von den Formularen (Pràsentationschicht)
getrennt ist. Die Formulare nutzen dabei ein eigenes Datenmodell,
das die Daten von der Datenschicht anfordert und sie beim Speichern
dahin zurück übertràgt.

Leider ist das mit Linq2Sql nicht so ganz einfach zu realisieren.
Denn dabei müssen die Entitàten vom Datenkontext getrennt werden
und zum Speichern wieder angehàngt.

Einen Überblick verschafft Dir:
<URL:http://msdn.microsoft.com/de-de/lib...7.aspx>
"Datenabruf und CUD-Operationen in N-Tier-Anwendungen (LINQ to SQL)"

Die Tücke liegt dabei allerdings im Detail.

Gruß Elmar

Public Class NorthwindLinqForm
Private _dataContext As NorthwindDataContext

Public Sub New()
InitializeComponent()
End Sub

' Verwendet einen vorgebenen DataContext
Public Sub New(ByVal datacontext As NorthwindDataContext)
Me.New()
Me._dataContext = datacontext

End Sub

' Der Datenkontext für das Formular
Friend ReadOnly Property DataContext() As NorthwindDataContext
Get
If (Me._dataContext Is Nothing) Then
Me._dataContext = New NorthwindDataContext
End If
Return Me._dataContext
End Get
End Property

Private Sub NorthwindLinqForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load

Dim q = From c In DataContext.Customers _
Where c.Country = "Germany" _
Select c

Me.customerDataGridView.AutoGenerateColumns = True

' Bindet an DataGridView (und ggf. anderes mehr)
Me.customerBindingSource.DataSource = q

End Sub

Private Sub saveButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles saveButton.Click
Try
Me.Validate()
Me.customerBindingSource.EndEdit()
Me.DataContext.SubmitChanges()
Catch ex As Exception
MessageBox.Show("Fehler beim Speichern:" & vbCrLf & ex.Message)
End Try
End Sub
End Class

Ähnliche fragen