0

私の Web プロジェクトで他の誰かによって書かれた次のコードがあります。

    StringBuilder sql = new StringBuilder("");

    // Define sql
    sql.Append("SELECT title ");
    sql.Append("FROM MyTable ");
    sql.Append(string.Format("WHERE id = {0} AND Var = '{1}'", myId, myVar));

    DataTable dtGroups = SqlHelper.GetDataTable(sql.ToString());

    if (dtGroups.Rows.Count > 0)
    {

        foreach (DataRow dr in dtGroups.Rows)
        {
            return dr["title"].ToString();
        }
    }

    return "";

次に、このメソッドを持つ SqlHelper.cs というヘルパー クラスがあります。

  public static DataTable GetDataTable(string sql) {
        return GetDataTable(sql, MyConnectionString);
    }

SqlHelper クラスは DAL を構成しますか? 物事を行う適切な方法は何ですか?SQL を送信してタイトルを返すだけの DAL クラスを作成する必要がありますか (SqlHelper.GetTitle(sql) など)。

4

1 に答える 1

2

そのコードはただ悪いです。SQL インジェクション; 理由もなくDataTable。理由もなく StringBuilder 。ここでは、「dapper」(NuGet で無料で入手可能) を使用して簡単に実行します。

using(var conn = GetSomeConnection()) { // <== todo
    return conn.Query<string>(
        "select title from MyTable where id=@id and Var=@var",
        new { id = myId, var = myVar }).FirstOrDefault() ?? "";
}

これは:

  • インジェクションセーフ (完全にパラメータ化)
  • 直接 (DataTable のような不要なレイヤーはありません)
  • 最適化
于 2012-11-30T23:06:39.773 に答える