我正在尝试制作一个用户寄存器页面,将用户数据上传到SQL Server数据库。我想具有检查用户名是否已经存在并防止制作的能力。我能够创建一个具有名称,姓氏,用户名等的新用户,并且可以更新数据库,但是它并不能阻止我使用数据库中已经存在的用户名创建用户。这是我的代码:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
//connect registration form to database
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["sandboxConnectionStringUserData"].ConnectionString);
conn.Open(); //open connection
//SQL Query
string checkUserName = "select count(*) from UserData where UserName='"+TextBoxUserName.Text+"'";//checks if username is already there
SqlCommand command = new SqlCommand(checkUserName, conn);
int temp = Convert.ToInt32(command.ExecuteScalar().ToString());
if(temp == 1)
{
Response.Write("User name already exists");
}
conn.Close(); //close the database
}
}
我尝试调试和温度的值永远不会更改为1。
谢谢!
只需在用户名列中添加唯一约束,然后处理应用程序中的SQL异常即可。此外,您可以/应该编写一个将用户名作为参数并在表中检查的SP,并在对表格进行排序后的服务器端验证中使用该SP,但在插入(save(save(save())发生之前。这样,您就可以减少遇到SQL异常的可能性,但如果发生这种情况,仍然可以处理。
您当前将表单数据附加到RAW SQL查询的方法将为您打开SQL注入。改用参数化查询。
在用户名列上创建唯一约束是一个很好的开始。我还将创建一个存储过程,该过程检查用户的存在,并插入或更新以及更有效地构建代码。用户名应作为参数传递,您应该正确处理连接对象。
作为一个例子,您的存储过程可能看起来像:
CREATE PROCEDURE dbo.uspUserData @userName VARCHAR(50)
AS
BEGIN
IF EXISTS(SELECT 1 FROM dbo.UserData WITH(NOLOCK)
WHERE UserName = @userName)
BEGIN
-- update
END
ELSE
BEGIN
-- insert
END
END
和您的.NET代码看起来像:
using (
SqlConnection conn =
new SqlConnection(
ConfigurationManager.ConnectionStrings["sandboxConnectionStringUserData"].ConnectionString))
{
using (SqlCommand cmd = new SqlCommand("uspUserData", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@UserName", SqlDbType.VarChar).Value = TextBoxUserName.Text;
conn.Open();
cmd.ExecuteNonQuery();
}
}