| |
ADO.NET / DatenbankenGlobale Connections / SQLite AutoIncrement | | | Autor: Martin_CH | Datum: 22.07.11 15:45 |
| Hallo Zusammen
Ich hab mal kein Problem, sondern möchte nur wissen, ob ich den richtigen Ansatz habe.
Immer wieder lese ich, dass man keine globalen Connections verwenden soll (was ich, wie ich gestehen muss, bis vor kurzem gemacht habe). Also, nicht wirklich global, aber in einer DB-Klasse gab es nur eine einzige Connection. Hat meiner Meinung nach einige Vor- aber auch einige Nachteile.
Nun gut: In meinem neuesten Projekt bin ich davon abgekommen und verwende keine globalen Connections mehr sondern nur einen "globalen" Connectionstring und erstelle die Connection, wenn ich sie brauche.
Jetzt hätte ich eine Frage zum richtigen Vorgehen: Gegeben sei ein DataAdapter mit einer DataTable, die beim Primärschlüssel AutoIncrement auf True und Step und Seed auf -1 hat. Um beim Update des DataAdapters die richtigen, d.h. die Primärschlüssel aus der Datenbank, zurück in die Zeile zu schreiben, verwende ich einen EventHandler, der auf das RowUpdated-Event des Adapters hört.
Wenn ich in diesem Eventhandler aber eine neue Connection erstelle, dann gibt mir "SELECT LAST_INSERT_ID()" (bei SQLite) immer 0 zurück. Eigentlich logisch, da dieser Befehl nur mit der gleichen Connection funktioniert.
Mein Ansatz war jetzt, den "Sender" des Eventhandlers (der vom Typ DataAdapter ist), mit CType zu einem effektiven DataAdapter umzuwandeln und dann die Connection-Eigenschaft des Adapters für das Kommando "SELECT LAST_INSERT_ID()" zu verwenden.
Im Code sieht das dann so aus:
Private Sub DataRowChanged(ByVal sender As Object, ByVal e As _
RowUpdatedEventArgs)
If e.RecordsAffected > 0 AndAlso e.StatementType = _
StatementType.Insert Then
Dim Adapter As SQLiteDataAdapter = CType(sender, SQLiteDataAdapter)
Dim LastID As Integer = -1
Dim Cmd As New SQLiteCommand("SELECT last_insert_rowid()", _
Adapter.SelectCommand.Connection)
Dim ReturnValue As Object = Cmd.ExecuteScalar()
If IsNumeric(ReturnValue) Then
LastID = CInt(ReturnValue)
End If
If Not LastID = -1 Then
e.Row.Item("projectid") = LastID
e.Row.AcceptChanges()
End If
End If
End Sub Meine Frage wäre jetzt, ist mein Ansatz richtig oder gehe ich da den völlig falschen Weg?
Besten Dank für die Experten-Ratschläge im Voraus.
Liebe Grüsse,
Martin | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|