NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Kurz databází - SqlCommandBuilder

V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Tomáš Sobota:4.10.2022 21:50

Ahoj, ve zdejším kurz na databáze použili následující kod k updatovaní databáze.
https://www.itnetwork.cz/…aset-podruhe

SqlCommandBuilder cbKategorie = new SqlCommandBuilder(dataAdapterKategorie);
SqlCommandBuilder cbSlovicka = new SqlCommandBuilder(dataAdapterSlovicka);

dataAdapterKategorie.Update(datovaSada.Tables["Kategorie"]);
dataAdapterSlovicka.Update(datovaSada.Tables["Slovicka"]);

Nechápu ty proměnné cbKategorie a cbSlovicka... nikde se přímo nepoužijí.. jak nastaví příslušný dataAdapter?

Zkusil jsem: ještě nic

Chci docílit: jen zvědavost

Odpovědět
4.10.2022 21:50
Done is better than perfect
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5.10.2022 8:21

cb = call back
Ale jestli se to pouziva, ti nerekne, do toho clanku nevidim. To bys asi musel prostudovat php kod tech metod, abys vedel, co od toho ocekavat, to zna jen autor. Tipnul bych si, ze se to vyuziva v nejake pozdejsi lekci nebo nejak skryte prave v te class a nebo je nutne to doplnit k volani te funkce, kdyz to chces vyuzit. Ale, zrovna v tomto pripade to asi autor nepotreboval.

 
Nahoru Odpovědět
5.10.2022 8:21
Avatar
Odpovídá na Peter Mlich
Tomáš Sobota:5.10.2022 11:48

No uplně tohle si nemyslím... cb = spíš CommandBuilder + zbytek názvu proměné..
Je to kurz na C# databáze, poslední lekce...
Jde o to , že změním údaje v DataSetu co mám v paměti a když chci uložit do databáze potřebuji SqlCommandBuil­der... to chápu.
Tady v tom příkladě se vytvoří, ale přeci se nikde nepoužijí, nic nepředají atd.. nebo stačí, že jsou vytvořené???
Když je odmažu tak to uložení samozřejmě nefunguje...

Nahoru Odpovědět
5.10.2022 11:48
Done is better than perfect
Avatar
Odpovídá na Tomáš Sobota
Petr Štechmüller:5.10.2022 11:57

Ahoj, pár vteřin hledání na netu a v dokumentaci Microsoftu je to krásně popsáno:

public static DataSet SelectSqlRows(string connectionString,
    string queryString, string tableName)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(queryString, connection);
// tady vytvoříš bulider
        SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

        connection.Open();

        DataSet dataSet = new DataSet();
        adapter.Fill(dataSet, tableName);

        //code to modify data in DataSet here

// tady se volá nějaký update command
        builder.GetUpdateCommand();

        //Without the SqlCommandBuilder this line would fail
        adapter.Update(dataSet, tableName);

        return dataSet;
    }
}
Nahoru Odpovědět
5.10.2022 11:57
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Tomáš Sobota:5.10.2022 12:14

Ahoj, díky.. to jsem samozřejmě našel taky, je to prakticky stejné jako v té lekci.. ale asi mi něco základního pořád uniká..
Tady aspon ten CommandBuilder zavolá nějakou metodu... což v tom prvním není,,,
nebo opravdu stačí, že je vytvořený??

Nahoru Odpovědět
5.10.2022 12:14
Done is better than perfect
Avatar
Odpovídá na Tomáš Sobota
Petr Štechmüller:5.10.2022 12:20

C# jsem neviděl hodně dlouho, takže možná řeknu nesmysl, ale z kódu vidím že:

Založíš si nějakou instanci SqlDataAdapteru, kterému nastavíš SelectCommand.
Dále vytvoříš ten SqlCommandBuil­der, kterému dáváš jako instanci adapter.

SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(queryString, connection);

// tady vytvoříš bulider
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

Takže SqlCommandBuilder je závislý na adapteru a něco s ním pak dělá.

Dále se otevře spojení s databází a do adapteru se předá dataSet. Zřejmě data, která se mají nějakým způsobem dostat do databáze.

connection.Open();

DataSet dataSet = new DataSet();
adapter.Fill(dataSet, tableName);

Následující kód nejspíš bude nějakým způsobem připravovat adapter pro updateCommand.

builder.GetUpdateCommand();

No a nakonec zavoláš nad adapterem vlastní update. A jak komentář napovídá, bez SqlCommandBuilder by tahle operace selhala.

