从数据库中获取-1值

时间:2012-04-20 21:57:28

标签: c#

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

2 个答案:

答案 0 :(得分:5)

看看这段代码:

num = cmd.ExecuteNonQuery();

现在假设您正在基于名为query的变量创建命令,您是否真的认为使用短语非查询调用方法是否有意义?如果您还不相信,请参阅ExecuteNonQuery的文档:

  

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

您的陈述是一个SELECT查询,因此它完全按照文档记录返回-1。

我怀疑你应该使用ExecuteScalarExecuteReader。例如,如果您尝试获取匹配的数字,则应使用:

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

就个人而言,我更喜欢按照詹姆斯的回答取得-1或null,但这是一个品味问题。

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

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

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

答案 1 :(得分:0)

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

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

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

修改

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

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

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