2016-02-11 3 views
0

Я создаю функцию createFolding в моем классе с именем clsFolding. Я вставляю некоторые значения в базу данных с помощью этой функции createFolding. поэтому я возвращаю int status_id из функции назад (1, если Ok, 0, если ошибка). Я также хочу вернуть сообщение исключения из функции, если есть ошибка (если status_id =0), но я не знаю, как вернуть несколько значений из моей функции. Вот мой код, который я сделал в моем классе clsFoldingКак вернуть исключение из функции в классе

public class clsFolding 
    { 
     public static string ConStr = ConfigurationManager.ConnectionStrings["FazalConstructions.Properties.Settings.ConnString"].ConnectionString; 
     public static SqlConnection con; 
     public static SqlCommand cmd = new SqlCommand(); 
     public static int status_id; 
     public static Exception ex; 

     public static int createFolding(int id, string name, int qty, string narration, DateTime dt) 
     { 
      try 
      { 
       con = new SqlConnection(ConStr); 
       con.Open(); 
       cmd = new SqlCommand("INSERT INTO tblFolding(FoldingID, Name,Quantity,Narration,DateTime)VALUES(@id, @name, @qty, @narration,@dt)", con); 

       cmd.Parameters.AddWithValue("@id", id); 
       cmd.Parameters.AddWithValue("@name", name); 
       cmd.Parameters.AddWithValue("@qty", qty); 
       cmd.Parameters.AddWithValue("@narration", narration); 
       cmd.Parameters.AddWithValue("@dt", dt); 
       cmd.ExecuteNonQuery(); 

       status_id = 1; 
       return status_id; 
      } 
      catch (Exception ex) 
      { 
       status_id = 0; 
       return status_id; 
      } 

вот мой код, который я использовал в своей форме, чтобы получить данные из класса

clsStockManagement.updateStock(int.Parse(TransactionID.Text), int.Parse(projectID.Text), int.Parse(cbItem.SelectedValue.ToString()), int.Parse(tbQty.Text), DateTimee.Value); 
      if (clsStockManagement.status_id==1) 
      { 
       MessageBox.Show("Process Successful", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); 


      } 
      else if (clsStockManagement.status_id==0) 
      { 
       MessageBox.Show("Process UnSuccessful", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
+2

не возвращают исключения, бросить их – Backs

+0

Один популярный подход к этому является один принятый Microsoft для чисел синтаксического анализа. например, int.TryParse (текст, номер) – lzcd

+0

Я не хочу бросать исключение, так как я хочу, чтобы ящик сообщения отображал сообщение об ошибке –

ответ

1

Я думаю, вы пропустили точку исключений. Вы редко ловите их, где их бросают. Исключением является то, что они могут пузыриться. Совершено Право, ваш createFolding() метод не нужен любой обработка исключений или коды возврата. Это упрощает к этому:

public class clsFolding 
{ 
    //no need for this to be public 
    private static string ConStr = ConfigurationManager.ConnectionStrings["FazalConstructions.Properties.Settings.ConnString"].ConnectionString; 

    public static void createFolding(int id, string name, int qty, string narration, DateTime dt) 
    { 
     string sql = "INSERT INTO tblFolding(FoldingID, Name,Quantity,Narration,DateTime)VALUES(@id, @name, @qty, @narration,@dt)"; 

     //fyi: a static SqlConnection reference is a VERY BAD IDEA 
     // use a new variable in each method call 
     using(var con = new SqlConnection(ConStr)) 
     using(var cmd = new SqlCommand(sql, con)) 
     { 
      cmd.Parameters.AddWithValue("@id", id); 
      cmd.Parameters.AddWithValue("@name", name); 
      cmd.Parameters.AddWithValue("@qty", qty); 
      cmd.Parameters.AddWithValue("@narration", narration); 
      cmd.Parameters.AddWithValue("@dt", dt); 

      con.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
} 

I'd also do something about those AddWithValue() calls.

Теперь вы хотите, чтобы показать MessageBox, если это не удается. Хорошо. Сделай это. Это звучит неплохо.Просто сделать это в коде, который вызывает этот метод:

try 
{ 
    clsFolding.createFolding(/* parameters here */); 
    MessageBox.Show("Process Successful", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); 
} 
catch (SqlException) 
{ 
    MessageBox.Show("Process UnSuccessful, could not write to database", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 
catch (Exception Ex) 
{ 
    MessageBox.Show("Process UnSuccessful, a non-database error occured", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 
3

Создания модели (в основном класса со свойством), который должен иметь целое и исключительное свойство.

public class MyResult{ 
    public int Status {get; set;} 
    public Exception Exception {get; set;} 
} 

Теперь вы можете вернуть этот класс от вашей функции, как это,

public static MyResult createFolding(int id, string name, int qty, string narration, DateTime dt) 
{ 
    var result = new MyResult(); 
    try 
    { 
     // your code 
     result.Status = 1; 
    } 
    catch(Exception e){ 
     result.Status = 0; 
     result.Exception = e; 
    } 
    return result; 
} 

Так вы ждете MyResult от функции createFolding.

В вашем коде, где мы называем это функция должна быть такой,

var result = clsFoldingObj.createFolding(1,'abhi',1,'empty', new Date()); 
if(result.Status == 0){ 
    // result has an exception 
    MessageBox.Show("Process Unsuccessful - "result.Exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 
else{ 
    // Success 
    MessageBox.Show("Process Successful", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); 
} 
+0

Хотя это будет работать, это не очень хорошее решение реальной проблемы OP. –

+0

не могли бы вы рассказать мне, как я могу получить это исключение в моей форме как сообщение об ошибке. Я получаю ошибку, что ссылка на объект не установлена ​​в экземпляр объекта. –

+0

@WaqasAli, см. Обновленный ответ. Пожалуйста, не стесняйтесь задавать любые сомнения по этому поводу. –

0

Вы можете вернуть структурированную информацию, Вы можете изменить некоторые параметры и так далее. Но предпочтительнее вы должны поймать исключение на том месте, где вы сможете его обработать.

try 
{ 
    clsStockManagement.updateStock(
     int.Parse(TransactionID.Text), 
     int.Parse(projectID.Text), 
     int.Parse(cbItem.SelectedValue.ToString()), 
     int.Parse(tbQty.Text), 
     DateTimee.Value); 

    MessageBox.Show("Process Successful", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Process UnSuccessful, error:" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 
0

Как уже упоминалось выше, лучше всего использовать исключения, а не возвращать их. Чтобы сделать это, измените улов часть вас образец на следующее:

catch (Exception ex) 
     { 
      // You can log the exception here if you need to. 
      throw; 
     } 

Но: чтобы ответить на ваш вопрос о том, как вернуть несколько значений, создать новый класс, экземпляр его со значениями результата и вернуть это.

Класс будет иметь 2 свойства:

public class TClass 
{ 
    public int Result { get;set;} 
    public Exception Error { get;set;} 
} 

Ваш пример кода будет выглядеть следующим образом:

public static int createFolding(int id, string name, int qty, string narration, DateTime dt) 
    { 
     try 
     { 
      con = new SqlConnection(ConStr); 
      con.Open(); 
      cmd = new SqlCommand("INSERT INTO tblFolding(FoldingID, Name,Quantity,Narration,DateTime)VALUES(@id, @name, @qty, @narration,@dt)", con); 

      cmd.Parameters.AddWithValue("@id", id); 
      cmd.Parameters.AddWithValue("@name", name); 
      cmd.Parameters.AddWithValue("@qty", qty); 
      cmd.Parameters.AddWithValue("@narration", narration); 
      cmd.Parameters.AddWithValue("@dt", dt); 
      cmd.ExecuteNonQuery(); 

      return new TClass { Result = 1 }; 
     } 
     catch (Exception ex) 
     { 
      return new TClass { Result = o, Error = ex }; 
     } 
Смежные вопросы