//Without the SqlCommandBuilder this line would fail
adapter.Update(dataSet, tableName);
Nahoru Odpovědět
5.10.2022 12:20
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Tomáš Sobota:5.10.2022 13:25

Ahoj, díky za odpovědi k tomu SqlCommandBuil­deru...
Já tak nějak chápu ten kod a ty kroky.... i to že při tvorbě toho SqlCommandBuilder bude pak závislý na adapteru..
(jen teda ten adapter naplní ten dataset, ne naopak ;))
Ale ten adapter nebude přeci nijak závislý na SCB...
prostě mi to nějak nejde do hlavy..

vytvořím SCB
pak adapterem updatuju dataset

chybí mi tam prostě nějaký logický mezikrok kdy SCB něco uděla nebo něco někam předá...

proč pak ty proměnné? Viz ten kod z lekce-

SqlCommandBuilder cbKategorie = new SqlCommandBuilder(dataAdapterKategorie);
SqlCommandBuilder cbSlovicka = new SqlCommandBuilder(dataAdapterSlovicka);

dataAdapterKategorie.Update(datovaSada.Tables["Kategorie"]);
dataAdapterSlovicka.Update(datovaSada.Tables["Slovicka"]);

Možná řeším zbytečně kraviny, jen mi to prostě nějak v hlavě nespíná ;)

Nahoru Odpovědět
5.10.2022 13:25
Done is better than perfect
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5.10.2022 13:58

S c# ti neporadim, v tom nedelam. Forko se c# je jinde. Ale, muzu z toho kohdu, co tu napsali ti vytvorit svoji teorii, podle toho, jak to pracuje v php.

conn = new SqlConnection(connstring) // nejaky class, ktery resi connection

SqlDataAdapter adapter = new SqlDataAdapter(); // nejaky class, ktery resi zpracovani
adapter.SelectCommand = new SqlCommand(queryString, connection); // predas mu sql prikaz s connection (on pak podle toho mozna sam dosadi funkce, ktere ma pouzit, zda ma oracle db, mysql db, mssql db...)
SqlCommandBuilder builder = new SqlCommandBuilder(adapter); // nejaky builder, kdo vi, co dela

connection.Open(); // otevres spojeni

        DataSet dataSet = new DataSet(); // predas adapteru data

// odeslani s builderem
        adapter.Fill(dataSet, tableName);
  builder.GetUpdateCommand();// a reknes buideru, at to posle jako update prikaz

// odeslani bez builderu
 adapter.Update(dataSet, tableName);

Cili, k tve otazce, ty tam builder vubec nepotrebujes, protoze odesilas data primo pres adapter.Update.

Jen nechapu, proc to ma asp tak komplikovane. A nove i php. Ja si vetsinou vystacil se tremi prikazy pro provedeni sql prikazu a tady jich je tak 10 :)
Proto si vetsinou delam vlastni sql class, aby mi stacilo napsat sql->query('sqlprikaz') (php) a nemusel se drbat pokazde s dalsimi 10 radky.

 
Nahoru Odpovědět
5.10.2022 13:58
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5.10.2022 14:01

Takhle, ono to mozna ma svuj duvod, proc se to dela tak nebo jinak. Sql umi transakce. Otevrit spojeni, nasypat 1000 update prikazu, zavrit. A kdyz to selze, tak se da udelat rollback, vratit db do stavu pred updatem. Nehlede na to, ze poslat 1000 prikazu najednou se zpracuje rychleji nez soukat to tam po jednom.
Cili, pro transakce se mozna pouziva builder, ktery tech prikazu umi prijmout vic. A adapter ro pak odesle jako jeden balicek

 
Nahoru Odpovědět
5.10.2022 14:01
Avatar
Tomáš Sobota:5.10.2022 14:12

Je to jen kurz "Uvod do C# databazí", takže to asi pak udělat jednodušeji pujde.. ;)
No já si myslím, že spíš přehlížím něco elementárního.. prostě někdo řekně. že je to takhle a takhle a bude ;)
Možná mám jen zbytečné otázky
Každopádně ten GetUpdateComman­d() je v tom příkladu z dokumentace.. v tom mém z lekce nen.. kdyby tam byl, tak chápu, že "něco" udělá a je to..
A jak píšeš, že ho nepotřebuju.. to jsem si taky myslel, ale bez něj to nefunguje, překladač vyhodí chybu při tom .Update.

Nahoru Odpovědět
5.10.2022 14:12
Done is better than perfect
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.