获取错误:并非所有代码路径都是值

时间:2016-06-07 07:50:53

标签: c# sql sqlcommand

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;
    }
}

3 个答案:

答案 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);

现在您将在运行时遇到的问题如下

  • SQL中的等号运算符是= not ==
  • 多个WHERE条件应由逻辑运算符连接 (AND,OR)
  • 应该参数化sql文本

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;
  }
}