尝试插入时如何处理SqlException(并且行已经存在)

时间:2015-04-17 20:41:04

标签: c# sql sql-server

我有一个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)但是继续该程序并让我知道。我对此很新,但我想我需要使用trycatch(不确定如何)?

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

        }

4 个答案:

答案 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