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

时间:2015-02-05 05:43:49

标签: c# wpf

我已经为这样的数据表添加了唯一约束

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

有人可以告诉我如何处理这个例外吗?

2 个答案:

答案 0 :(得分:1)

由于您已在本地DataTable中定义约束,因此您尝试捕获错误类型的异常。 <{1}}而不是ConstraintException,而不是{{3}}。

立即修复将改变SqlException子句中的异常类型:

try

如果要在数据库中检查约束,那么您可以在其中定义约束而不是try { dtemp.Rows.Add(mTable.TableID,mTable.Capacity); } catch (ConstraintException ee) { // handle the exception here } 。在这种情况下,DataTable将被抛出,但仅在您将数据发送到数据库时,而不是在向SqlException添加行时。{/ p>

答案 1 :(得分:0)

这不是SQLException。将处理更改为更具体的异常。如果您无法解决此问题 - 请将其更改为常规例外。

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

我会避免在这种情况下使用异常。这真是一个糟糕的模式。打开所有异常时调试尤其痛苦。更好的做法是检查记录是否存在,然后添加,如果它没有。

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