ADO.NET使用查询从数据库中检索用户

时间:2014-10-24 11:22:55

标签: sql sql-server asp.net-mvc ado.net

我一直使用linq从sql获取数据。它快速且易于使用但我听说与普通查询相比,它需要更多来自服务器的资源。

所以..我现在正试图改善查询..

我想要的是通过查询从数据库中检索用户。

是否可以做这样的事情:

用户模型:

[Key]
public int UserId { get; set; }  

public string UserName { get; set; }
public string Password { get; set; }
public string PasswordSalt { get; set; }
public string Money { get; set; }

查询:

public User GetUser(string userName)
{
    string sql = "SELECT * FROM Users WHERE UserName = @UserName";

    User user = null;

    using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, connection);
            cmd.Parameters.Add("@userName", SqlDbType.VarChar, 12).Value = userName;

            connection.Open();

            user = (User)cmd.ExecuteReader();
        }
        catch
        {

        }
    }

    return user;
}

或者我是否被迫使用datareader并将每个单元格插入到新的用户模型中,然后将其返回?

//新手

更新1:

如果我希望结果是用户模型的泛型集合,我将如何继续?

2 个答案:

答案 0 :(得分:1)

不,与Linq和ORM图层不同,基本的ADO不会从数据库映射到实体。您必须阅读每个列值并自行分配给每个属性。

但是,您可能想尝试Dapper。它确实支持您尝试执行的操作,同时仍保留SQL的低级语法,速度和效率。它被实现为IDbConnection的扩展方法。

https://www.nuget.org/packages/Dapper

https://github.com/StackExchange/dapper-dot-net

答案 1 :(得分:1)

SqlDataReader只是结果的句柄,有点像光标。您需要逐步执行它并选择由结果列名称索引的值。尝试这样的事情:

public User GetUser(string userName)
{
  string sql = "SELECT * FROM Users WHERE UserName = @UserName";
  User user = null;
  using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
    {
    try
      {
        SqlCommand cmd = new SqlCommand(sql, connection);
        cmd.Parameters.Add("@userName", SqlDbType.VarChar, 12).Value = userName;
        connection.Open();
        SqlDataReader dr = cmd.ExecuteReader();
        if (dr.Read()) {
          // Now you're pointed at the first result row
          user = new User {
            UserID = dr["UserID"],
            Name = dr["Name"],
            Whatever = dr["Whatever"]
          };
        }
      }
      catch
      {
      }
    }
  return user;
}

此外,ADO.NET现在建议使用Parameters.AddWithValue方法。我觉得它更容易,因为你不必处理类型和长度等等,我从来没有遇到任何结果问题。所以,而不是:

cmd.Parameters.Add("@userName", SqlDbType.VarChar, 12).Value = userName;

您可以使用:

cmd.Parameters.AddWithValue("@userName", userName);