我正在尝试创建一个这样的交易:
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,
options))
{
try
{
dbContext.MyTable.PartnerId = someGuid;
dbContext.SaveChanges();
scope.Complete();
dbContext.AcceptAllChanges()
}
catch (Exception ex)
{
log.LogMessageToFile("Exception - ExceptionType: " +
ex.GetType().ToString() + "Exception Messsage: " + ex.Message);
}
}
我知道如果我尝试在sql中手动插入一个带有特定列中的副本的项目,我从sql中得到以下错误:
无法在对象'dbo.MyTable'中插入具有唯一索引'idx_PartnerId_notnull'的重复键行。重复键值为(7b072640-ca81-4513-a425-02bb3394dfad)。
我如何以编程方式专门捕获此异常,以便我可以采取行动。
这是我对专栏的限制:
CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notnull
ON YourTable(yourcolumn)
WHERE yourcolumn IS NOT NULL;
答案 0 :(得分:6)
试试这个:
try {
}
catch (SqlException sqlEx) {
}
catch (Exception ex) {
}
在此异常中捕获服务器端发生的SQL错误和警告。 在这里阅读: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception(v=vs.110).aspx
上面的答案将允许您捕获SqlException,但如果您只想通知用户特定错误,则需要进一步优化'SqlException'catch块中的处理。 SqlException类具有“ErrorCode”属性,您可以从中导出服务器生成的实际错误。尝试做类似下面的事情:
try
{
}
catch (SqlException sqlEx)
{
if(sqlEx.ErrorCode == 2601)
{
handleDuplicateKeyException();
}
}
2601是SQL Server为您生成的特定错误的实际错误代码。有关完整列表,请运行SQL:
SELECT * FROM sys.messages
答案 1 :(得分:1)
使用SqlException的number属性。
对于重复错误,该数字为2601。
catch (SqlException e)
{
switch (e.Number)
{
case 2601:
// Do something.
break;
default:
throw;
}
}
错误代码列表
SELECT * FROM sysmessages
答案 2 :(得分:0)
你可以按类型捕捉它:
try
{
// ...
}
catch (SpecialException ex)
{
}
catch (Exception ex)
{
}
编辑:根据Ivan G的回答,你会得到一个SqlException
,它有一个可能具体的错误ErrorCode属性。因此,您必须检查此类错误的错误代码。
答案 3 :(得分:0)
你可以检查异常文本或它抛出时的其他参数,这样你就可以有条不紊地行事
喜欢:
catch(SqlException ex)
{
if(ex.Message.Contains("Cannot insert duplicate key row in object"))
{
}
}
或
之类的例外号码catch(SqlException ex)
{
switch (ex.Number)
{
case : someNumber:
{
//..do something
break...;
}
}
}