我使用System.Data.Common.DbCommand将新行插入数据库。关键是,这一行已经存在。
try
{
[...]
DbCommand insertCommand = [...]
insertCommand.ExecuteScalar();
[...]
}
catch (System.Exception exception)
{
[...]
throw;
}
如果我将显式捕获System.Data.SqlClient.SqlException,我可以像下面一样评估ErrorNumber。
try
{
//insertion code
}
catch(SqlException ex)
{
if(ex.Number == 2627)
{
//Violation of primary key. Handle Exception
}
}
SqlException上下文中的ErrorNumber 2627意味着违反唯一键。见https://msdn.microsoft.com/en-us/library/ms151757%28v=sql.110%29.aspx
到目前为止一切顺利。因为我正在使用DbCommand,因此使用不同类型的关系数据库管理系统,我正在寻找一种更通用的方式来捕获这种违反唯一键约束的行为。
感谢您的帮助。
答案 0 :(得分:3)
我担心没有内置的通用解决方案。作为解决方法,您可以为Execute...
:
public static int ExecuteWithNiceExceptions(this IDbCommand cmd)
{
try
{
return cmd.ExecuteNonQuery();
}
catch(SqlException ex)
{
if (ex.Number == 2627)
{
throw new PrimaryKeyViolationException(cmd, ex);
}
else
{
throw;
}
}
catch (OleDbException ex)
{
...
}
...
}
这样,您可以将不同的,特定于实现的异常“转换”为通用的,有意义的异常。
答案 1 :(得分:0)
您应该允许数据库分配密钥或使用GUID作为密钥,因为数据库是围绕多用户同时访问而设计的,您的代码无法知道下一个密钥应该是什么,因此您需要让DB管理自己的密钥或使用保证唯一性的密钥。
然而,由于每个数据库实现都使用自己的一组错误代码,因此无法提供错误代码,无需知道您正在使用哪个提供程序,而不是请求ISO为他们创建错误代码的国际标准,我怀疑会起作用