2016-06-07 54 views
-8
public bool loginpro(string loginas, string dept, string usnm, string pass) 
{ 
    try 
    { 
     string qrstr; 
     qrstr = "select * from login where loginas=='" + loginas + "',dept=='" + dept + "',usnm=='" + usnm + "',pass=='" + pass + "'"; 
     Gencon.Open(); 
     SqlCommand cmd = new SqlCommand(qrstr, Gencon); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 
     Gencon.Close(); 
     if (dt.Rows.Count > 0) 
     { 
      return true; 
     } 


    } 
    catch (Exception e) 
    { 
     return false; 
    } 
} 
+2

如果Rows.Count爲零會怎麼樣?你有回報價值嗎?編譯器(和C#規則)對此並不滿意。 – Steve

+0

如果沒有行,則需要返回false – Alex

+1

解決此問題後,您的查詢完全錯誤,原因很多。 ==是一個C#操作符,而不是SQL,WHERE多個條件應該由邏輯運算符連接,sql文本是一個Sql注入方。 – Steve

回答

0

有在你的代碼中的許多問題。當然編譯器會在編譯時停止你,但是在運行時會出現其他錯誤

所以修復編譯時問題很簡單。只要寫一個retrun值,如果你沒有你的查詢返回的任何行:

// This returns true if you have rows, false if not 
    return (dt.Rows.Count > 0); 

現在,你將面臨在運行時的問題如下

  • 在SQL平等運算符是=不==
  • 多重WHERE條件應通過一個邏輯運算符 (AND,OR)被接合
  • SQL文本應當被參數

public bool loginpro(string loginas, string dept, string usnm, string pass) 
{ 
    try 
    { 
     string qrstr; 
     qrstr = @"select * from login where [email protected] and dept = @dept 
       and usnm = @user and pass= @pass"; 
     Gencon.Open(); 
     SqlCommand cmd = new SqlCommand(qrstr, Gencon); 
     cmd.Parameters.Add("@login", SqlDbType.NVarChar).Value = loginas; 
     cmd.Parameters.Add("@dept", SqlDbType.NVarChar).Value = dept; 
     cmd.Parameters.Add("@user", SqlDbType.NVarChar).Value = usnm; 
     cmd.Parameters.Add("@pass", SqlDbType.NVarChar).Value = pass; 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 
     Gencon.Close(); 
     return (dt.Rows.Count > 0); 
    } 
    catch (Exception e) 
    { 
     Gencon.Close(); 
     return false; 
    } 
} 

有喜歡不使用using statement並試圖傳遞一個明確的text password to your database引擎,可能導致內存泄漏和安全問題等問題。

0

問題是在嘗試塊,嘗試塊返回值只有當DataTable有行時,如果你沒有行?

if (dt.Rows.Count > 0) 
{ 
    return true; 
} 
else 
{ 
    // has to return something. 
    return false; 
} 

,或者你可能只是簡化這個使用

return dt.Rows.Count > 0 ; // assuming in else you want to return false. 
+0

在else塊如果我想拋出異常捕獲塊呢? – Swaroop

+0

這將工作,只是拋出一個異常。 –

0

錯誤的直接原因是,.NET不知道什麼價值迴歸如果你有零行

... 
    if (dt.Rows.Count > 0) 
    { 
     return true; 
    } 
    ... 
    // what should be returned? true or false? 

我建議重新編寫方法弄成這個樣子:

public bool loginpro(string loginas, string dept, string usnm, string pass) { 
    //DONE: Make SQL readable; debug it ("=" instead of "==") 
    //DONE: Do not fetch redundant data (select * ...) 
    //DONE: Make SQL parametrized 
    String sql = 
    @"select 1 
     from login 
     where loginas = @prm_loginas and 
      dept = @prm_ dept and 
      usnm = @prm_user and 
      pass = @pass"; //TODO: do not store password, but its hash value 
    try { 
    //DONE: wrap IDisposable into using 
    //DONE: do not use global SQL connections Gencon.Open()...Gencon.Close() 
    using (SqlConnection con = new SqlConnection(connectionStringHere)) { 
     con.Open(); 

     //DONE: wrap IDisposable into using 
     using (SqlCommand cmd = new SqlCommand(sql, con)) { 
     cmd.Parameters.Add("@prm_loginas", SqlDbType.NVarChar).Value = loginas; 
     cmd.Parameters.Add("@prm_ dept", SqlDbType.NVarChar).Value = dept; 
     cmd.Parameters.Add("@prm_user", SqlDbType.NVarChar).Value = usnm; 
     //TODO: do not pass password! Pass hash value instead 
     cmd.Parameters.Add("@pass", SqlDbType.NVarChar).Value = pass; 

     //DONE: wrap IDisposable into using 
     //DONE: do not fetch redundant data (you want at most one record only) 
     using (var reader = cmd.ExecuteReader()) { 
      return reader.Read(); // <- cursor has at least one record 
     } 
     } 
    } 
    } 
    catch (DbException ee) { //DONE: do not catch all the exceptions 
    return false; 
    } 
} 
相關問題