DevTrain

Autor: Hannes Preishuber

Autowert in ADO .NET und Access 2000

Microsoft Access ist eine unter ASP (und auch anderen) Programmierern häufig verwendete Datenbank.
Access unterstützt aber keine Stored Procedures und so ist es auch nicht möglich mit Output Parametern zu arbeiten um Identitäten von neu angelegten Datensätzen zu erhalten.
Access 2000 unterstützt nun aber das @@IDENTITY Kommando mit dem die aktuelle ID abgefragt werden kann. So ist der Weg frei zu einem Lösungsansatz der ähnlich der mit Stored Procedures ist. Dies wurde auch hier bereits erläutert.
Wenn Update ausgeführt wird, werden zwei Events gefeuert. Die Reihenfolge ist wie folgt.
Zunächst muss die Connection zur Access2000 Datenbank angelegt werden. Ein Dataadapter wird mit Select Kommando und dem Insert Kommando bestückt. Das Dataset wird per Fill mit Daten gefüllt.
Bisher wars nur Vorspiel, jetzt gehts erst richtig zur Sache.
Beim anlegen eines neuen Datensatzes wird eine Datarow benötigt, deren (leere) Instanz über das NewRow Kommando geliefert wird. Die Datarow wird mit Daten gefüllt. In der Kategorien Tabelle muss das Feld Kategorien eindeutig sein. Deshalb schreiben wir hier die Millisekunden rein. Die fertige Row wird dann an das Dataset angehängt. Bevor wir nun zum Update schreiten muss ein EventHandler aktiviert werden, der beim Update gefeuert wird. Mit diesem beschäftigen wir uns ein wenig später. Nach dem Update kann der Handler wieder deaktiviert werden. Damit der Carbage Collector die Connection schnellstmöglich wieder frei gibt, sollte per Close die Connection geschlossen werden.
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   Conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                            "Data Source=c:dotnet wind.mdb;")
   Dim DA As OleDbDataAdapter = New OleDbDataAdapter("SELECT [Kategorie-Nr],KategorieName FROM Kategorien ORDER BY [Kategorie-Nr]", Conn)
   DA.InsertCommand = New OleDbCommand("INSERT INTO Kategorien (KategorieName) Values(?)", Conn)
   DA.InsertCommand.CommandType = CommandType.Text
   DA.InsertCommand.Parameters.Add("@KategorieName", OleDbType.Char, 15, "KategorieName")
   Conn.Open()
   Dim DS As New DataSet()
   DA.Fill(DS, "Kategorien")
   Dim newRow As DataRow = DS.Tables("Kategorien").NewRow()
   newRow("KategorieName") = Date.Now.Millisecond.ToString
   DS.Tables("Kategorien").Rows.Add(newRow)
   AddHandler DA.RowUpdated, New OleDbRowUpdatedEventHandler(AddressOf OnRowUpdated)
   DA.Update(DS, "Kategorien")
   RemoveHandler DA.RowUpdated, New OleDbRowUpdatedEventHandler(AddressOf OnRowUpdated)
   Response.Write(newRow.Item("Kategorie-Nr"))
   Conn.Close()
End Sub

OnRowUpdated wird sofort nach dem Einfügen ausgeführt. Hier kann ein Select Kommando den neuen Wert abfragen. Sie brauchen keine Sorgen haben, das bei mehreren gleichzeitigen Inserts der falsche Wert kommt.
Per Command und ExecuteScalar erhalten wir dann die ID, die wir direkt in das Dataset in die neue Row zurückschreiben.
Private Shared Sub OnRowUpdated(ByVal sender As Object, ByVal args As OleDbRowUpdatedEventArgs)
        Dim NEWID As Integer
        Dim myCmd As OleDbCommand = New OleDbCommand("SELECT @@IDENTITY", Conn)
        If args.StatementType = StatementType.Insert Then
            NEWID = CInt(myCmd.ExecuteScalar())
            args.Row("Kategorie-Nr") = NEWID
        End If
End Sub

Zur Kontrolle lassen wir die NewRow ID per Response.Write ausgeben.
Microsoft versucht seit einiger Zeit mit der Kostenlosen MSDE (Microsoft Data Engine) Access auszuteiben. Die MSDE ist ein abgespeckter SQL Server. Entgegen allen Gerüchten ist die Anzahl der möglichen Connections nicht limitiert. Ein neur Trend ist die Verwendung von MYSQL. Davon ist aktuell aber abzuraten, da MySQL in der Enticklung erst am Anfang steht und wesentliche Technologien nicht oder nur unzureichend beherrscht.

Erfasst am: 02.07.2002 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=781
© Copyright 2003 ppedv AG - http://www.ppedv.de