Eksperci miesiąca

1
grzegorz.tworek
Senior
miesiąc
31
łącznie
812
2
Bulax
Senior
miesiąc
21
łącznie
589
3
styrni
Top10
miesiąc
20
łącznie
4100
4
coltuszyk
Junior
miesiąc
19
łącznie
208
5
burzak
Guru
miesiąc
19
łącznie
1077

Z blogów MVP

Microsoft w Polsce

Statystyka

  • W tej chwili mamy:
    120 czytelników online
    58 603 zarejestrowanych
  • Do dziś zanotowaliśmy:
    45 991 172 odsłon
    18 378 odsłon / 24h
Microsoft Most Valuable Professional

Forum - Wątek

Idź do grupy:
Widok:
Autor

Wątek


max24
Gość

wypowiedzi: 62
od: 2010-01-20
c# przechwycenie wyjątku procedury 2010-02-07 (N) 15:00

W bazie SQL Server mam tabelkę

CREATE TABLE dbo.tabela(
id int IDENTITY NOT NULL,
pole int NOT NULL);

ALTER TABLE dbo.tabela ADD CONSTRAINT myPK PRIMARY KEY (id)
ALTER TABLE dbo.tabela ADD CONSTRAINT myUQ_1 UNIQUE (pole);

Tabelka będzie zasilana z różnych aplikacji, jej zasilanie chciałbym zrobić przez wywołanie procedury której fragment znajduje się poniżej,

alter procedure dbo.spadd2 @a int
as
begin try
begin tran
if (@a = 1)
begin
select 0 as r
end
else if (@a = 2)
begin
insert into dbo.tabela (pole) values (@a)
end       
else
begin
RAISERROR (15000, 16, 1);
end       
commit tran
end try
begin catch
rollback tran
select ERROR_NUMBER() ErrorNumber, ERROR_MESSAGE() [Message]
end catch
go

jednak mam problem.
Jeśli procedurę wywołuje z konsoli sqlserver przy drugim wywołaniu exec dbo.spadd2 @a = 2, zwraca mi wyjątek
2627    Violation of UNIQUE KEY constraint 'myUQ_1'. Cannot insert duplicate key in object 'dbo.tabela'
co jest ok

Jeśli wywołanie procedury robie z poziomu aplikacji w c#

private void button2_Click(object sender, EventArgs e)
{
SqlConnectionStringBuilder cs = new SqlConnectionStringBuilder();
cs.DataSource = ".\\SQLEXPRESS";
cs.InitialCatalog = "baza";
cs.IntegratedSecurity = true;
cs.UserInstance = false;
cs.ConnectTimeout = 30;
string connectionString = cs.ToString();
SqlConnection conn = new SqlConnection(connectionString);
conn.InfoMessage += new SqlInfoMessageEventHandler(conn_In

foMes
sage2
)
;
conn.FireInfoMessageEventOnUserErrors = true;
conn.Open();

try
{
SqlCommand comm = new SqlCommand("dbo.spadd2", conn);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add(new SqlParameter("@a", Int32.Parse(textBox1.Text)));
comm.ExecuteNonQuery();

}
catch (SqlException exsql)
{
MessageBox.Show("Exception thrown: " + exsql.Message);
}
catch (Exception ex)
{
MessageBox.Show("Exception thrown: " + ex.Message);
}

conn.Close();
}

static void conn_InfoMessage2(object sender, SqlInfoMessageEventArgs e)
{
MessageBox.Show("InfoMessage Handled Error Level-" + e.Errors[0].Class.ToString() + ":" + e.Message);

}

Nic się nie dzieje, nie dodaje rekordu i nie zwraca wyjątku, co robię nie tak ?

mAx

Zaloguj się, żeby odpowiedzieć