0

我的网络项目中有其他人编写的以下代码:

    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?做事的正确方法是什么?我是否应该创建一个 DAL 类,您将把 sql 发送到并只获取返回的标题(如 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 回答