🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: alt.pl.comp.lang.csharp
9 messages
9 total messages Started by rozrabiak Fri, 09 Apr 2004 21:51
procedurka...
#890
Author: rozrabiak
Date: Fri, 09 Apr 2004 21:51
46 lines
2473 bytes
Witam.
Mam taka oto procedurke:

public void czytajObraz()
{
   if (datas.Tables["capsch"].Rows.Count > 0)
   {
    picbox.Image = null;
    if (!Convert.IsDBNull(datas.Tables["capsch"].Rows[context[datas, 
"capsch"].Position]["Fig"]))
    {
     fig = (byte[])datas.Tables["capsch"].Rows[context[datas, 
"capsch"].Position]["Fig"];
     if (fig.Length > 0)
     {
       System.IO.MemoryStream strfig = new System.IO.MemoryStream(fig, 
true);
       strfig.Write(fig, 0, fig.Length);						      Bitmap bmp1 = new 
Bitmap(strfig);
       picbox.Image = bmp1;							      strfig.Close();
     } // if (fig.Length > 0)
    }
   }
}

Jest ona wykonywana podczas przechodzenia pomiedzy rekordami, laduje ona 
obrazek do pictureBox-a i wyswietla na formie. Jednak w momencie, gdy 
rekord zostanie RemoveAt(...) lub Delete() wywala blad:

System.Data.DeletedRowInaccessibleException: Nie można uzyskać dostępu 
do informacji o usuniętym wierszu za pośrednictwem tego wiersza.
    at System.Data.DataRow.GetDefaultRecord()
    at System.Data.DataRow.GetRecordFromVersion(DataRowVersion version)
    at System.Data.DataRow.get_Item(String columnName)
    at capch.nawigacja.czytajObraz()

i podobnie dzieje sie z rekordami swiezo dodanymi do dataset'a.
Pytanie: czy musze sprawdzac za kazdym razem ifem czy "wchodze" do 
rekordu usunietego czy istnieje inny sposob na przeskoczenie tego bledu?
I druga sprawa: jezeli musze sprawdzac ifem rekordy skasowane, to co w 
tym wypadku z rekordami wstawionymi, ale nie dodanymi jeszcze do bazy?

pozdrawiam, grzes.

PS: Wesolych Swiat Wielkanocnych, mokrego dyngusa i smacznego jajka 
Wszystkim grupowiczom :-)
Re: procedurka...
#891
Author: rozrabiak
Date: Sat, 10 Apr 2004 07:43
21 lines
1745 bytes
Użytkownik rozrabiak napisał:
> Witam.
> i podobnie dzieje sie z rekordami swiezo dodanymi do dataset'a.
> Pytanie: czy musze sprawdzac za kazdym razem ifem czy "wchodze" do 
> rekordu usunietego czy istnieje inny sposob na przeskoczenie tego bledu?
> I druga sprawa: jezeli musze sprawdzac ifem rekordy skasowane, to co w 
> tym wypadku z rekordami wstawionymi, ale nie dodanymi jeszcze do bazy?
> 
> pozdrawiam, grzes.
> 
> PS: Wesolych Swiat Wielkanocnych, mokrego dyngusa i smacznego jajka 
> Wszystkim grupowiczom :-)

