1

Я разработал свое приложение в многоуровневом подходе. У меня есть уровень BusinessOP для каждого интерфейса и общий уровень доступа к данным. На моем уровне доступа к данным у меня есть метод чтения данных.Сделать метод параметризованным

 public SqlDataReader executeQuerys(string query01) 
    { 
     SqlConnection con = null; 
     SqlCommand com = null; 
     try 
     { 
      con = new SqlConnection(DBConnect.makeConnection()); 
      con.Open(); 
      com = new SqlCommand(query01, con); 
      return com.ExecuteReader(CommandBehavior.CloseConnection); 
     } 

     catch 
     { 
      com.Dispose(); 
      con.Close(); 
      throw; 
     } 

Это код для моего уровня DBConnection.

 public static string makeConnection() 
    { 
     string con = ConfigurationManager.ConnectionStrings["MyDB.Properties.Settings.ConString"].ToString(); 
     return con; 
    } 

В моем бизнес-слое у меня есть такие методы, каждый из которых вызывает определенную хранимую процедуру.

 public SqlDataReader getLGDivID(string divName) 
    { 
     string query = "EXEC getLGDivID'" + divName + "'"; 
     return new DataAccessLayer().executeQuerys(query); 
    } 

Поскольку моя работа бизнеса слой небезопасен, я хочу иметь его с параметризованным запросом здесь я использую конкатенацию для передачи параметров. Может ли кто-нибудь намекнуть мне, как его изменить?

+1

Side Примечание: Вы всегда должны '.Dispose', не только тогда, когда вы ловите исключение. – Silvermind

ответ

3

Вы можете изменить ваши функции немного:

public SqlDataReader executeQuerys(string query01, string paramName, string value) 
{ 
    SqlConnection con = null; 
    SqlCommand com = null; 
    try 
    { 
     con = new SqlConnection(DBConnect.makeConnection()); 
     con.Open(); 
     com = new SqlCommand(query01, con); 
     com.Parameters.AddWithValue(paramName, value); 
     com.Dispose(); 
     con.Close(); 
    } 
    catch 
    { 
     com.Dispose(); 
     con.Close(); 
     throw; 
    } 
    return com.ExecuteReader(CommandBehavior.CloseConnection); 
} 

затем использовать его:

public SqlDataReader getLGDivID(string divName) 
{ 
    string query = "EXEC getLGDivID @divName"; 
    return new DataAccessLayer().executeQuerys(query, "@divName", divName); 
} 

EDIT:

Как @silvermind отметил, вы должны правильно распределите свое соединение. То, как у вас есть, теперь он будет использовать соединение только тогда, когда вы поймаете исключение.

Это плохо, использовать IDisposable, например:

public SqlDataReader executeQuerys(string query01, string paramName, string value) 
{ 
    using (SqlConnection con = new SqlConnection(DBConnect.makeConnection())) 
    { 
     try 
     { 
      con.Open(); 
      com = new SqlCommand(query01, con); 
      com.Parameters.AddWithValue(paramName, value); 
     } 
     catch(SqlException ex) 
     { 
      //Handle the exceptio 
      //no need to dispose connection manually 
      //using statement will take care of that 
     } 
    } 
    return com.ExecuteReader(CommandBehavior.CloseConnection); 
} 
+1

Возможно, вы можете рассмотреть возможность правильной утилизации с использованием блока, чтобы улучшить ответ. :) – Silvermind

+0

@ Сильверминд я расширил свой ответ спасибо! – meda

+0

@meda это дает мне эту ошибку, Ошибка DataAccessLayer.executeQuerys (строка, строка, строка) ': не все пути кода возвращают значение – chathwind