选择查询未执行

时间:2013-08-07 02:05:14

标签: c# asp.net .net sql-server

我在Visual Studio 2012中使用ASP.NET C#中的select查询编写了一个用于登录验证的代码。部分代码是

String conn = "Data Source=Srinidhi-PC\\sqlexpress;Initial Catalog=model;Integrated Security=True";
    SqlConnection con = new SqlConnection(conn);
    con.Open();
    String query ="select * FROM [original] WHERE firstname='" + TextBox1.Text + "' and password='" + TextBox2.Text + "'"; 
    SqlCommand cmd = new SqlCommand(query,con);
    SqlDataReader reader =  cmd.ExecuteReader();
    if (reader.HasRows == true)
        Response.Redirect("redirectpage.aspx");
    else
        Response.Write("Login Failure");

但每次系统只响应“登录失败”。这是什么问题?

ExecudeReader返回与条件匹配的记录。就查询而言,我是为了练习而写的。我将在原始代码中添加参数。

2 个答案:

答案 0 :(得分:2)

这里发生了很多事情,很难解开。

最重要的是,如果有人在TextBox1中输入';(drop table [original])怎么办?这被称为Sql Injection,这很糟糕,如果你正在学习成为一名程序员,你需要了解它是什么,以及如何避免它。

幸运的是,这是一个已解决的问题,你可以在网上找到有关它的信息,即使在这里也是如此:SQL Injection attack prevention: where do I start

Classic XKCD 来自http://xkcd.com/327/

接下来,如果reader.HasRows == false并不意味着登录失败,则表示查询返回0行。如果您无法登录,则对con.Open()的调用将引发异常,因此,您的问题实际上是您的查询未返回数据。

此外,如果您只计算行以执行重定向,则可能需要使用count查询,该查询将执行得更快并且使用更少的服务器资源。

答案 1 :(得分:1)

我会更改您的代码,如下所示

var query = "select COUNT(*) FROM [original] WHERE [firstname]=@firstname and [password]=@password";
var conn = "Data Source=Srinidhi-PC\\sqlexpress;Initial Catalog=model;Integrated Security=True";
using (var con = new SqlConnection(conn))
using (var cmd = new SqlCommand(query, con))
{
    cmd.Parameters.AddWithValue("@firstname", TextBox1.Text);
    cmd.Parameters.AddWithValue("@password", TextBox2.Text);
    con.Open();
    var result = (int)cmd.ExecuteScalar();
    if (result > 0)
        Response.Redirect("redirectpage.aspx");
    else
        Response.Write("Login Failure....");

}