AutoIncrementSeed une solution complète qui marche

  • Thread starter Jean-Luc PUCHOT
  • Start date
J

Jean-Luc PUCHOT

C'est un mini exemple avec un DataGrid, un bouton "Add" (pas nécessaire,
juste pour le code) et un bouton "Update".



Le but :



Utiliser des valeurs négatives pour les nouvelles saisies dans les champs
auto incrémentés.

Lors de la mise à jour avec DAProduits.Update(...), on cherche la prochaine
valeur du champ auto incrémenté pour mettre à jour à la fois
l'enregistrement du Dataset (pour le DataGrid...) mais aussi celui situé en
base de données réelle.



Si cette table est liée avec une autre, utiliser les mises à jour en cascade
(dans le DataSet):

ForeignKeyConstraint.acceptRejectRule

ForeignKeyConstraint.DeleteRule

ForeignKeyConstraint.UpdateRule



Cet exemple a été réalisé pour une base de données Access.







Public Class Form1

Inherits System.Windows.Forms.Form



#Region " Code généré par le Concepteur Windows Form "



Private DAProduits As New OleDb.OleDbDataAdapter



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Dim cmdBuilder As New OleDb.OleDbCommandBuilder(DAProduits)



With DAProduits

.SelectCommand = New OleDb.OleDbCommand("SELECT num,libellé FROM
Produits", OleDbConnection1)

.FillSchema(Me.DsProduits1, SchemaType.Source)

'.FillSchema(Me.DsProduits1, SchemaType.Mapped) 'Fonctionne aussi



.InsertCommand = cmdBuilder.GetInsertCommand() '(1)



With Me.DsProduits1.Tables("Produits").Columns("Num")

If .AutoIncrement Then

.AutoIncrementSeed = -1 'Ne marche pas s'il
est placé après le DAProduits.Fill(...)

.AutoIncrementStep = -1

End If

End With

.Fill(Me.DsProduits1, "Produits")

End With



Grid.DataSource = Me.DsProduits1.Tables("Produits")

End Sub



Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnAdd.Click

'Ajout depuis un bouton (pour le code)

'Pas nécessaire car ça fonctionne aussi de manière classique, sans
bouton "Add"

Dim row As DataRow



With Me.DsProduits1.Tables(0)

row = .NewRow

row("Libellé") = "Nouveau produit"

.Rows.Add(row)

.AcceptChanges()

End With

End Sub



Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnUpdate.Click

If DsProduits1.Tables("Produits").Columns("num").AutoIncrement Then

Try

AddHandler DAProduits.RowUpdated, New
OleDb.OleDbRowUpdatedEventHandler(AddressOf OnRowUpdated)

DAProduits.Update(DsProduits1, "Produits")

Finally

RemoveHandler DAProduits.RowUpdated, AddressOf OnRowUpdated

End Try

Else

DAProduits.Update(DsProduits1, "Produits")

End If

End Sub



Private Shared Sub OnRowUpdated(ByVal sender As Object, ByVal e As
OleDb.OleDbRowUpdatedEventArgs)

Dim idCMD As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT
@@IDENTITY", e.Command.Connection)



'Si le nom du champ AutoIncrement est nécessaire, une solution est de
créer manuellement la requête SQL en (1)

'du DAProduits.InsertCommand en plaçant le champ AutoIncrement comme
premier champ

'la ligne ci-dessous devient alors : e.Row(0) =
CInt(idCMD.ExecuteScalar())



If e.Status = UpdateStatus.Continue AndAlso e.StatementType =
StatementType.Insert Then

e.Row("num") = CInt(idCMD.ExecuteScalar())

e.Row.AcceptChanges()

End If

End Sub



End Class
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top