🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: alt.pl.comp.lang.csharp
2 messages
2 total messages Started by Krzysztof Thu, 15 Jan 2004 16:49
Wtawianie danych do tabeli, problem i dwie sciezki - dlugie
#413
Author: Krzysztof
Date: Thu, 15 Jan 2004 16:49
56 lines
3159 bytes
Hi all (dawno mnie tu nie bylo, i ciesze sie ze dyskusje troszke sie
rozwienly :)

Mam taki problem, w trakcie dzialania aplikacji bardzo czesto bede wpisywal
cos to tabeli synchronizowanej pomiedzy dwoma instancjami roznych aplikacji.
Tak wiec w ciagu minuty bedzie dopisywane okolo 130-150 rekordow
(odczytywanych przez druga aplikacje). Staralem sie to wykonac za pomoca
ponizszego kodu, ale "nie dziala", moze ktos na pierwszy rzut oka moze
powiedziec dlaczego? :
(rozwiazanie oparte o Bind, 5 parametrow, pierwsza kolumna jest
autoincrement, tabelna na MS Access)

OleDbConnection dbConn =
(OleDbConnection)dbConnector.getInstnce().getConnection();
OleDbCommand dbCom = new OleDbCommand(sql, dbConn);
dbCom.Parameters.Add( new OleDbParameter("Par1", true) );
dbCom.Parameters.Add( new OleDbParameter("Par2", "DoNikad") );
dbCom.Parameters.Add( new OleDbParameter("Par3", wXml) );
dbCom.Parameters.Add( new OleDbParameter("Par4", DateTime.Now) );
dbCom.Parameters.Add( new OleDbParameter("Par5", DBNull.Value) );
dbCom.Parameters.Add( new OleDbParameter("Par6", false) );
dbCom.ExecuteNonQuery();

komunikat bledu :
Index (zero based) must be greater than or equal to zero and less than the
size of the argument list.

Druga metoda co prawda nie wywala bledu, ale tez nie dopisuje informacji do
tabeli:

OleDbDataAdapter da = new OleDbDataAdapter("select * from " +
TABELA_IMP_EXP,
(OleDbConnection)dbConnector.getInstnce().getConnection() );
da.UpdateCommand = new OleDbCommandBuilder(da).GetUpdateCommand();
DataTable dt = new DataTable();
da.Fill(dt);
DataRow dr = dt.NewRow();
dr[1] = true;
dr[2] = "DoNikad";
dr[3] = wXml;
dr[4] = DateTime.Now;
dr[5] = DBNull.Value;
dr[6] = false;
dt.Rows.Add(dr);
dt.AcceptChanges();
da.Update(dt);

Czy ktos ma sugestie jak to zrobic? Radze sobie baaardzo nieeleganckim
rozwiazaniem - sklejam SQL (jako string) i wywoluje z OleDbCommand. Ale nie
chce tak robic, chce to zrobic zgodnie z zasadami...
Zastanawialem sie nad rozwiazaniem z DataSet, ale pewnie i tak (z
dokumentacji) dodawanie nowego rekordu sprowadzi sie do rozwiazania z
DataTable/DataRow.

Pozdrawiam
Krzysztof
Re: Wtawianie danych do tabeli, problem i dwie sciezki - dlugie
#414
Author: Piotr Olech
Date: Fri, 16 Jan 2004 07:14
86 lines
4388 bytes
No hej,
Na pierwszy rzut oka, to w pierwszym nie widz� o co biega, ale w drugim masz
z�� kolejno�� Update i AcceptChanges. Po AcceptChanges wszystkie rekordy
dostaj� status "original" (czy jako� tak) i �aden nie kwalifikuje si� do
update'u....
Co do 1 rozwi�zania, to:
- co masz na my�li m�wi�c "rozwi�zanie oparte o Bind"? po przyk�adzie tego
nie widz�...
- rozumiem, �e zmienna "sql" w "new OleDbCommand(sql, dbConn)" to polecenie
SQL UPDATE zawieraj�ce znaki "?" w miejscach gdzie chcesz wstawi� parametry?
Co do elegancko�ci rozwi�zania - to kwestia potrzeb. Nie ma sensu (IMHO)
zaprz�ga� DataSet'�w do wykonania jednego prostego Update, ale je�eli ma to
by� kompleksowa obs�uga (pobranie danych, wy�wietlenie, edycja przez
u�ytkownika i zapis, to szkoda si� m�czy� samemu - lepiej wykorzysta� ten
mechanizm)

