|
Ve Vaší ukázce kombinujete "automatické" generování SQL příkazů pomocí OleDbCommandBuilderu a "ruční" nastavení příkazu pro INSERT. To určitě lze, ale plnou kontrolu máte jen nad operacemi, které používají příkaz INSERT, tedy při vložení nových řádků do mřížky potažmo tabulky. Zkuste se při krokování programu podívat jaké příkazy vygeneroval OleDbCommandBuilder a přiřadil je vlastnostem da.UpdateCommand a da.DeleteCommand. Níže přikládám kus kódu pro řešení podobného problému, který mi funguje. Používá sice jmenný prostor SQLClient pro práci s MS SQL Serverem, ale metody a principy by měly být stejné (je tam trochu jiná syntaxe pro předávání parametrů). Mezi objekt DataTable mám vložen ještě objekt BindingSource, který lze s výhodou použít pro filtrování a řazení dat v mřížce
Imports System.Data.SqlClient
Imports System.Windows.Forms
Imports System.IO
Imports System.Diagnostics
Public Class frmMain
Private dtAkce As DataTable
Private daAkce As SqlDataAdapter
Private dsDostihy As DataSet
Private cbAkce As SqlCommandBuilder
Private WithEvents bsAkce As BindingSource
Private cmdPom As SqlCommand
Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
con = New SqlConnection(My.Settings.Default.ConnnectionString)
con.Open() 'Otevreni spojeni na databazi
Catch exc As SqlException
MessageBox.Show(exc.Number & vbCrLf & exc.Message)
Exit Sub
Catch oexc As Exception
MessageBox.Show(oexc.Message)
Exit Sub
End Try
dsDostihy = New DataSet("Dostihy")
cmdAkce = New SqlCommand(cmdAkceText, con) 'Definice Selectu pro data adapter Akce
daAkce = New SqlDataAdapter(cmdAkce) 'Inicializace datoveho adapteru
dtAkce = New DataTable("Akce") 'Inicializace datove tabulky dtAkce
dsDostihy.Tables.Add(dtAkce) 'Pridani datove tabulky dtAkce do datasetu
daAkce.MissingSchemaAction = MissingSchemaAction.AddWithKey 'Zaridi, ze do schematu v Datasetu se pridaji informace o klicich z podkladove DB
daAkce.Fill(dtAkce) 'Naplneni tabulky dtAkce z podkladove databaze
cbAkce = New SqlCommandBuilder(daAkce) 'Automaticke vygenerovani SQL prikazu pro Update, Insert a Delete
'ruční vytvoření příkazu pro DELETE
cmdPom = New SqlCommand("DELETE FROM [Akce] WHERE [AKC_ID] = @p1", con)
parPom = New SqlParameter("@p1", SqlDbType.Int, 0, ParameterDirection.Input, False, 0, 0, "AKC_ID", DataRowVersion.Current, Nothing)
cmdPom.Parameters.Add(parPom)
daAkce.DeleteCommand = cmdPom
'ruční vytvoření příkazu pro UPDATE
cmdPom = New SqlCommand("UPDATE [Akce] SET [AKC_DatumKonani] = @p1, [ZAV_ID] = @p2, [AKC_Nazev] = @p3 WHERE [AKC_ID] = @p4", con)
parPom = New SqlParameter("@p1", SqlDbType.DateTime, 0, ParameterDirection.Input, False, 0, 0, "AKC_DatumKonani", DataRowVersion.Current, Nothing)
cmdPom.Parameters.Add(parPom)
parPom = New SqlParameter("@p2", SqlDbType.Int, 0, ParameterDirection.Input, False, 0, 0, "ZAV_ID", DataRowVersion.Current, Nothing)
cmdPom.Parameters.Add(parPom)
parPom = New SqlParameter("@p3", SqlDbType.NVarChar, 0, ParameterDirection.Input, False, 0, 0, "AKC_Nazev", DataRowVersion.Current, Nothing)
cmdPom.Parameters.Add(parPom)
parPom = New SqlParameter("@p4", SqlDbType.Int, 0, ParameterDirection.Input, False, 0, 0, "AKC_ID", DataRowVersion.Current, Nothing)
cmdPom.Parameters.Add(parPom)
daAkce.UpdateCommand = cmdPom
dgwAkce.AutoGenerateColumns = False
bsAkce = New BindingSource(dsDostihy, "Akce") 'Inicializace vazebniho prvku pro tabulku Akce
dgwAkce.DataSource = bsAkce 'Inicializace datove mrizky pro tabulku Akce
'obecna procedura pro ulozeni jakekoli tabulky z datasetu
Private Sub UlozTabulku(ByRef dtPom As DataTable, ByRef daPom As SqlDataAdapter)
BindingContext(dtPom).EndCurrentEdit()
Dim dt As DataTable = dtPom.GetChanges 'nacteni zmenenych radku do pomocne data table
If Not dt Is Nothing Then
Try
daPom.Update(dt)
dtPom.AcceptChanges()
Catch exc As SqlException
MessageBox.Show(exc.Number & vbCrLf & exc.Message)
Exit Sub
Catch oexc As Exception
MessageBox.Show(oexc.Message)
Exit Sub
End Try
End If
End Sub
Private Sub bsAkce_CurrentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles bsAkce.CurrentChanged
UlozTabulku(dtAkce, daAkce)
End Sub
Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoad.Click
daAkce.Fill(dtAkce)
End Sub
|