1

我正在制作一个登录页面。为此,我将从数据库中验证用户名和密码。当我执行程序查询将运行并返回 -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();
    }
}
4

2 回答 2

5

看看这段代码:

num = cmd.ExecuteNonQuery();

现在假设您正在基于名为 的变量创建命令query,您真的认为使用短语non-query调用方法有意义吗?从文档中ExecuteNonQuery,如果您还不相信:

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

您的语句是一个SELECT查询,因此它返回的 -1 与记录的完全相同。

我怀疑你应该使用ExecuteScalaror ExecuteReader。例如,如果您尝试获取匹配,则应使用:

SELECT COUNT(*) ... (rest of query, parameterized of course)

根据詹姆斯的回答,我个人更喜欢采用 -1 或 null ,但这是一个品味问题。

如果您不尝试获取匹配数,则不清楚为什么首先要分配给int变量。

编辑:其他问题:(正如评论中已经提到的

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

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

SELECT -1 FROM tblUser WHERE Username = 'James' AND Password = 'Johnson'

如果返回一个值,则该值将是-1并且您知道您有一个匹配项。如果没有null返回值 ( ),则它不匹配。

编辑

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

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

  2. 不要使用连接来构建查询,而是使用参数化查询来避免 SQL 注入的风险。甚至对 SQL 有一点了解的人都可以轻松地逃避您的查询并对您的数据造成严重破坏。

于 2012-04-20T22:04:45.200 回答