2010-09-22 66 views
0

我有一个用户名数据库表,我试图用它来比较用户名/密码。在ASP.NET中使用SQL适配器填充数据表问题

这是我的代码,它不工作,我做错了什么?

DataTable dt = null; 

protected void btn_Click_Login(object sender, EventArgs e) 
{ 
    string query = string.Format("SELECT * FROM Users WHERE Username='{0}' AND Password='{1}'", txtUsername.Text, txtPassword.Text); 

    using (SqlConnection c = new SqlConnection(ConfigurationManager.ConnectionStrings["RBConnectionString"].ConnectionString)) 
    { 
     c.Open(); 

     using (SqlDataAdapter a = new SqlDataAdapter(query, c)) 
     { 
      DataTable t = new DataTable(); 
      a.Fill(t); 
     } 
    } 
    if (dt.Rows.Count > 0) 
    { 
     Session["Username"] = txtUsername.Text; 
     Session["Password"] = txtPassword.Text; 
     Response.Redirect("main.aspx"); 
     lblError.Text = "success"; 
    } 
    else 
    { 
     lblError.Text = "Wrong Username/Password combination"; 
    } 
} 

}

+0

你做了什么错误? – anishMarokey 2010-09-22 11:20:17

+1

当你说它不工作,以什么方式?你有错误吗?作为一个侧面的问题(但是很重要),通过动态构建SQL来打开自己的SQL注入。您应该使用参数化的SQL。 – AdaTheDev 2010-09-22 11:22:11

+0

当我试图对数据表中的行进行计数时,我得到一个空引用异常。调试器说:对象引用未设置为对象的实例。 – 2010-09-22 18:52:23

回答

1

,我决定尝试数据读取器和得到它的工作:

protected void btn_Click_Login(object sender, EventArgs e) 
{ 

    SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["RbConnectionString"].ConnectionString); 
    conn.Open(); 
    string queryString = "SELECT * FROM [Users] WHERE [email protected] AND Password= @password"; 
    SqlCommand command = new SqlCommand(queryString, conn); 
    command.Parameters.AddWithValue("@username", txtUsername.Text); 
    command.Parameters.AddWithValue("@password", txtPassword.Text); 

    SqlDataReader reader = null; 
    reader = command.ExecuteReader(); 

    if (reader.Read()) 
    { 
     Session["Username"] = txtUsername.Text; 
     Session["Password"] = txtPassword.Text; 
     Response.Redirect("main.aspx"); 
    } 
    else 
    { 
     lblError.Visible = true; 
     lblError.Text = "Incorrect Username/Password Combination"; 
    } 
    conn.Close(); 

} 
+0

这是防止SQL注入的正确方法吗? – 2010-09-23 15:36:30

+0

是的,这是避免SQL注入的正确方法。 – 2010-09-23 15:51:40

+0

这对N层应用程序没有好处......您应该使用表格适配器和代码分离。 – PriceCheaperton 2015-03-21 13:09:30

1

尝试创建一个SqlCommand握住你的查询。

SqlCommand cmd = new SqlCommand(query, c); 

using (SqlDataAdapter a = new SqlDataAdapter(cmd)) 
{ 
    DataTable t = new DataTable(); 
    a.Fill(t); 
} 

我不是100%肯定这是你的问题,但早在时,我曾经使用ADO.NET天(L2SQL/EF之前,黑暗的日子确实),我似乎记得DataTable的问题和SqlDataAdapter。

从我记得 - 你不能用基于原始查询字符串的SqlDataAdapter填充DataTable - 你需要使用SqlCommand。但我相信这可以用DataSet来完成。

因此,要么更改为SqlCommand,要么更改为DataSet。

1

很可能您正在使用错误的数据表来检查返回的行数。

检查数据表的t和dt实例。

1

您填写t

DataTable t = new DataTable(); 
a.Fill(t); 

但读dt

if (dt.Rows.Count > 0) 
+0

哈哈,甚至没有注意到!你也许是对的。让我猜猜,你真的很擅长那些“哪里有书”? – RPM1984 2010-09-22 11:29:46

+0

尝试对数据表中的行进行计数时,我收到空引用异常。调试器说:对象引用未设置为对象的实例。 – 2010-09-22 18:51:34

+1

@nick - 你提到了变化@abatishchev吗? – RPM1984 2010-09-22 22:10:43

0

什么错误,你越来越不清晰。但我觉得你的联系是开放的,永远不会关闭。尝试

c.Close();