获取RunWorkerCompletedEventArgs对象的内容

时间:2013-10-09 13:06:30

标签: c# wpf

我正在返回一个RunWorkerCompletedEventArgs对象,我正在尝试获取可以在对象中看到的错误号。当我使用if (err.Number!= 2627){}时,我收到以下错误

  

'object'不包含'Number'的定义,也没有扩展名   方法'Number'接受'object'类型的第一个参数可能是   发现(您是否缺少using指令或程序集引用?)

请有人可以告诉我如何获取对象内容(请参阅下面的即时窗口)。

另外请有人解释一下这里发生了什么,因为错误表明该对象不包含“Number”的定义,但它看起来确实存在?

CODE:

private void GBHworker_RunWorkerCompleted(object sender, 
             RunWorkerCompletedEventArgs e)
{
    //update UI once worker complete his work 
    if (e.Result != null)
    {
        var err = e.Result;
        if (err.Number!= 2627) //don't want to raise error on duplicate primary key
        {
            MessageBoxButton btn = MessageBoxButton.OK;
            var result = ModernDialog.ShowMessage(e.Result.ToString(), 
                         "Error", btn);
        }
    }
}

分配e:

private void GBHworker_DoWork(object sender, DoWorkEventArgs e)
{

  //....DB parameter setup
  try
  {
    cmd_insert.ExecuteNonQuery();
  }
  catch (Exception crap)
  {
    if (e != null)
      e.Result = crap;
  }

 }

IMMEDIATE WINDOW:

?err
{"Violation of PRIMARY KEY constraint 'PK_XYZ'. Cannot insert duplicate key in object 'dbo.XYZ. The duplicate key value is (30527293868).\r\nThe statement has been terminated."}
    base {System.Data.Common.DbException}: {"Violation of PRIMARY KEY constraint 'PK_XYZ'. Cannot insert duplicate key in object 'dbo.XYZ'. The duplicate key value is (30527293868).\r\nThe statement has been terminated."}
    Class: 14
    ClientConnectionId: {*******}
    Errors: {System.Data.SqlClient.SqlErrorCollection}
    LineNumber: 1
    Number: 2627
    Procedure: ""
    Server: "*******"
    Source: ".Net SqlClient Data Provider"
    State: 1

2 个答案:

答案 0 :(得分:2)

您不需要Result属性来获取异常详细信息,而是使用Error属性,因为您需要SqlException,请将Error强制转换为{{1}然后你可以查看SqlException

Number

目前您收到错误是因为if (e.Error != null) { var error = e.Error as SqlException; if(eror != null && error.Number == 2627) { //duplicate key } } 的类型为e.Result,您必须将其转换为特定类型才能访问其属性。

答案 1 :(得分:1)

如何将e.Result投射到DbException

var exp=e.Result as DbException;

if(exp!=null){
    //NOW USE IT: exp.Number;
}

Result的类型为Object

编辑: - 如果您按照@Habib的建议删除_DoWork中的 try / catch ,请使用以下代码,如图所示:

var err=e.Error as SqlException;
if(err!=null && err.Number ==2627)
{
    //....
}