[ roberto555 @ 06.09.2006. 22:00 ] @
pozdrav, zna li netko kako da saznam koja greška se dogodila!'? eto na što mislim, imam apl.u C# i radi sa sqlbazom (VS 2005 Pro,i sql server expr.2005),u bazi imam dosta tablica koje su povezane, i sad kad se upisuje u tablicu A u neka polja se može upisati samo podatak koji postoji u tablici A-a, (glavni ključ tablice A-a je strani ključ tablici A,ref.int.je uklj.!),ovo je ok ako je samo jedna onda mi

try
{
..neki kod...
}
catch(system.data.sqlclient.sqlexception)
{
...
}

hvata tu gresku te u dijelu catch mogu reci sto je,bez da me zanima vise o grešci, no ja ih imam više pa bi mi bilo puno bolje da znam o čemu se radi da mogu reči točno koja je greška u pitanju,
pa stavim

try
{
..neki kod...
}
catch(system.data.sqlclient.sqlexception exc)
{
...
}
i sad nisam uspio pronaci da se (exc.--messages,..---) razlikuje po bilo cem osim po message,i jos nekim takvim koji mi i nisu od koristi errornumber je uvijek isti,,,dakle treba mi nešto što bih tu mogao iskoristiti da znam o kojoj je grešci riječ,!?!?
kako da to napravim??

-------------------------------------------
-jos jedno popratno pitanjce:

-u vb-u ima jedna naredba end sub kako se to radi u c#?

recimo:

if neki uvjet then
....
else
...
end sub
end if
.
.
.dalje kod...


hvala!
[ dusty @ 07.09.2006. 09:38 ] @
Tja, mozes da nakacis vise catch blokova i da svaki hvata drugi tip exception-a.
catch(SqlException){...}catch(Exception){....}
[ aleksandarpopov @ 07.09.2006. 10:00 ] @
End sub -> mozes da stavis jednostavno return;
Hvatanje greske - mozda ovako nesto: (- ovo je kod iz knjige C# baze podataka od pocetka u izdanju Wrox-a)
Code:

/*
 * Created by SharpDevelop.
 * User: developer
 * Date: 23.6.2006
 * Time: 23:06
 */
 using System;
 using System.Data;
 try
 {
     //neke komande za rad sa bazom podataka
 }
catch (System.Data.SqlClient.SqlException e2)
{
    string strExx="";
    for (int i=0;i< e2.Errors.Count;i++)
    {
        strExx= strEx + "\n" + "Index#" + i + "\n" +
          "Exception :" + e2.Errors[i].ToString() + "\n" + "Number : " +
          e2.Errors[i].Number.Tostring() + "\n";
     }
     MessageBox.Show(strExx,"Database Exception");

}
catch (System.Exception e3)
{
  strEx="";
  strEx="Source : " + e3.Source;
    strEx= strEx + "\n" + "Error Message : " + e3.Message;
    MesageBox.Show(strEx,"ADO.NET Exception");
}
finally
{
    if(cn.State == ConnectionState.Open)
    {
        cn.Close();
    }
}


Pozdrav
[ dusty @ 07.09.2006. 10:16 ] @
End sub je u VB-u isto sto i zatvarnje metode sa } u shrapu
Da nisi mislio na exit sub ?
[ roberto555 @ 07.09.2006. 14:41 ] @
joj da ,exit sub je u VB, to sam mislio krivo sam se izrazio, znaci return u c#,
probat cu ovo s greškom ovako, mislio sam da možda ima koji bolji način, ovo da ubacim vise catch,, je ok,al ovaj tip greske hvata koliko sam uspio skuziti samo slqexception, ili da ne stavim nista u catch(..),,,a buduci da ako ne stavim sqlexception nece ni uloviti gresku raspast ce se program,tako da nemogu nabac vise njih, bilo bi ok da ih stavim vise al kad bi jedna greska bila recimo ovakva pa bi stavio sqlexc. pa da recimo djeljenje s nulom, itd...al ovdje nemogu tako,
probat cu ovo vise!,hvala!
[ dusty @ 07.09.2006. 15:23 ] @
Prvo hvataj exception-e koje zelis posebno da hendlujes, a sve ostale hvataj kao obican tip Exception. Npr.:
Code:

catch(SqlException se){
Debug.WriteLine("Zajebata greska ! " + se.Message)
... neko specificno hendlovanje ....
}
catch(COMException ce){
Debug.WriteLine("Zajebata greska ! " + ce.Message)
... neko specificno hendlovanje ....
}
catch(Exception err){
Debug.WriteLine(err.Message);
//Generalno hendlovnje ostalih gresaka
MessageBox.Show(this, err.Message);
}
[ roberto555 @ 07.09.2006. 17:33 ] @
pa mislim da kuzim (al samo mislim :) ) sto mi zelis reci no ne kuzim,što da radim pod "...neko spec. hendl...."??---mozes to ukratko pojasniti?
[ dusty @ 08.09.2006. 00:41 ] @
Hmmmpfh, izgleda da se skroz ne razumemo