Errata z powodu poznej pory pisania tego posta:
Przy wstawianiu rekordow tak sie NIE dzieje.
Gdy usuwam rekord jest on oznaczany jako Deleted, gdy przechodze miedzy 
rekordami i trafiam w miejsce, gdzie jest skasowany otrzymuje blad 
zawarty w poprzednim poscie. Niestety nie mam pojecia jak uniknac tego 
bledu :(

pozdrawiam, grzes
Re: procedurka...
#892
Author: Michal Wojas
Date: Sat, 10 Apr 2004 12:44
64 lines
3241 bytes
rozrabiak wrote:
> Witam.
> Mam taka oto procedurke:
>
> public void czytajObraz()
> {
>    if (datas.Tables["capsch"].Rows.Count > 0)
>    {
>     picbox.Image = null;
>     if (!Convert.IsDBNull(datas.Tables["capsch"].Rows[context[datas,
> "capsch"].Position]["Fig"]))
>     {
>      fig = (byte[])datas.Tables["capsch"].Rows[context[datas,
> "capsch"].Position]["Fig"];
>      if (fig.Length > 0)
>      {
>        System.IO.MemoryStream strfig = new System.IO.MemoryStream(fig,
> true);
>        strfig.Write(fig, 0, fig.Length);       Bitmap bmp1 = new
> Bitmap(strfig);
>        picbox.Image = bmp1;       strfig.Close();
>      } // if (fig.Length > 0)
>     }
>    }
> }
>
> Jest ona wykonywana podczas przechodzenia pomiedzy rekordami, laduje
> ona obrazek do pictureBox-a i wyswietla na formie. Jednak w momencie,
> gdy rekord zostanie RemoveAt(...) lub Delete() wywala blad:
>
> System.Data.DeletedRowInaccessibleException: Nie mo�na uzyska� dost�pu
> do informacji o usuni�tym wierszu za po�rednictwem tego wiersza.
>     at System.Data.DataRow.GetDefaultRecord()
>     at System.Data.DataRow.GetRecordFromVersion(DataRowVersion
>     version) at System.Data.DataRow.get_Item(String columnName)
>     at capch.nawigacja.czytajObraz()
>
> i podobnie dzieje sie z rekordami swiezo dodanymi do dataset'a.
> Pytanie: czy musze sprawdzac za kazdym razem ifem czy "wchodze" do
> rekordu usunietego czy istnieje inny sposob na przeskoczenie tego
> bledu? I druga sprawa: jezeli musze sprawdzac ifem rekordy skasowane,
> to co w tym wypadku z rekordami wstawionymi, ale nie dodanymi jeszcze
> do bazy?
Nie do konca rozumiem dlaczego stanowi dla Ciebie problem, cos co generalnie
uwazane jest za "dobry nawyk programistyczny" ... mowa tutaj o warunkach
progowych, wyjatkach ... Masz do czynienia z prostym przypadkiem, gdzie
wyj�tek �w, wyst�pi� na twoich oczach. Gorszym przypadkiem jest gdy
wyst�puje on, po oddaniu programu klientowi i gdy dzwoni do Ciebie np. w
srodku fajnej imprezy ;)

No dobra ale wracajac do tego przypadku zalatwia sie go mniej wiecej tak ...

try
{
   twoj kod ...
}
catch (Exception e)
{
   //Ewentualnie zapisac e.Message do jakiegos pliku tekstowego tudziez bazy
}

Pewnie znasz juz try, wydaje mi sie idealne w tej sytuacji

MW
Re: procedurka...
#893
Author: rozrabiak
Date: Sat, 10 Apr 2004 12:53
23 lines
1775 bytes
Użytkownik Michal Wojas napisał:
> 
> Nie do konca rozumiem dlaczego stanowi dla Ciebie problem, cos co generalnie
> uwazane jest za "dobry nawyk programistyczny" ... mowa tutaj o warunkach
> progowych, wyjatkach ... Masz do czynienia z prostym przypadkiem, gdzie
> wyjątek ów, wystąpił na twoich oczach. Gorszym przypadkiem jest gdy
> występuje on, po oddaniu programu klientowi i gdy dzwoni do Ciebie np. w
> srodku fajnej imprezy ;)
> 

Witam.
Dziekuje za zaintersowanie problemem :)

Znam try doskonale, jednak samo try nie rozwiaze problemu. Opisze 
dokladnie co i jak:

Laduje dane do datasetu, przechodze np: do 3 rekordu, wciskam delete 
jest wyjatek. Rekord nr 4 przeskakuje na miejsce rekordu 3 i dla niego 
NIE LADUJE OBRAZKA bo rekord nr 3 jest oznaczony jako skasowany :/

Takze try nie rozwiaze problemu, niestety :(

pozdrawiam, grzes.
Re: procedurka...
#894
Author: Marek Janaszewski USUNTO. z adre...
Date: Sat, 10 Apr 2004 16:53
56 lines
2611 bytes
Michal Wojas wrote:
[...]
> Nie do konca rozumiem dlaczego stanowi dla Ciebie problem, cos co
> generalnie uwazane jest za "dobry nawyk programistyczny" ... mowa
> tutaj o warunkach progowych, wyjatkach ... Masz do czynienia z
> prostym przypadkiem, gdzie wyjątek ów, wystąpił na twoich oczach.
> Gorszym przypadkiem jest gdy występuje on, po oddaniu programu
> klientowi i gdy dzwoni do Ciebie np. w srodku fajnej imprezy ;)
>
> No dobra ale wracajac do tego przypadku zalatwia sie go mniej wiecej
> tak ...
>
> try
> {
>    twoj kod ...
> }
> catch (Exception e)
> {
>    //Ewentualnie zapisac e.Message do jakiegos pliku tekstowego
> tudziez bazy }
>
> Pewnie znasz juz try, wydaje mi sie idealne w tej sytuacji
[...]

