Du bist nicht angemeldet.

INOPIAE

Registrierter Benutzer

  • »INOPIAE« ist der Autor dieses Themas

Beiträge: 1 478

Dabei seit: 18. Januar 2009

Hilfreich-Bewertungen: 3

  • Private Nachricht senden

1

Sonntag, 27. Juni 2010, 08:15

Auslesen des neuen Wertes der Schlüsselspalte nach dem Erstellen eines neuen Datensatzes mit @@Identity

Wenn man den neuen Wert einer Schlüsselspalte nach dem Einfügen erhlten möchte, bietet sich der SQL-Befehl @@Identity an.

Als Beispiel wird einen Verbindung zu einer Access-Datenbank genutzt:
 Hier klicken für weitere Informationen

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Imports System.Data.OleDb

Public Class frmTest

.....

    Private Function SpeichernMitNeuemWert()  as int64
        Dim MeinSqlConnection As OleDbConnection = New OleDbConnection(My.Settings.DBConnectionString)

        'Speichern
        Dim MeinSqlString As String = "INSERT INTO Tabelle(Feld1,Feld2, ....) VALUES (Wert1,Wert2,....)"
        Dim MeinSqlCommand As OleDbCommand = New OleDbCommand(MeinSqlString, MeinSqlConnection)
        MeinSqlConnection.Open()

        Try
            MeinSqlCommand.ExecuteNonQuery()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

        'ID-Wert auslesen
        MeinSqlString = "Select @@Identity From tTest"
        MeinSqlCommand.CommandText = MeinSqlString
        Try
            Wert = MeinSqlCommand.ExecuteScalar
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

        MeinSqlConnection.Close()
        
        Return Wert
End Function

.....

End Class



Falls ein anderer Datenbanktyp verwendet werden soll, muss die DLL, die den Zugriff auf die Datenbank steuert ausgetauscht werden.
Dazu muss dann überall im Code OleDB durch die entspechende Information ersetzt werden.
z.B. für den Zugriff auf MS SQL-Server bzw. MS SQL.ServerExpress OleDB durch SQL

 Hier klicken für weitere Informationen

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Imports System.Data.SQLClient
    Public Class frmTest

.....

        Private Function SpeichernMitNeuemWert() As Int64
            Dim MeinSqlConnection As SQLConnection = New SQLConnection(My.Settings.DBConnectionString)

            'Speichern
            Dim MeinSqlString As String = "INSERT INTO Tabelle(Feld1,Feld2, ....) VALUES (Wert1,Wert2,....)"
            Dim MeinSqlCommand As SQLCommand = New SQLCommand(MeinSqlString, MeinSqlConnection)
            MeinSqlConnection.Open()

            Try
                MeinSqlCommand.ExecuteNonQuery()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

            'ID-Wert auslesen
            MeinSqlString = "Select @@Identity From tTest"
            MeinSqlCommand.CommandText = MeinSqlString
            Try
                Wert = MeinSqlCommand.ExecuteScalar
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

            MeinSqlConnection.Close()

            Return Wert
        End Function

.....

 End Class


NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »INOPIAE« (27. Juni 2010, 09:42)


ErfinderDesRades

Wer nicht fragt bleibt dumm

Beiträge: 5 507

Dabei seit: 18. Februar 2011

Hilfreich-Bewertungen: 647

  • Private Nachricht senden

2

Sonntag, 24. Juli 2011, 21:32

Anwendung bei der Befüllung von Tabellen im typisierten Dataset

Hi!

Ich hatte eiglich vor, selbst ein Snippet zum Thema einzustellen, finde aber, es passt ausgezeichnet hier als Anhang:

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Imports System.Data.OleDb

Namespace MAAutoWertDataSetTableAdapters

   Partial Public Class MitarbeiterTableAdapter

      Private _IdentityCommand As New OleDbCommand("SELECT @@IDENTITY")

      Private Sub Adapter_RowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs) Handles _adapter.RowUpdated
         If e.StatementType = StatementType.Insert Then
            _IdentityCommand.Connection = e.Command.Connection
            _IdentityCommand.Transaction = e.Command.Transaction
            e.Row(e.Row.Table.PrimaryKey(0)) = _IdentityCommand.ExecuteScalar()
         End If
      End Sub

   End Class
End Namespace
Hier ist das Command, mit welchem die Identity geholt wird ins DataAdapter_RowUpdated - Event eines typisierten TableAdapters gelegt.
Wenn nun der TableAdapter eine DataTable updated, fragt er bei Insert-Commands gleich den von der DB generierten Primkey ab, und pflegt ihn in die soeben abgespeicherte DataRow ein, sodasser im weiteren sofort im Dataset verfügbar ist.
»ErfinderDesRades« hat folgende Datei angehängt:
  • UpdateDB.zip (156,65 kB - 17 mal heruntergeladen - zuletzt: 4. Februar 2012, 16:54)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ErfinderDesRades« (20. Januar 2012, 10:56)


HerrFrie

- zensiert -

  • »HerrFrie« ist männlich

Beiträge: 468

Dabei seit: 1. April 2008

Wohnort: Sauerland

Hilfreich-Bewertungen: 34

  • Private Nachricht senden

3

Freitag, 20. Januar 2012, 07:27

Hallo Erfinder,

ich habe jetzt ein Testprojekt erstellt und eine Datenbank eingebunden.
Wenn ich nun deinen Codeschnipsel in den Code des DataSet einfüge, bekomme ich eine Fehlermeldung, dass die Handles Klausel ein WithEvent benötigt.
Ich habe in der MAAutoWertDataSet.Designer.vb gesehen, dass dort auch noch was eingetragen wurde, dort auch das WithEvent.
Wird das dort nicht alles automatisch eingetragen oder wie genau kann ich deinen Code ans Laufen bekommen ?

Gruß
HerrFrie

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »HerrFrie« (20. Januar 2012, 11:33)


ErfinderDesRades

Wer nicht fragt bleibt dumm

Beiträge: 5 507

Dabei seit: 18. Februar 2011

Hilfreich-Bewertungen: 647

  • Private Nachricht senden

4

Freitag, 20. Januar 2012, 12:10

Das Einfügen des CodeSchnippels erfordert ein Verständnis von partialen Klassen.

Bei partialen Klassen wird der Code einer Klasse auf mehrere Dateien aufgeteilt. Ein Beispiel was jeder kennt benutzt, ist der Form-User-Code, wo man üblicherweise die Eventhandler von Button-Klicks etc. implementiert.
Die Datei, die man durch doppelklick im Designer auf einen Button öffnet, ist nur die Teil-Klasse des gesamten Forms. Der annere Teil befindet sich in der Datei "Form1.Designer.vb"

Und genauso geht man am besten auch vor, wenn man einen generierten TableAdapter um das Row_Updated-Ereignis erweitern möchte:
Im Dataset-Designer auf den TableAdapter doppelklicken, sodaß man in den UserCode des Datasets kommt.

Ist bischen komplexer, denn in dieser User-Code-Datei können mehrere partiale klassen angelegt sein. DoppelKlickst man etwa auf eine DataTable, so wird das DataTable_RowChanging-Event generiert, in der Partialen Klasse der gedoppelklicksten DataTable.

Also auf den typisierten TableAdapter doppelklicksen, und dort den gezeigten Code in die dadurch generierte partiale TableAdapter-Klasse einpasten.
Denn nur innerhalb der partialen Klasse des TableAdapters besteht zugriff auf die WithEvents-Variable "_adapter".