Uglavnom, ono sto sam govorio je da ako napravis jedan try blok, u koji strpas sve i svasta (konverzije jednog tipa u drugi, pristupanje bazi, drndanje sa COM objektima ... ), mozes sa vise catch blokova da hvatas odredjene greske (od konverzije, od baze, od com-a...).

Ako si mislio iz SQL-a da bacas greske, mozes koristiti raiserror. Razjasni malo sta si mislio.

[ roberto555 @ 08.09.2006. 11:26 ] @
ne znam kako ti mene al ja tebe ne razumijem -)

vidi na primjeru:::>

try
{
//ovdje radim recimo dodavanje novog zapisa u bazu
sqlcommand cmd=new sqlcommand("dodajuTablicuA",sqlconnection1);/*dodajutablicA je ime stored proc. u kojoj se vrsi insert*/
cmd.command type=command type.stored proc.;
cmd.parameters.add(....dodajm sve parametre koji su potrebni);
.
.
sqlconnection1.open();
cmd.excutenonquery();
sqlconnection1.close();
}
catch( system.sqlclient.sqlexception ex)
{

// tu mi treba sad da znam sto je izazvalo gresku,(citaj dole nize)

}

----> ovo u Tablicu A dodaje novi zapis a Tablica A ima recimo:
Ime --- Prezime --- sfulice --- brojposte

te se taj sfulice i broj poste povlace iz Tablica_ulice i Tablica_poste
Tablica_ulice ima: sfulice---nazivulice
tablica_poste ima: brojposte --- nazivposte

i sad ako se na neki nacin dogodi da u tablicu A zelim uspisati sifru ulice ili broj poste koji u tablica_ulice i tablica_poste ne postoji, dode do greske, i sqlexception ulovi tu gresku, al onda to moze biti da je gresku prouzrocilo to da se zeljela upisati sifra ulice koje u tablica_ulice nema ili broj_poste koji nema u tablica_poste,,,kuzis? i sad bi mi trebalo da mogu uloviti gresku svejedno mi je kako, al da onda mogu znati dal je do nje doslo jer je upisivana recima sifra_ulice koja ne postoji ili broj poste koji ne postoji,,,,kuzis sto zelim??

ako stavim ex.message iz tog bi mogao dobiti jer ovdje pise veza koja neda da se to upise,no tad je to "drz vodu dok majstori ne odu",a gledao sam ex.number je isti bez obzira zelim li broj poste koji nema ili sifru ulice koje nema,!
!!thx!!
[ dusty @ 08.09.2006. 12:20 ] @
Ok, kontam te
Kao sto sam rekao treba ti raiserror. U toj storci koja radi update/insert hvataj gde proces pukne i sam baci gresku.

Generalizovano:

Code:


begin trans
declare @errMessage varchar(100)

insert into Tabela_A .... bla-bla-truc-truc

if @@error != 0
begin
set @errMessage = 'Greska kod upisa u tabelu A'
goto errorHandler
end

insert into Tabela_B .... bla-bla-truc-truc

if @@error != 0
begin
set @errMessage = 'Greska kod upisa u tabelu B'
goto errorHandler
end

commit trans
return 

errorHandler:
rollback trans
raiserror(@errMessage, 16 ,1)


U C# hvatas SqlException, a Message property ce imati vrednost @errMessage kada je pukla storka. Za konkretno tvoj problem morao bih videti tu storku za upis.
[ roberto555 @ 08.09.2006. 13:04 ] @
nije problem,ja cu to lako na svoj primjeniti samo da skuzim kako,e koliko vidim meni tocno to treba,u stored proceduri cu znaci napisati ono sto ce biti exc.message.i to ispisati, ovisi gdje dode do greske poruka ce biti drugacija, probat cu ovo,,,, nadam se da bude radilo, tocno to bi mi trebalo, ko da si znao :))))
hvala, ak nebudem uspel uspostaviti ovo -> javim se ;)

daj mi jos samo napisi:
raiserror(@errMessage, 16 ,1) ->16,1?? cemu sluze te brojke?
[ dusty @ 08.09.2006. 13:33 ] @
One pokazuju koliko je greska ozbiljna/fatalna, da li treba da se obustavi izvrsavanje, da li da se prekine konekcija itd. Imas lepo objasnjeno u SQL books online.
[ roberto555 @ 08.09.2006. 16:01 ] @
jos nemam tu dokumentaciju jer mi je ovdje previse 125MB za skidati sa dial-up om,, al ovih dana cu nabaviti, i uspio sam napraviti sa ovim kako si mi rekao, i radi odlicno, to je to,
pozdrav!
[ dusty @ 08.09.2006. 18:21 ] @
Ona dolazi sa instalacijom MS Sql servera, da se nepotrebno ne maltertiras sa skidanjem