2017-12-19 10 views
0

3層のWebFormsアプリケーションが引き渡されています。私たちは、DALを変更する必要はありません、私はSqlParamaterのリストを受け入れる方法を変更しようとしているASP.Net WebForms - CodeBehindのList of SqlParamaterを読み込むことはできますか?

public Person GetPerson(int? personId, string personName = null) 
    { 
     SqlCommand command = new SqlCommand(); 
     command.CommandType = CommandType.StoredProcedure; 

     command.Parameters.Clear(); 
     command.CommandText = "usp_GetPerson"; 
     command.Parameters.Add("@PersonId", SqlDbType.NVarChar).Value = personId ?? (object)DBNull.Value; 
     command.Parameters.Add("@PersonName", SqlDbType.NVarChar).Value = personName ?? (object)DBNull.Value; 

     // run SqlCommand 
    } 

オブジェクト:

は、我々のような強く型付けされたパラメータを受け入れDALのメソッドを持っています私たちのaspxページからデータベースに渡される多くのデータを変更/追加/削除する要求が定期的に出されています。これは私が実装したいものです。

public Persons GetPerson(List<SqlParameter> sqlParameterList = null) 
    { 
     // initialize SqlCommand object and properties 

     if (sqlParameterList != null) 
     { 
      command.Parameters.AddRange(sqlParameterList.ToArray()); 
     } 

     // run SqlCommand 
    } 

をほとんどDALを残すSqlParamaterオブジェクトの動的リストを受け入れるなどを行うと、我々は唯一のストアドプロシージャを更新する必要がありますし、分離コードは、パラメータの変更がなければなりません我々は受け入れる必要があります。これは、aspxページのCodeBehindにSqlParamaterリストを設定する必要があることを意味します。これをBLLで行う必要がありますか?

n-tierアーキテクチャのさまざまなレイヤーを理解していないので、どのプロセスにどこに配置する必要があるのか​​分かりません。現在のところ、BLLはビジネスロジックなしでCodeBehindとDAL間のリンクとしてのみ機能します。

これを実装するより良い方法があれば、私は提案にも公開しています。

+3

のためにする必要がありますあなたのビジネスレイヤ私の入力。データレイヤーがビジネスレイヤーとプレゼンテーションレイヤーから独立している理由の一部を覚えておいてください。あなたの考えでは、今やデータ層の消費者はストアドプロシージャのパラメータを知る必要があります。これは**理想ではない** –

答えて

0

最初の変更、データアクセスコード

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data; 
using System.Data.SqlClient; 
using System.Configuration; 
namespace DAL 
{ 
public class DataAccessLayer 
{ 
    SqlConnection con = new 
    SqlConnection(ConfigurationSettings.AppSettings["DBCS"]); 
    SqlCommand cmd; 
    DataSet ds; 
    SqlDataAdapter da; 

    public void openConection() 
    { 
     if (con.State == ConnectionState.Open) 
     { 
      con.Close(); 
     } 
     con.Open(); 
    } 


    public void sendonly(string SP_Name, SqlParameter[] param) 
    { 
     try 
     { 
      openConection(); 
      cmd = new SqlCommand(SP_Name, con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      for (int i = 0; i < param.Length; i++) 
      { 
       cmd.Parameters.Add(param[i]); 
      } 
      cmd.ExecuteNonQuery(); 

     } 
     catch (Exception Ex) 
     { 
      throw Ex; 
     } 
     finally 
     { 
      con.Close(); 
      cmd.Dispose(); 
     } 

    } 

    public DataSet getonly(string SP_Name) 
    { 
     try 
     { 
      openConection(); 
      cmd = new SqlCommand(SP_Name, con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      da = new SqlDataAdapter(cmd); 
      ds = new DataSet(); 
      da.Fill(ds); 
     } 
     catch (Exception Ex) 
     { 
      throw Ex; 
     } 
     finally 
     { 
      con.Close(); 
      cmd.Dispose(); 
      da.Dispose(); 
     } 
     return ds; 

    } 

    public DataSet sendget(string SP_Name, SqlParameter[] param) 
    { 
     try 
     { 
      openConection(); 
      cmd = new SqlCommand(SP_Name, con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      for (int i = 0; i < param.Length; i++) 
      { 
       cmd.Parameters.Add(param[i]); 
      } 
      da = new SqlDataAdapter(cmd); 
      ds = new DataSet(); 
      da.Fill(ds); 
     } 
     catch (Exception Ex) 
     { 
      throw Ex; 
     } 
     finally 
     { 
      con.Close(); 
      cmd.Dispose(); 
      da.Dispose(); 
     } 
     return ds; 
    } 
} 

}

、これはベース広すぎる質問や意見かもしれないが、私が追加されます挿入

public void Employee_Insert(string a, string b, int c , int d) 
    { 
     SqlParameter[] param1 = { 
           new SqlParameter("@Name",a), 
           new SqlParameter("@Address",b), 
           new SqlParameter("@Age",c), 
           new SqlParameter("@country",d) 
           }; 
     _dal.sendonly("usp_Employee_insert", param1); 
    } 
関連する問題