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
foMessage2);
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