Autor:
Hannes Preishuber
Erstellt am:
02 Jul 2002 09:11
|
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. - Die Werte in der DataRow werden übergeben.
- Das OnRowUpdating Event wird gestartet.
- Das Kommando wird durchgeführt
- Mögliche Output Parameter werden in der Datarow platziert.
- Das OnRowUpdated Event wird gestartet.
- AcceptChanges wird aufgerufen.
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.
|
|