价值首先,你不应该使用字符串连接来构建你的查询,因为它可以让你容易的事情,如SQL注入攻击,它可能会导致你的查询是不正确的问题(因为你缺少你周围参数刻度线):
// This would attempt to state username = mustufain instead of
// username = 'mustufain' (and SQL doesn't know what mustufain is)
var query = "select userid from register where username = '" + UserName.Text + "' and " + "password = '" + Password.Text + "'";
一个更好的方法使用的参数看起来像下面这样,避免了不正确的语法,为您提供保护,防止任何讨厌打针:
// Open your connection
using(var connection = new SqlConnection("{your connection string}"))
{
// Build your query
var query = "SELECT TOP 1 userid FROM register WHERE username = @username AND password = @password";
// Build a command (to execute your query)
using(var command = new SqlCommand(query, connection))
{
// Open your connection
connection.Open();
// Add your parameters
command.Parameters.AddWithValue("@username",UserName.Text);
command.Parameters.AddWithValue("@password",Password.Text);
// Execute your query
var user = Convert.ToString(command.ExecuteScalar());
// If a user was found, then set it
if(!String.IsNullOrEmpty(user))
{
Session["checkuserid"] = user;
}
else
{
// No user was found, consider alerting the user
}
}
}
最后,您可能想重新考虑如何存储凭据(以明文形式)。 ASP.NET提供了各种各样的提供者,可以帮助你处理这个过程,这样你就不必亲自去做。
首先,ASP.NET不执行查询。这是ADO.NET。其次,你应该*不*通过串联构造sql语句。使用参数化查询。在这种情况下,你不知道用户输入了什么。如果它是'1; drop table users; - ? –
只是谷歌的“鲍比表”,看看会发生什么 –
SqlConnection,SqlCommand和SqlDataReader实现[IDisposable](https://msdn.microsoft.com/en-us/library/system.idisposable(v = vs.110)的.aspx)。你需要在它们的'finally'块中调用dispose,或者将它们封装在[using语句](https://msdn.microsoft.com/en-us/library/yh598w02.aspx)中,以确保它们被丢弃正确。如果你现在不这样做,你会在稍后遇到问题,并且很难追查问题。 – mason