我将我的Asp.Net项目之一中的数据访问代码转换为MySQL中的MSSQL。我借此机会尝试删除对提供程序特定的类或名称空间的任何依赖关系。以提供者不可知的方式捕获sql异常
因此,我不是直接使用MySqlCommand或SqlCommand类,而是使用 DbProviderFactories.GetFactory()方法来返回DbCommand对象。
我遇到的一个问题是我的代码困住了MySqlExpection异常。我想要一个提供者不可知的方式来捕获Sql异常。这可能吗?
我将我的Asp.Net项目之一中的数据访问代码转换为MySQL中的MSSQL。我借此机会尝试删除对提供程序特定的类或名称空间的任何依赖关系。以提供者不可知的方式捕获sql异常
因此,我不是直接使用MySqlCommand或SqlCommand类,而是使用 DbProviderFactories.GetFactory()方法来返回DbCommand对象。
我遇到的一个问题是我的代码困住了MySqlExpection异常。我想要一个提供者不可知的方式来捕获Sql异常。这可能吗?
的Sql实现DBexception。我认为MSSQL也是。
你试过DBexception吗?
我没有MSSQL来测试。
如果对该主题不太了解,我的想法是异常是从提供对数据库的访问的具体类中抛出的。我可以猜想,一些例外可能是本质上共同的,但其他可能不是。我相信虽然记录特定的错误而不是抽象是一个好习惯。
检查this SO question和MSDN欲知更多信息。
我会推荐这样的东西。这样,您可以抛出一个通用的sql异常,也可以抛出与给定逻辑p.e.,ConnectionTimedOutException相关联的自定义异常。
catch(Exception ex)
{
if(DbProviderFactories.GetException(ex) is CustomSQLException)
{
//logic here
}
throw;
}
//Factory method
public Exception GetException(Exception ex)
{
Exception result;
//Identifying which is the current one
switch (CurrentProvider)
{
case Provider.SQLServer:
//logic here
result = new CustomSQLServerException(ex); //which extends CustomSQLException
break;
default:
result = ex;
break;
}
return result;
}
只是为了澄清,你捕捉到的异常是在数据层内还是在它之外? – jaimetotal
Sql实现DBexception。我认为MSSQL也是。你有没有试过DBexceptoin?我没有用于测试的MSSQL。 – Paparazzi
在数据访问层。 – Aheho