0

このようなビジネスレイヤーにメソッドがあります。

    public Boolean saveParty(Party ptObj)
    {
        string query1 = "EXEC insertToParty'" + ptObj.PTRegID + "','" + ptObj.PTName.Replace("'", "''") + "','" + ptObj.PTSymARR + "','" + ptObj.PTSymName + "','" + ptObj.elecRepCol + "','" + ptObj.PTSec + "','" + ptObj.phPri + "','" + ptObj.phSec + "','" + ptObj.bsAddress + "','" + ptObj.secAddress + "','" + ptObj.addedUser + "','" + ptObj.addedDate + "','" + ptObj.PTstatus + "'";
        return (new DataAccessLayer().executeNonQueries(query1));
    }

私のデータアクセスレイヤーでは、このような非クエリの実行を作成しました。

public Boolean executeNonQueries(string query02)
    {
        Boolean flag = false;
        SqlConnection con = null;
        SqlCommand com = null;
        try
        {
            con = new SqlConnection(DBConnect.makeConnection());
            con.Open();
            com = new SqlCommand(query02, con);
            com.ExecuteNonQuery();
            flag = true;
        }
        catch (Exception ex)
        {
            flag = false;
            throw ex;
        }
        finally
        {
            com.Dispose();
            con.Close();
        }
        return flag;
    }

私のデータベース接続レイヤーでは、このように実装しました。

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

私はこれらのメソッドを 3 つの別々のクラスに持っています。私が知りたいのは、レイヤー アーキテクチャを変更せずにここで文字列連結を使用しているため、パラメーター化されたクエリを使用するようにこれらのメソッドを変更する方法です。どうすればそれを達成できますか?

4

1 に答える 1

1

ビジネス層には、SQL 文字列を形成するビジネスはありません。それ自体がドメインに関係し、永続性はデータ アクセス レイヤーに任せる必要があります。可能であれば、その責任を完全にデータ アクセス層に移してください。

プロジェクトの現実により責任を適切な場所に配置できない場合は、ビジネス レイヤーに、パラメーター プレースホルダーを含む SQL ステートメントと、各パラメーター名とパラメーター値のエントリを含む辞書を渡すことを検討できます。

ビジネス層で

public Boolean saveParty(Party ptObj)
{
    string query1 = "EXEC insertToParty @Id, @Name, etc";

    Dictionary<string, object) p = new Dictionary<string, object>();
    p.Add("@Id", ptObj.PTReqID);
    p.Add("@Name", ptObj.PTName);
    // etc.

    return (new DataAccessLayer().executeNonQueries(query1));
}

データ アクセス レイヤーで、ディクショナリからパラメーターを追加します。

public Boolean executeNonQueries(string query02, Dictionary<string, object> parameters)
{
    // Your existing code to setup connection
    foreach (var param in dictionaryWithParametersAndValues)
    {
        com.AddWithValue(param.Key, param.Value);
    }
    com.ExecuteNonQuery(); 
    // Rest of your existing code
}
于 2014-10-16T17:48:22.267 に答える