ASP.NET不确定是否正确从SQL Server数据库读取



我正在尝试制作一个用户寄存器页面,将用户数据上传到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();
                }
            }

最新更新