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.

Člen

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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 SqlCommandBuilder... 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...
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;
}
}
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ý??
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 SqlCommandBuilder, 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);
Ahoj, díky za odpovědi k tomu SqlCommandBuilderu...
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á
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.
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
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 GetUpdateCommand() 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.
Zobrazeno 10 zpráv z 10.