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
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