正确处理SqlCeException的方法

  如果你从事过 PPC 上的 .NET Compact Framework 1.0 和 SQL Server CE 2.0 的开发,应该已经跟 SqlCeException 交过手了。本文将向初学者介绍如何正确地捕获和有效地处理 SqlCeException。

一、捕获SqlCeException
  在 .NET Compact Framework 1.0 中,SqlCeException 是一个需要特殊处理的异常类,如果你不对它进行单独的捕获,获取到的异常信息将是"SqlCeException"或者空字符串,而不是你想要获取到的真实异常信息。接下来我给大家分析几段代码:
[代码1]

try
{
    
//  创建一个数据库连接,连接字符串中的数据库是不存在的
    SqlCeConnection conn  =   new  SqlCeConnection( " Data Source=nonExistSource.sdf; " );

    
//  打开数据库连接,将抛出一个 SqlCeException
    conn.Open();
}
catch  (Exception ex)
{
    
//  获取到的异常信息是空白字符串
    MessageBox.Show(ex.Message);
}

  [代码1]的异常处理代码捕获到的是一个 SqlCeException 的异常实例,在 catch 块中没有对该实例进行类型转换,直接就获取它的 Message 值,得到的错误信息将是空白字符串,并非原始的异常信息。再看看[代码2]
[代码2]

try
{
    
//  创建一个数据库连接,连接字符串中的数据库是不存在的
    SqlCeConnection conn  =   new  SqlCeConnection( " Data Source=nonExistSource.sdf; " );

    
//  打开数据库连接,将抛出一个 SqlCeException
    conn.Open();
}
catch  (SqlCeException ssex)
{
    
//  获取到的异常信息如下:
    
//  "The database file cannot be found. Check the path to the database. [,,,File name,,]"
    MessageBox.Show(ssex.Message);
}
catch  (Exception ex)
{
    
//  获取其他异常信息
    MessageBox.Show(ex.Message);
}


  在[代码2]中,我们对 SqlCeException 单独捕获,最后获取到了原始的错误信息"The database file cannot be found. Check the path to the database. [,,,File name,,]"。

二、处理SqlCeException
  如果你有一个对异常进行统一处理的类和方法,如:ExceptionManager.Publish(Exception exception)。根据我上面的分析,你不得不在 Pulibsh 方法中对 SqlCeException 进行类型转化。如[代码3] 所示:
[代码3]

StringBuilder sb  =   new  StringBuilder();
sb.Append(
" Message:  " );
if  (exception  is  SqlCeException)
{
    sb.Append(((SqlCeException)exception).Message);
}
else
{
    sb.Append(exception.Message);
}

  从 SqlCeException.Message 属性获取到的错误信息往往是不够详细的,因为这些信息是在 SQL Server CE 2.0 中预先定义好的。我们希望获取到更加详细的错误信息,能够指导我们迅速找到出错代码的具体位置。比如在[代码2]中,我们想要知道找不到的数据库文件名称是什么。其实除了 Message 属性外,从 SqlCeException 中还可以获取到更多的错误信息,请看[代码4]
[代码4]

///   <summary>
///  产生一个详细错误消息的 SqlCeException 异常处理程序。
///   </summary>
///   <param name="exception"> SqlCeException 异常对象。 </param>
public   static   void  ShowErrors(SqlCeException exception) 
{
    
//  获取包含一个或多个 SqlCeError 对象的集合,这些对象包含有关
    
//  SQL Server CE .NET Framework 精简版数据提供程序产生的异常的详细信息。
    SqlCeErrorCollection errs  =  exception.Errors;

    
//  获取导致当前异常的 Exception 实例。
    Exception inner  =  exception.InnerException;
    
if  ( null   !=  inner) 
    {
        
//  显示内部异常信息。
        MessageBox.Show( " Inner Exception:  "   +  inner.ToString());
    }

    StringBuilder sb 
=   new  StringBuilder();

    
//  用消息框显示每个错误的详细信息
     foreach  (SqlCeError err  in  errs) 
    {
        
//  标识错误类型的 HRESULT 值,这些错误不是 SQL Server CE 固有的。
        sb.Append( " Error Code:  " ).Append(err.HResult.ToString( " X " ));

        
//  对错误进行描述的文本。
        sb.Append( " \nMessage   :  " ).Append(err.Message);

        
//  获取 SqlCeError 的本机错误号。
        sb.Append( " \nMinor Err.:  " ).Append(err.NativeError);

        
//  生成错误的提供程序的名称。
        sb.Append( " \nSource    :  " ).Append(err.Source);

        
//  遍历前三个错误参数。SQL Server CE 使用错误参数来提供有关错误的其他详细信息。
         foreach  ( int  numPara  in  err.NumericErrorParameters) 
        {
            
//  虽然错误可能存在参数,但并非发生的所有错误都返回参数。
            
//  如果发生某个错误时没有返回任何参数,则该数组的值为 0。
             if  ( numPara != 0)
            {
                sb.Append(
" \nNum. Par. :  " ).Append(numPara);
            }
        }

        
//  遍历最后三个错误参数。SQL Server CE 使用错误参数来提供有关错误的其他详细信息。
         foreach  ( string  errPara  in  err.ErrorParameters) 
        {
            
//  虽然错误可能存在参数,但并非发生的所有错误都返回参数。
            
//  如果发生某个错误时没有返回任何参数,则该数组的值将为空字符串。
             if  (errPara  !=  String.Empty)
            {
                sb.Append(
" \nErr. Par. :  " ).Append(errPara);
            }
        }

        MessageBox.Show(sb.ToString());
        sb.Remove(
0 , sb.Length);
    }
}

  我们可以使用[代码4]中的 ShowErrors 方法来处理[代码2]中的 SqlCeException 异常。
[代码5]
try
{
    
//  创建一个数据库连接,连接字符串中的数据库是不存在的
    SqlCeConnection conn  =   new  SqlCeConnection( " Data Source=nonExistSource.sdf; " );

    
//  打开数据库连接,将抛出一个 SqlCeException
    conn.Open();
}
catch  (SqlCeException ssex)
{
    
//  获取详尽的异常信息
    ShowErrors(ssex);
}
catch  (Exception ex)
{
    
//  获取其他异常信息
    MessageBox.Show(ex.Message);
}

 

 

异常信息的内容如下图所示:

三、总结
  本文介绍的内容是我这段时间在项目开发中总结的经验,希望对刚刚接触 SQL Server CE 开发的人在处理 SqlCeException 上有帮助。 

  示例代码

[参考]
SQL Server CE 2.0 Books Online: Error Handling in C#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值