C# 从数据库中获取-1值

C# 从数据库中获取-1值,c#,C#,我正在做一个登录页面。为此,我将从数据库中验证用户名和密码。当我执行程序时,查询将运行并返回-1值。因为用户名和密码是正确的。请帮帮我。我的程序代码如下: public partial class Home : System.Web.UI.Page { SqlConnection objcon; String query; SqlCommand cmd; int num; //SqlDataAdapter DataAdapter; protect

我正在做一个登录页面。为此,我将从数据库中验证用户名和密码。当我执行程序时,查询将运行并返回-1值。因为用户名和密码是正确的。请帮帮我。我的程序代码如下:

public partial class Home : System.Web.UI.Page
{
    SqlConnection objcon;
    String query;
    SqlCommand cmd;
    int num;
    //SqlDataAdapter DataAdapter;

    protected void Page_Load(object sender, EventArgs e)//db open in page load.
    {
        objcon = new SqlConnection("Data Source String");
        objcon.Open();
    }
    //query execution and authentication on button click 

    protected void Button1_Click(object sender, EventArgs e)
    {
        query = "select * from tbl_user where UserName='" + txtUname.Text + "' and Password='" + txtPwd.Text + "'";

        cmd = new SqlCommand(query,objcon);

        num = cmd.ExecuteNonQuery();

        //Label3.Text = num.ToString();
        if (num == -1)
            Label3.Text = "Correct";
        else
            Label3.Text = "Incorrect";
        objcon.Close();
    }
}
请看以下代码:

num = cmd.ExecuteNonQuery();
现在,假设您正在基于名为
query
的变量创建一个命令,那么您真的认为使用短语non-query调用一个方法有意义吗?如果您还不确定,请参阅以下文档:

对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。[…]对于所有其他类型的语句,返回值为-1

您的语句是一个
SELECT
查询,因此它返回的是-1,与文档中描述的完全一样

我怀疑你应该使用或。例如,如果您试图获取匹配数,则应使用:

SELECT COUNT(*) ... (rest of query, parameterized of course)
就我个人而言,根据詹姆斯的回答,我更喜欢接受-1或空值,但这是一个品味的问题

如果您没有尝试获取匹配的计数,那么首先就不清楚为什么要分配给
int
变量

编辑:其他问题:(如评论中所述)

  • 仅在需要时创建并打开
    SqlConnection
    ,而不是在构造函数中
  • SqlConnection
    SqlCommand
    使用
    using
    指令,即使出现异常,它们也会关闭
  • 不要在SQL中直接包含用户输入-改用参数化SQL,以避免SQL注入攻击,改进代码/数据分离,并避免转换错误
  • 不要将用户密码直接以明文形式存储在数据库中——这对于任何网站来说都是一件非常可怕的事情
  • 首先不要尝试编写自己的用户身份验证代码-在许多不同的地方,您已经完成了这项工作
看看这个代码:

num = cmd.ExecuteNonQuery();
现在,假设您正在基于名为
query
的变量创建一个命令,那么您真的认为使用短语non-query调用一个方法有意义吗?如果您还不确定,请参阅以下文档:

对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。[…]对于所有其他类型的语句,返回值为-1

您的语句是一个
SELECT
查询,因此它返回的是-1,与文档中描述的完全一样

我怀疑你应该使用或。例如,如果您试图获取匹配数,则应使用:

SELECT COUNT(*) ... (rest of query, parameterized of course)
就我个人而言,根据詹姆斯的回答,我更喜欢接受-1或空值,但这是一个品味的问题

如果您没有尝试获取匹配的计数,那么首先就不清楚为什么要分配给
int
变量

编辑:其他问题:(如评论中所述)

  • 仅在需要时创建并打开
    SqlConnection
    ,而不是在构造函数中
  • SqlConnection
    SqlCommand
    使用
    using
    指令,即使出现异常,它们也会关闭
  • 不要在SQL中直接包含用户输入-改用参数化SQL,以避免SQL注入攻击,改进代码/数据分离,并避免转换错误
  • 不要将用户密码直接以明文形式存储在数据库中——这对于任何网站来说都是一件非常可怕的事情
  • 首先不要尝试编写自己的用户身份验证代码-在许多不同的地方,您已经完成了这项工作

您想要的是执行一个标量查询,这意味着它返回一个值。在您的查询中,如果用户名和密码匹配,只需选择
-1

SELECT -1 FROM tblUser WHERE Username = 'James' AND Password = 'Johnson'
如果返回值,则该值将为
-1
,并且您知道您有一个匹配项。如果未返回任何值(
null
),则该值不匹配

编辑

除了回答您的问题外,您还需要解决代码中的一些主要问题:

  • 每次加载页面时,您都会打开一个新连接。这是一个大禁忌!不仅在每次页面加载时打开一个新连接,而且在执行查询后也不会关闭连接

  • 不要使用连接来构建查询,而是使用参数化查询来避免SQL注入的风险。即使对SQL稍有了解的人也可以轻松地避开您的查询并对您的数据造成严重破坏


  • 您想要的是执行一个标量查询,这意味着它返回一个值。在您的查询中,如果用户名和密码匹配,只需选择
    -1

    SELECT -1 FROM tblUser WHERE Username = 'James' AND Password = 'Johnson'
    
    如果返回值,则该值将为
    -1
    ,并且您知道您有一个匹配项。如果未返回任何值(
    null
    ),则该值不匹配

    编辑

    除了回答您的问题外,您还需要解决代码中的一些主要问题:

  • 每次加载页面时,您都会打开一个新连接。这是一个大禁忌!不仅在每次页面加载时打开一个新连接,而且在执行查询后也不会关闭连接

  • 不要使用连接来构建查询,而是使用参数化查询来避免SQL注入的风险。即使对SQL稍有了解的人也可以轻松地避开您的查询并对您的数据造成严重破坏


  • 警告:您的代码很容易受到sql注入攻击。此外,您永远不应未加密地存储用户密码。您的url是什么?[呵呵-受前两条评论的启发]在投入生产之前,请先阅读本文。然后访问OWASP网站,浏览他们的前10名。更好