我有一个C#MVC应用程序,可以将数据添加到数据库中并且该部分可以正常运行。我有一个名为CRN
的主键。当我尝试插入包含已存在的CRN的行时,我按预期得到An exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll but was not handled in user code
。但是,程序在那里停止。我正在试图找出如何获得结果(如果失败或者如果成功则添加了一些行,则为-1)但是继续该程序并让我知道。我对此很新,但我想我需要使用try
和catch
(不确定如何)?
C#:
using (SqlConnection connect = new SqlConnection(connection))
{
int result = 0;
string insertQuery = "Insert Into Classes (OpenClosed, Section, CRN, CreditHours, PartTerm, Capacity, Enrolled, SeatsAvailable, WaitlistCapacity, WaitlistCount, WaitlistAvailability, Days, Campus, Method, Location, Time, StartDate, EndDate, Instructor) VALUES (@OpenClosed, @Section, @CRN, @CreditHours, @PartTerm, @Capacity, @Enrolled, @SeatsAvailable, @WaitlistCapacity, @WaitlistCount, @WaitlistAvailability, @Days, @Campus, @Method, @Location, @Time, @StartDate, @EndDate, @Instructor)";
SqlCommand command = new SqlCommand(insertQuery, connect);
command.Parameters.AddWithValue("OpenClosed", selectedClasses.OpenClosed);
command.Parameters.AddWithValue("Section", selectedClasses.Section);
command.Parameters.AddWithValue("CRN", selectedClasses.CRN);
command.Parameters.AddWithValue("CreditHours", selectedClasses.CreditHours);
command.Parameters.AddWithValue("PartTerm", selectedClasses.PartTerm);
command.Parameters.AddWithValue("Capacity", selectedClasses.Capacity);
command.Parameters.AddWithValue("Enrolled", selectedClasses.Enrolled);
command.Parameters.AddWithValue("SeatsAvailable", selectedClasses.SeatsAvailable);
command.Parameters.AddWithValue("WaitlistCapacity", selectedClasses.WaitlistCapacity);
command.Parameters.AddWithValue("WaitlistCount", selectedClasses.WaitlistCount);
command.Parameters.AddWithValue("WaitlistAvailability", selectedClasses.WaitlistAvailability);
command.Parameters.AddWithValue("Days", selectedClasses.Days);
command.Parameters.AddWithValue("Campus", selectedClasses.Campus);
command.Parameters.AddWithValue("Method", selectedClasses.Method);
command.Parameters.AddWithValue("Location", selectedClasses.Location);
command.Parameters.AddWithValue("Time", selectedClasses.Time);
command.Parameters.AddWithValue("StartDate", selectedClasses.StartDate);
command.Parameters.AddWithValue("EndDate", selectedClasses.EndDate);
command.Parameters.AddWithValue("Instructor", selectedClasses.Instructor);
connect.Open();
result = command.ExecuteNonQuery();
}
答案 0 :(得分:2)
你不应该使用try / catch。您不应该使用例外来处理工作流程。你知道CRN可能存在,所以这并不例外。
您应该更新您的SQL以处理CRN存在的情况。
SQL中有多种方法可以检查CRN是否存在。如果您只想检查并返回插入的行数,可以执行以下操作:
Insert Into Classes (OpenClosed
, Section
, CRN
, CreditHours
, PartTerm
, Capacity
, Enrolled
, SeatsAvailable
, WaitlistCapacity
, WaitlistCount
, WaitlistAvailability
, Days
, Campus
, Method
, Location
, Time
, StartDate
, EndDate
, Instructor)
SELECT @OpenClosed
, @Section
, @CRN
, @CreditHours
, @PartTerm
, @Capacity
, @Enrolled
, @SeatsAvailable
, @WaitlistCapacity
, @WaitlistCount
, @WaitlistAvailability
, @Days
, @Campus
, @Method
, @Location
, @Time
, @StartDate
, @EndDate
, @Instructor
WHERE @CRN NOT IN
(
SELECT CRN
FROM Classes
)
SELECT @@ROWCOUNT
这将返回插入的行数,可以使用ExecuteScalar直接读入int
。
答案 1 :(得分:0)
尝试捕捉是要走的路
using (SqlConnection connect = new SqlConnection(connection))
{
try
{
int result = 0;
string insertQuery = "Insert Into Classes (OpenClosed, Section, CRN, CreditHours, PartTerm, Capacity, Enrolled, SeatsAvailable, WaitlistCapacity, WaitlistCount, WaitlistAvailability, Days, Campus, Method, Location, Time, StartDate, EndDate, Instructor) VALUES (@OpenClosed, @Section, @CRN, @CreditHours, @PartTerm, @Capacity, @Enrolled, @SeatsAvailable, @WaitlistCapacity, @WaitlistCount, @WaitlistAvailability, @Days, @Campus, @Method, @Location, @Time, @StartDate, @EndDate, @Instructor)";
SqlCommand command = new SqlCommand(insertQuery, connect);
command.Parameters.AddWithValue("OpenClosed", selectedClasses.OpenClosed);
command.Parameters.AddWithValue("Section", selectedClasses.Section);
command.Parameters.AddWithValue("CRN", selectedClasses.CRN);
command.Parameters.AddWithValue("CreditHours", selectedClasses.CreditHours);
command.Parameters.AddWithValue("PartTerm", selectedClasses.PartTerm);
command.Parameters.AddWithValue("Capacity", selectedClasses.Capacity);
command.Parameters.AddWithValue("Enrolled", selectedClasses.Enrolled);
command.Parameters.AddWithValue("SeatsAvailable", selectedClasses.SeatsAvailable);
command.Parameters.AddWithValue("WaitlistCapacity", selectedClasses.WaitlistCapacity);
command.Parameters.AddWithValue("WaitlistCount", selectedClasses.WaitlistCount);
command.Parameters.AddWithValue("WaitlistAvailability", selectedClasses.WaitlistAvailability);
command.Parameters.AddWithValue("Days", selectedClasses.Days);
command.Parameters.AddWithValue("Campus", selectedClasses.Campus);
command.Parameters.AddWithValue("Method", selectedClasses.Method);
command.Parameters.AddWithValue("Location", selectedClasses.Location);
command.Parameters.AddWithValue("Time", selectedClasses.Time);
command.Parameters.AddWithValue("StartDate", selectedClasses.StartDate);
command.Parameters.AddWithValue("EndDate", selectedClasses.EndDate);
command.Parameters.AddWithValue("Instructor", selectedClasses.Instructor);
connect.Open();
result = command.ExecuteNonQuery();
}
catch (SqlException ex)
{
//TODO your code to handle exception here.
}
}
答案 2 :(得分:0)
你可以尝试这个我猜:
string insertQuery = "IF NOT EXISTS(SELECT TOP 1 1 FROM Classes WHERE CRN = @CRN)
Insert Into Classes (OpenClosed, Section, CRN, CreditHours, PartTerm, Capacity, Enrolled, SeatsAvailable, WaitlistCapacity, WaitlistCount, WaitlistAvailability, Days, Campus, Method, Location, Time, StartDate, EndDate, Instructor) VALUES (@OpenClosed, @Section, @CRN, @CreditHours, @PartTerm, @Capacity, @Enrolled, @SeatsAvailable, @WaitlistCapacity, @WaitlistCount, @WaitlistAvailability, @Days, @Campus, @Method, @Location, @Time, @StartDate, @EndDate, @Instructor)
SELECT SCOPE_IDENTITY()
ELSE SELECT -1 ";
如果失败则返回-1否则将返回新插入列的CSN值。
答案 3 :(得分:-1)
我不是C#家伙,但是在Open()
或ExecuteNonQuery()
的文档中,它会告诉您类似“如果失败则此函数会抛出异常XXX。”
无论哪个函数(或两者)抛出异常 - 您也可以从堆栈跟踪中推断出 - 应该包含在try / catch块中。
MSDN上有一个语法示例:https://msdn.microsoft.com/en-us/library/0yd65esw.aspx