2013-08-07 37 views
2

我正在開發的C#經典的web表單應用程序,當我必須對用戶進行認證,我從SQL數據庫中讀取使用像這樣的查詢的用戶數據:ASP.NET C# - 使用數據集讀取一行?

SELECT userid,username,email,city FROM USERS where username='blablabla' and password='blablabla' 

我想用這個sql查詢我的方法返回一個DTO對象,我在我的UserValue類中定義。 我正在考慮使用dataset來填充執行查詢的用戶數據。
這是正確的方法還是太昂貴並且無用dataset從查詢中讀取一行?

你能指導我嗎?

感謝

+1

如果您所做的只是使用查詢的結果來填充對象(如DTO),那麼我會使用'SqlDataReader',然後遍歷讀取器來填充對象,特別是如果您只有一個行。速度更快,我希望更少的開銷。 – Tim

+0

完全同意蒂姆。 +1 –

回答

1

下面是一段代碼(這是MS SQL,但是SQL的其他口味應該是相似的),說明我在說什麼關於我的評論:

using (SqlConnection con = new SqlConnection(connectionString)) 
{ 

    con.Open(); 

    SqlCommand cmd = new SqlCommand("SELECT userid,username,email,city FROM USERS where [email protected] and [email protected]", con); 
    cmd.Paramters.AddWithValue("@username", username); 
    cmd.Parameters.AddWithValue("@password", password); 
    cmd.CommandType = CommandType.Text; 

    UserInfo info = new UserInfo(); 

    using (SqlDataReader rdr = cmd.ExecuteReader()) 
    { 

     if (rdr.HasRows) 
     { 
      rdr.Read(); // get the first row 

      info.UserID = rdr.GetInt32(0); 
      info.UserName = rdr.GetString(1); 
      info.Email = rdr.GetString(2); 
      info.City = rdr.GetString(3); 
     } 
    } 
} 

此示例還顯示瞭如何執行參數化查詢,這對防止SQL注入攻擊非常重要。另外,不是循環閱讀器,而是檢查它是否有行,並且它是否只讀第一行(因爲你在處理用戶信息,因此理論上應該只有一行),而不是填充DTO。

希望這會說明我對你的問題的評論。

+0

SqlDataReader rdr = cmd.ExecuteNonQuery()給我一個錯誤,因爲ExecuteNonQuery返回一個整數。有我使用ExecuteReader而不是ExecuteNonQuery()? – ezechiele2517

+0

是的,對不起。 'ExecuteReader' - 太多的代碼片段會通過我的頭:)我會編輯我的帖子來解決這個問題。 – Tim