在C#中添加记录时如何处理数据表中的唯一约束异常

How to handle unique constraint exception in datatable while adding record in C#

我已经像这样向数据表添加了唯一约束

DataTable dtemp
private void TempTable() 
{
 dtemp = new DataTable("Temp");
 dtemp.Columns.Add(new DataColumn("Table", typeof(int)));
 dtemp.Columns.Add(new DataColumn("Capacity", typeof(int)));
 UniqueConstraint TableUnique = new UniqueConstraint(new DataColumn[] { dtemp.Columns["Table"] });
 dtemp.Constraints.Add(TableUnique);
}       

当我尝试添加相同的记录时,它没有去捕获块,而是突然退出程序并在 visual studio.

中给出唯一约束未处理的异常
private void GetTable()
    {
        try
        { 
            dtemp.Rows.Add(mTable.TableID,mTable.Capacity);
        }
        catch(SqlException ee)
        {
            if (ee.Number == 2627)
            {
                MessageBox.Show("Sorry, This Table Is Already Reserved!");
                if (Con.State == ConnectionState.Open) { Con.Close(); }
                return;
            }
            MessageBox.Show("Exception: " + ee.Message);
        } 

谁能告诉我如何处理这个异常?

这不是 SQLException。将您的处理更改为更具体地围绕异常。如果您无法解决 - 将其更改为常规异常。

private void GetTable()
    {
        try
        { 
            dtemp.Rows.Add(mTable.TableID,mTable.Capacity);
        }
        catch(Exception ee)
        {                
            MessageBox.Show("Exception: " + ee.Message);
        } 

我会避免在这种情况下使用异常。这确实是一个糟糕的模式。当您打开所有异常时,调试起来尤其痛苦。更好的做法是检查记录是否存在,如果不存在则添加。

将异常视为意外事件的边缘情况 - 而不是常规的编码实践。

由于您在本地 DataTable 中定义了约束,因此您正试图捕获错误类型的异常。抛出 SqlException 而不是 ConstraintException

立即解决方法是更改​​ try 子句中的异常类型:

try
{ 
    dtemp.Rows.Add(mTable.TableID,mTable.Capacity); 
} 
catch (ConstraintException ee) 
{
    // handle the exception here 
}

如果您想在数据库中检查您的约束,那就是您要定义它的地方,而不是在 DataTable 中。在这种情况下,SqlException 将被抛出,但只有当您将数据发送到数据库时,而不是当您向 DataTable.

添加行时