vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

ADO.NET / Datenbanken
Globale 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
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Globale Connections / SQLite AutoIncrement1.584Martin_CH22.07.11 15:45
Re: Globale Connections / SQLite AutoIncrement1.056ModeratorFZelle22.07.11 21:59
Re: Globale Connections / SQLite AutoIncrement865Martin_CH23.08.11 10:24
Re: Globale Connections / SQLite AutoIncrement850ModeratorFZelle23.08.11 11:48

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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