Pozdr�wka

-- 
Piotr Olech
Remove "spam_off" while answering...

U�ytkownik "Krzysztof" <kkdi...@poczta.onet.pl> napisa� w wiadomo�ci
news:bu6g8u$sku$1@news.onet.pl...
> Hi all (dawno mnie tu nie bylo, i ciesze sie ze dyskusje troszke sie
> rozwienly :)
>
> Mam taki problem, w trakcie dzialania aplikacji bardzo czesto bede
wpisywal
> cos to tabeli synchronizowanej pomiedzy dwoma instancjami roznych
aplikacji.
> Tak wiec w ciagu minuty bedzie dopisywane okolo 130-150 rekordow
> (odczytywanych przez druga aplikacje). Staralem sie to wykonac za pomoca
> ponizszego kodu, ale "nie dziala", moze ktos na pierwszy rzut oka moze
> powiedziec dlaczego? :
> (rozwiazanie oparte o Bind, 5 parametrow, pierwsza kolumna jest
> autoincrement, tabelna na MS Access)
>
> OleDbConnection dbConn =
> (OleDbConnection)dbConnector.getInstnce().getConnection();
> OleDbCommand dbCom = new OleDbCommand(sql, dbConn);
> dbCom.Parameters.Add( new OleDbParameter("Par1", true) );
> dbCom.Parameters.Add( new OleDbParameter("Par2", "DoNikad") );
> dbCom.Parameters.Add( new OleDbParameter("Par3", wXml) );
> dbCom.Parameters.Add( new OleDbParameter("Par4", DateTime.Now) );
> dbCom.Parameters.Add( new OleDbParameter("Par5", DBNull.Value) );
> dbCom.Parameters.Add( new OleDbParameter("Par6", false) );
> dbCom.ExecuteNonQuery();
>
> komunikat bledu :
> Index (zero based) must be greater than or equal to zero and less than the
> size of the argument list.
>
> Druga metoda co prawda nie wywala bledu, ale tez nie dopisuje informacji
do
> tabeli:
>
> OleDbDataAdapter da = new OleDbDataAdapter("select * from " +
> TABELA_IMP_EXP,
> (OleDbConnection)dbConnector.getInstnce().getConnection() );
> da.UpdateCommand = new OleDbCommandBuilder(da).GetUpdateCommand();
> DataTable dt = new DataTable();
> da.Fill(dt);
> DataRow dr = dt.NewRow();
> dr[1] = true;
> dr[2] = "DoNikad";
> dr[3] = wXml;
> dr[4] = DateTime.Now;
> dr[5] = DBNull.Value;
> dr[6] = false;
> dt.Rows.Add(dr);
> dt.AcceptChanges();
> da.Update(dt);
>
> Czy ktos ma sugestie jak to zrobic? Radze sobie baaardzo nieeleganckim
> rozwiazaniem - sklejam SQL (jako string) i wywoluje z OleDbCommand. Ale
nie
> chce tak robic, chce to zrobic zgodnie z zasadami...
> Zastanawialem sie nad rozwiazaniem z DataSet, ale pewnie i tak (z
> dokumentacji) dodawanie nowego rekordu sprowadzi sie do rozwiazania z
> DataTable/DataRow.
>
> Pozdrawiam
> Krzysztof
>
>
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads