Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET不确定是否正确读取SQL Server数据库_C#_Asp.net_Sql Server - Fatal编程技术网

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

C# ASP.NET不确定是否正确读取SQL Server数据库,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我试图创建一个用户注册页面,将用户数据上传到SQLServer数据库。我想有能力检查用户名是否已经存在,并防止它被制作。我可以用名字、姓氏、用户名等创建一个新用户,它会更新数据库,但这不会阻止我使用数据库中已经存在的用户名创建一个用户。这是我的密码: protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { //connect registration form to data

我试图创建一个用户注册页面,将用户数据上传到SQLServer数据库。我想有能力检查用户名是否已经存在,并防止它被制作。我可以用名字、姓氏、用户名等创建一个新用户,它会更新数据库,但这不会阻止我使用数据库中已经存在的用户名创建一个用户。这是我的密码:

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())之前在服务器端验证中使用该SP。这样可以降低遇到sql异常的可能性,但在发生异常时仍然可以处理它

当前将表单数据附加到原始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
        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();
                }
            }
您的.NET代码可能如下所示:

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
        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();
                }
            }

你不应该这样做!,不要直接输入已提交字段并将其直接附加到动态sql语句中,我可以通过文本框中的一个非常特定的条目轻松删除整个数据库。永远不要这样做!!!!!