C# ASP.NET不确定是否正确读取SQL Server数据库
我试图创建一个用户注册页面,将用户数据上传到SQLServer数据库。我想有能力检查用户名是否已经存在,并防止它被制作。我可以用名字、姓氏、用户名等创建一个新用户,它会更新数据库,但这不会阻止我使用数据库中已经存在的用户名创建一个用户。这是我的密码: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
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语句中,我可以通过文本框中的一个非常特定的条目轻松删除整个数据库。永远不要这样做!!!!!