Witam!

W książce o Javie wyczytałem, że nie należy zastępować prostego testowania
obsługą wyjątków. Otóż obsługa wyjątku nieco bardziej kosztowna niż zwykły
skok w programie. Jeśli jakaś operacja wykonywana jest w pętli i nastąpi
wielokrotnie wyjątek to spowolni to wykonywanie całej pętli.

Ponad to wygląda, że trzeba napisać w każdym projekcie ogólną metode łapania
wszystkich wcześniej nie złapanych.

Czyli:

  static void Main()
  {
   Application.ThreadException += new
ThreadExceptionEventHandler(UnhandledExceptionCatcher);
   Application.Run(new WinForm());
  }

  private static void UnhandledExceptionCatcher(object sender,
ThreadExceptionEventArgs e)
  {
   MessageBox.Show(e.Exception.Message, "Błąd");
  }

W pomocy MSDN jest nawet bardzie rozbudowany przykład dla tego zdarzenia z
obsługą wyjątków w obsłudze wyjątków.

-- 
Pozdrawiam,
Marek Janaszewski
[ j_m...@gazeta.pl ]
Re: procedurka...
#896
Author: Marek Janaszewski USUNTO. z adre...
Date: Sat, 10 Apr 2004 17:00
22 lines
1581 bytes
rozrabiak wrote:
[...]
> System.Data.DeletedRowInaccessibleException: Nie można uzyskać dostępu
> do informacji o usuniętym wierszu za pośrednictwem tego wiersza.
>     at System.Data.DataRow.GetDefaultRecord()
>     at System.Data.DataRow.GetRecordFromVersion(DataRowVersion
>     version) at System.Data.DataRow.get_Item(String columnName)
>     at capch.nawigacja.czytajObraz()
[...]

Witam!

W pomocy jest opisany ten wyjątek, na czym polega problem:
Represents the exception that is thrown when an action is attempted on a
DataRow that has been deleted.

Nie należy wykonywać operacji na rekordzie zaznaczonym do usunięcia.

-- 
Pozdrawiam,
Marek Janaszewski
[ j_m...@gazeta.pl ]
Re: procedurka...
#897
Author: rozrabiak
Date: Sat, 10 Apr 2004 17:38
41 lines
2424 bytes
Użytkownik Marek Janaszewski (USUN_TO. z adresu!) napisał:
> Witam!
> 
> W pomocy jest opisany ten wyjątek, na czym polega problem:
> Represents the exception that is thrown when an action is attempted on a
> DataRow that has been deleted.
> 
> Nie należy wykonywać operacji na rekordzie zaznaczonym do usunięcia.
> 

