【发布时间】:2017-03-04 20:53:45
【问题描述】:
我有一个存储过程“Class_set”,当用户尝试将类添加到数据库时会触发它。存储过程检查数据库中是否存在任何冲突,如果不存在冲突,则将类插入数据库。
目前,如果存在冲突,它会引发 51000 错误,但我希望使用标签或面板在前端显示该错误以显示适当的消息。我尝试使用 try catch 但没有成功。
我的存储过程:
CREATE procedure dbo.Class_set (
@moduledata int
, @startdatedata datetime
, @enddatedata datetime
, @classtypedata int
, @roomcodedata int
, @starttimedata int
, @endtimedata int
, @recurrencedata int
, @daydata int
) as
begin;
set nocount, xact_abort on;
/* temp table */
select
DayId = @daydata
, ModuleId =@moduledata
, ClassTypeId = @classtypedata
, ClassScheduleStartTimeId = @starttimedata
, ClassScheduleEndTimeId = @endtimedata
, RoomCodeId = @roomcodedata
, StartTime= convert(datetime,c.Date) + s.StartTime
, EndTime = convert(datetime,c.Date) + e.EndTime
, RecurrenceId = @recurrencedata
into #temp_class
from Calendar c
cross apply (
select StartTime = convert(datetime,ClassTime)
from ClassSchedule
where ClassScheduleId = @starttimedata
) as s
cross apply (
select EndTime = convert(datetime,ClassTime)
from ClassSchedule
where ClassScheduleId = @endtimedata
) as e
where c.Date >= @startdatedata
and c.Date <= @enddatedata
and c.isWeekDay = 1
and ( @recurrencedata != 2
or (@recurrencedata = 2 and c.DayOfWeek = @daydata)
);
/* check for conflicts */
if exists(
select 1
from dbo.[Class] c
inner join #temp_class t
on c.RoomCodeId = t.RoomCodeId
and t.EndTime > c.StartTime
and c.EndTime > t.StartTime
)
begin;
throw 51000, 'Room conflict exists',1;
return -1;
end;
/* insert */
insert into dbo.[Class] (DayId, ModuleId, ClassTypeId
, ClassScheduleStartTimeId, ClassScheduleEndTimeId
, RoomCodeId, StartTime, EndTime, RecurrenceId )
select DayId, ModuleId, ClassTypeId
, ClassScheduleStartTimeId, ClassScheduleEndTimeId
, RoomCodeId, StartTime, EndTime, RecurrenceId
from #temp_class
end;
go
我调用存储过程的方法:
internal void insert_days( int daydata, int moduledata, int? recurrencedata, DateTime startdatedata, DateTime enddatedata, int classtypedata, int roomcodedata, int starttimedata, int endtimedata, string totalday)
{
{
string connectionString = WebConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
using (SqlConnection myConnection = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand("Class_set", myConnection))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@daydata", daydata);
cmd.Parameters.AddWithValue("@moduledata", moduledata);
cmd.Parameters.AddWithValue("@classtypedata", classtypedata);
cmd.Parameters.AddWithValue("@startdatedata", startdatedata);
cmd.Parameters.AddWithValue("@enddatedata", enddatedata);
cmd.Parameters.AddWithValue("@roomcodedata", roomcodedata);
cmd.Parameters.AddWithValue("@starttimedata", starttimedata);
cmd.Parameters.AddWithValue("@endtimedata", endtimedata);
cmd.Parameters.AddWithValue("@recurrencedata", recurrencedata);
myConnection.Open();
cmd.ExecuteNonQuery();
}
}
}
}
我对 try catch 的尝试:
internal void insert_days(int daydata, int moduledata, int? recurrencedata, DateTime startdatedata, DateTime enddatedata, int classtypedata, int roomcodedata, int starttimedata, int endtimedata, string totalday)
{
{
try
{
string connectionString = WebConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
SqlConnection myConnection = new SqlConnection(connectionString);
using (SqlCommand cmd = new SqlCommand("Class_set", myConnection))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@daydata", daydata);
cmd.Parameters.AddWithValue("@moduledata", moduledata);
cmd.Parameters.AddWithValue("@classtypedata", classtypedata);
cmd.Parameters.AddWithValue("@startdatedata", startdatedata);
cmd.Parameters.AddWithValue("@enddatedata", enddatedata);
cmd.Parameters.AddWithValue("@roomcodedata", roomcodedata);
cmd.Parameters.AddWithValue("@starttimedata", starttimedata);
cmd.Parameters.AddWithValue("@endtimedata", endtimedata);
cmd.Parameters.AddWithValue("@recurrencedata", recurrencedata);
myConnection.Open();
cmd.ExecuteNonQuery();
}
}
catch (SqlException ex)
{
switch (ex.Number)
{
case 51000:
Console.WriteLine("Error: Clashes exist with your current Room selection");
break;
default:
Console.WriteLine("Success: No clashes exist with your current Room selection");
}
}
}
}
【问题讨论】:
-
您是否尝试过显式运行存储过程(例如直接在 SSMS 中)以确保它抛出您期望的错误?这可以帮助排除问题出在存储过程中。
-
感谢您的评论。我没有这样做。我正在使用 Console.WriteLine,我什至不知道应该在哪里显示文本。理想情况下我想使用标签,但我不知道该怎么做
标签: c# sql-server stored-procedures try-catch