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;
}
}
-8
A
回答
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;
}
}
相關問題
- 1. 錯誤:不是所有的代碼路徑返回一個值
- 2. 獲取錯誤:並非所有的代碼路徑都返回一個值
- 3. 錯誤「Survey.fillmydropdownlist()」:不是所有的代碼路徑返回一個值
- 4. 錯誤不是所有的代碼路徑都返回一個值。爲什麼?
- 5. Bool錯誤:「不是所有的代碼路徑都返回一個值」
- 6. C#錯誤不是所有的代碼路徑都返回一個值
- 7. 「不是所有的代碼路徑都返回一個值」錯誤BLL
- 8. C#錯誤 - 「不是所有的代碼路徑都返回一個值」
- 9. c#不是所有的代碼路徑返回一個值錯誤
- 10. 返回錯誤:不是所有的代碼路徑返回一個值
- 11. 錯誤:並非所有的代碼路徑返回一個值
- 12. 錯誤並非所有的代碼路徑返回一個值
- 13. 不是所有的代碼路徑都有返回值
- 14. C#錯誤 - 並非所有代碼路徑返回值
- 15. C#方法錯誤:檢測不到的代碼,而不是所有的代碼路徑返回一個值」
- 16. 「不是所有的代碼路徑都返回一個值」
- 17. C#...不是所有的代碼路徑返回值
- 18. 不是所有的代碼路徑都返回一個值嗎?
- 19. 不是所有的代碼路徑都返回一個值
- 20. 不是所有的代碼路徑都返回一個值(JavaScript)
- 21. 「不是所有的代碼路徑都返回一個值」
- 22. C#不是所有的代碼路徑返回值
- 23. 不是所有的代碼路徑都返回一個值
- 24. 不是所有的代碼路徑都返回一個值,
- 25. 錯誤:行動委託「不是所有的路徑返回值」
- 26. 不是所有的路徑都返回值錯誤c#
- 27. 可達代碼,而不是所有的代碼路徑返回一個值
- 28. 級聯下拉式獲取錯誤不是所有的代碼返回值
- 29. vb.net函數不會返回所有代碼路徑的值
- 30. 錯誤告訴並非所有的代碼路徑返回一個值
如果Rows.Count爲零會怎麼樣?你有回報價值嗎?編譯器(和C#規則)對此並不滿意。 – Steve
如果沒有行,則需要返回false – Alex
解決此問題後,您的查詢完全錯誤,原因很多。 ==是一個C#操作符,而不是SQL,WHERE多個條件應該由邏輯運算符連接,sql文本是一個Sql注入方。 – Steve