Nie wykonuje na nim operacji! Naciska przycisk, ktory usuwa rekord z 
dataset-u, czyli nastepuje cos na zasadzie (chyba) ukrycie rekordow do 
usuniecia. Wykonuje sie to:

    if (!Convert.IsDBNull(datas.Tables["capsch"].Rows[context[datas, 
"capsch"].Position]["Fig"]))
    {
     fig = (byte[])datas.Tables["capsch"].Rows[context[datas, 
"capsch"].Position]["Fig"];

i wtedy wlasnie nastepuje wyjatek. Nie mam pojecia jak inaczej to 
wytlumaczyc :( nawet, gdy klikne na przycisk odpowiadajacy za przejscie 
do nastepnego rekordu lub poprzedniego wyskakuje wtedy wyjatek.
Procedura kasujaca wyglada tak:

public void delete()	//usun rekord
{
datas.Tables["capsch"].Rows[context[datas, "capsch"].Position].BeginEdit();

datas.Tables["capsch"].Rows[context[datas, "capsch"].Position].Delete();
				datas.Tables["capsch"].Rows[context[datas, 
"capsch"].Position].EndEdit();
picbox.Image = null;		//null dla pictureBox
czytajObraz();			//wywolanie procedury wczytujacej obrazek (pierwszy moj 
post)
dszmiana();			//odpowiada za wyswietlenie ilosci rekordow i aktualnego 
rekordu
}

Nie mam pojecia jak wytlumaczyc to zjawisko, ale jest ono chore :/
pozdrawiam, grzes
Re: procedurka...
#895
Author: Michal Wojas
Date: Sun, 11 Apr 2004 22:21
20 lines
1526 bytes
>   static void Main()
>   {
>    Application.ThreadException += new
> ThreadExceptionEventHandler(UnhandledExceptionCatcher);
>    Application.Run(new WinForm());
>   }
>
>   private static void UnhandledExceptionCatcher(object sender,
> ThreadExceptionEventArgs e)
>   {
>    MessageBox.Show(e.Exception.Message, "B��d");
>   }
>
> W pomocy MSDN jest nawet bardzie rozbudowany przyk�ad dla tego
> zdarzenia z obs�ug� wyj�tk�w w obs�udze wyj�tk�w.

Fajne, podoba mi sie. Do tego jeszcze nie doszedlem ... Dzieki

MW
Re: procedurka...
#898
Author: Marek Janaszewski USUNTO. z adre...
Date: Mon, 12 Apr 2004 20:52
64 lines
3596 bytes
rozrabiak wrote:
> Użytkownik Marek Janaszewski (USUN_TO. z adresu!) napisał:
>> Witam!
>>
>> W pomocy jest opisany ten wyjątek, na czym polega problem:
>> Represents the exception that is thrown when an action is attempted
>> on a DataRow that has been deleted.
>>
>> Nie należy wykonywać operacji na rekordzie zaznaczonym do usunięcia.
>>
>
> Nie wykonuje na nim operacji! Naciska przycisk, ktory usuwa rekord z
> dataset-u, czyli nastepuje cos na zasadzie (chyba) ukrycie rekordow do
> usuniecia. Wykonuje sie to:

Witam!

Rekord jest oznaczany do usunięcia. DataSet przechowuje tabele w pamięci. Ty
definiujesz jak załadować taką tabele z bazy danych i jak na podstawie
dokonanych zmian dokonać aktualizacji bazy danych. W tym czasie program
nawet nie musi być połączony z bazą danych. Zdaje się, że taki model pracy
nazywa się aktówkowym. Także DataSet musi śledzić wszystkie zmiany w
rekordzie, równie przechowywać stare wartości. Jeśli np. zechcesz po starej
wartość odszukać rekord aby go zaktualizować do nowych lub stwierdzić, że
ktoś w tym czasie także grzebał przy rekordzie w tych samych polach co
użytkownik i np. poproście użytkownika o rozwiązanie konfliktu. To się
nazywa optymistyczny model blokowania. W każdym razie zapytania SQL trzeba
jakość przygotować do takiego DataSetu.

>     if (!Convert.IsDBNull(datas.Tables["capsch"].Rows[context[datas,
> "capsch"].Position]["Fig"]))
>     {
>      fig = (byte[])datas.Tables["capsch"].Rows[context[datas,
> "capsch"].Position]["Fig"];
>
> i wtedy wlasnie nastepuje wyjatek. Nie mam pojecia jak inaczej to
> wytlumaczyc :( nawet, gdy klikne na przycisk odpowiadajacy za
> przejscie
> do nastepnego rekordu lub poprzedniego wyskakuje wtedy wyjatek.
> Procedura kasujaca wyglada tak:
>
> public void delete() //usun rekord
> {
> datas.Tables["capsch"].Rows[context[datas,
> "capsch"].Position].BeginEdit();
>
> datas.Tables["capsch"].Rows[context[datas,
[...]
> Nie mam pojecia jak wytlumaczyc to zjawisko, ale jest ono chore :/
[...]

Po pierwsze zły styl. Powinieneś założyć zmienną, odczytać do niej pola lub
cały wiersz i na tym działać. Nie wstukiwać dwa razy to samo albo korzystać
z Ctrl+C, Ctrl+V. Oprócz stylu to jest także rozwiązanie bardziej efektywne.
Sposób odwoływanie się dużych danych ma znaczenie.

Po drugie, pewnie naprawdę coś wykonuje na rekordzie zaznaczonym do
usunięcia, jak nie bezpośrednio to w zdarzeniu. Skorzystaj z debugera aby to
prześledzić.

-- 
Pozdrawiam,
Marek Janaszewski
[ j_m...@gazeta.pl ]
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