2013-10-09 2 views
0

Я возвращаю объект RunWorkerCompletedEventArgs, и я пытаюсь получить номер ошибки, который я могу видеть в объекте. Когда я использую if (err.Number!= 2627){} я получаю следующую ошибкуПолучить содержимое объекта RunWorkerCompletedEventArgs

«объект» не содержит определение для «Номера» и без расширения метода «Номера» принимающего первого аргумент «объекта» типа может быть найден (в вы не указали директиву или ссылку на сборку?)

Возможно, кто-нибудь посоветует, как я могу получить содержимое объектов (см. непосредственное окно ниже).

Также, пожалуйста, кто-нибудь может объяснить, что на самом деле происходит здесь, поскольку ошибка указывает, что объект не содержит определения для «Номер», но похоже, что он существует?

КОД:

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); 
     } 
    } 
} 

ПРИСВОЕНИЕ е:

private void GBHworker_DoWork(object sender, DoWorkEventArgs e) 
{ 

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

} 

открывшееся окно:

?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

Результат определяется как объект, поэтому вы не можете увидеть свойство Number на нем. Вам нужно бросить его первым. – Surfbutler

+0

Вам нужно отдать его типу, которому вы назначаете e. Вам необходимо опубликовать код, в котором вы указываете e. – Paparazzi

ответ

1

Как насчет литья e.Result - DbException?

var exp=e.Result as DbException; 

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

Result имеет тип Object

EDIT: - Если убрать попробовать/поймать в _DoWork, как @Habib предложил, а затем использовать следующий код, как он проиллюстрировал:

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

Вам не нужно свойство Result, чтобы получить сведения об исключении, вместо этого используйте свойство Error, и так как вы ожидаете SqlException, Error к SqlException, то вы можете проверить Number

if (e.Error != null) 
{ 
    var error = e.Error as SqlException; 
    if(eror != null && error.Number == 2627) 
    { 
     //duplicate key 
    } 
} 

В настоящее время вы получаете сообщение об ошибке, потому что e.Result имеет типа Object, вы должны привести его к определенному типу, чтобы получить доступ к его свойствам.

+0

Это не работает для меня здесь, поскольку 'e.Error' всегда возвращает null для меня? Правильно ли я назначаю e? (Я добавил код _DoWork) – user3357963

+0

@ooo, удалите обработку исключений из 'DoWork', если произойдет какое-либо исключение, оно будет доступно в' e.Error', также проверьте на e.Cancelled и e.Error перед доступом к e .Result. – Habib

Смежные вопросы