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;
}
}
答案 0 :(得分:0)
问题出在try块中,只有当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.
答案 1 :(得分:0)
您的代码中存在许多问题。当然编译器会在编译时阻止你,但是你会在运行时得到其他错误
因此修复编译时问题很容易。如果您的查询没有返回任何行,只需写一个retrun值:
// This returns true if you have rows, false if not
return (dt.Rows.Count > 0);
现在您将在运行时遇到的问题如下
。
public bool loginpro(string loginas, string dept, string usnm, string pass)
{
try
{
string qrstr;
qrstr = @"select * from login where loginas=@login 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引擎。
答案 2 :(得分: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;
}
}