转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> Sql Server >> 正文
正确处理 SqlCeException 的方法         

正确处理 SqlCeException 的方法

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1273 更新时间:2007/11/14 13:13:23

  如果你从事过 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#

作者:黎波


[聊天工具]企业邮件系统的利器----FoxMail Server  [系统软件]OPEN SERVER 5.0.5安装EXP300阵列柜
[系统软件]关于Windows2000Server的灾难恢复  [常用软件][网络]下载服务革命性风暴Poco Server评测
[C语言系列]动态创建SQL Server数据库、表、存储过程等架构信…  [C语言系列]SQL Server到DB2连接服务器的实现
[C语言系列]SQL Server到SYBASE连接服务器的实现  [C语言系列]SQL Server到SQLBASE连接服务器的实现
[C语言系列]SQL Server连接VFP数据库的实现  [C语言系列]ASP+SQL Server之图象数据处理
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台