如果你从事过 PPC 上的 .NET Compact Framework 1.0 和 SQL Server CE 2.0 的开发,应该已经跟 SqlCeException 交过手了。本文将向初学者介绍如何正确地捕获和有效地处理 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 [代码3] 所示:
[代码3]

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

[代码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数据分析异常值 sql异常怎么解决_sql数据分析异常值

三、总结 。 

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