Já jsem před rokem s editací tabulek podkladové DB v Datagridview začínal podobně, tedy naklikáním ve wizardu a když jsem si pak prohlédl tři a půl tisíce řádků kódu, který designer na tu jednoduchou úlohu vyprodukoval a kterému jsem hlavně z větší části nerozuměl, šel jsem na to "ručně", tedy vlastní deklarací a použitím objektů SqlConnection, SqlCommand, SqlDataAdapter a BindingSource. Samotného by mě zajímal názor opravdového odborníka na srovnání těchto dvou postupů. Přikládám pár kousků kódu:
Private con As SqlConnection 'Spojeni na databazi
Private cmdSeznam As SqlCommand 'SQL příkaz pro SELECT z tabulky Seznam
Private daSeznam As SqlDataAdapter 'DataAdapter pro tabulku Seznam
Private ds As DataSet 'Dataset
Private WithEvents bsSeznam As BindingSource 'Datový zdroj spojující Dataset a zobrazovací mřížku Seznam
Private Const mTabulkaSeznam As String = "Seznam" 'Název tabulky
Private Function InitTable() As Boolean
'Úvodní inicializace
InitTable = False
ds = New DataSet
Try
con = New SqlConnection(My.Settings.ConStr) 'Tady je connectionstring
con.Open() 'Otevření spojení na databázi
cmdSeznam = New SqlCommand("SELECT * FROM " + mTabulkaSeznam + " ORDER BY SEZ_ID", con) ' SELECT, kterým se získají data z DB (upravit * na konkrétní výčet požadovaných sloupců)
cmdSeznam.CommandType = CommandType.Text
daSeznam = New SqlDataAdapter(cmdSeznam)
daSeznam.MissingSchemaAction = MissingSchemaAction.AddWithKey
Dim cbSeznam As New SqlCommandBuilder(daSeznam)
daSeznam.InsertCommand = cbSeznam.GetInsertCommand
daSeznam.UpdateCommand = cbSeznam.GetUpdateCommand
daSeznam.DeleteCommand = cbSeznam.GetDeleteCommand
daSeznam.Fill(ds) 'Naplnění dat z podkladové DB do objektu DataTable v datasetu
ds.Tables(ds.Tables.Count - 1).TableName = mTabulkaSeznam
bsSeznam = New BindingSource(ds, ds.Tables(ds.Tables.Count - 1).TableName) 'Vytvoření datového zdroje pro mřížku
dgvSeznam.DataSource = bsSeznam 'provazani mrizky s datovym zdrojem
InitTable = True
Catch exc As SqlException
MessageBox.Show(exc.ErrorCode & vbCrLf & exc.Message)
Catch exc As Exception
MessageBox.Show(exc.Message)
Finally
If con.State = ConnectionState.Open Then con.Close()
End Try
End Function
Tabulka v datasetu průběžně "eviduje" všechny editační změny v mřížce, které provádíš. Pokud chceš tyto změny uložit do podkladové DB, zavoláš funkci UlozZmeny - viz nize.
Private Sub UlozZmeny(ByRef da As SqlDataAdapter, ByVal sTable As String)
'Procedura, která promítne změny provedené v mřížkách do databáze, volá se při změně aktuálního řádku v mřížce
BindingContext(ds.Tables(sTable)).EndCurrentEdit() 'Ukončení editace
Dim dt As DataTable = ds.Tables(sTable).GetChanges 'Změněné řádky
If dt IsNot Nothing Then
da.Update(dt) 'Update databáze
For Each dr As DataRow In ds.Tables(sTable).Select("", "", (DataViewRowState.CurrentRows And Not DataViewRowState.Unchanged) Or DataViewRowState.Deleted)
dr.AcceptChanges()
Next
End If
End Sub
Takhle jsem to vrychlosti vypáral z hotového kódu, snad to pomůže. Minimálně v tom, že si můžeš nastudovat další věci o použitých třídách.
|