无法处理与CHECK contriant相关的sql异常

时间:2014-04-03 18:49:50

标签: c# sql .net sql-server ado.net

我正在使用C#win表单和MSSQL服务器编写桌面应用程序。在我的数据库中,我有一个这样的表:

create table material(
id int identity(700,3),
materialName nvarchar(100) not null default (0),
unitPrice decimal(19,2) not null default (0),
carbohydrate tinyint not null default (0),
protein tinyint not null default (0),
fat tinyint not null default (0),
humidity tinyint not null default (0) ,
minerals tinyint not null default (0),
constraint PK_id_materialPriceAndStandard primary key (id),
constraint UQ_materialName_materialPriceAndStandard unique (materialName), 
constraint CHECK_totlaMineralAmount check 
(carbohydrate + protein + fat + humidity + minerals =100 )) 

材料表中5个字段的总量不得超过100.

在C#中,当用户输入超过100的数量时,会收到此异常:

An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll
Additional information: The INSERT statement conflicted with the CHECK constraint         
"CHECK_totalMineralAmount_materialPrice".
The conflict occurred in database "secaloFormula", table "dbo.materialPrice"

这是连接数据库并调用存储过程的代码:

public void addMaterial()
    {
        string ConString = ConfigurationManager.ConnectionStrings["secaloFormulaCS"].ToString(); 
        using(SqlConnection sqlCon = new SqlConnection(ConString))
        using(SqlCommand sqlCmd = new SqlCommand("spAddMaterial",sqlCon))
        {
            sqlCmd.CommandType = CommandType.StoredProcedure;
            sqlCmd.Parameters.AddWithValue("materialName", MaterialName); 
            sqlCmd.Parameters.AddWithValue("unitPrice",Price);
            sqlCmd.Parameters.AddWithValue("carbohydrate",Carbohydrtate);
            sqlCmd.Parameters.AddWithValue("proterin", Proterin); 
            sqlCmd.Parameters.AddWithValue("fat",Fat); 
            sqlCmd.Parameters.AddWithValue("humidity", Humadity); 
            sqlCmd.Parameters.AddWithValue("minerals",Minerlas);
            sqlCon.Open();
            sqlCmd.ExecuteNonQuery();
            sqlCon.Close();
            sqlCon.Dispose(); 
        }
    }

如何处理此异常,在插入数量超过100时提醒用户?

2 个答案:

答案 0 :(得分:1)

我建议检查业务逻辑中的约束,而不是依赖数据库来拒绝任何无效的消息。如果您在使用业务规则约束时死机,可以尝试/捕获ExecuteNonQuery并返回抛出的异常。

答案 1 :(得分:1)

try 
{
   sqlCmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
   // the error should be in the Ex
}

SqlException Class

请参阅链接 该错误可能是ex.Errors。

通过使用我不认为你需要处理,但我怀疑它会伤害任何东西