gpt4 book ai didi

c# - 必须声明标量变量 "@UserName"

转载 作者:太空狗 更新时间:2023-10-30 00:20:49 24 4
gpt4 key购买 nike

我不断收到我不理解的错误。

Must declare the scalar variable "@varname"

我的目标是创建一个使用 2 个文本框和一个按钮的登录页面,它根据存储在 SQL 数据库中的信息检查用户是否退出。

这就是我认为问题的来源:

private bool DBConnection(string userName, string password)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

//string cmdString = ("SELECT UserName, Password FROM Users WHERE UserName ='" + userName +
// "'AND Password ='" + password + "'"); //REMOVED AS THIS IS PRONE TO SQL INJECTIONS

string cmdString = ("SELECT * FROM Users WHERE UserName = @uname AND Password = @pw");

SqlCommand cmd = new SqlCommand(cmdString, conn);

cmd.Parameters.Add("uname", SqlDbType.VarChar).Value = userName;
cmd.Parameters.Add("pw", SqlDbType.VarChar).Value = password;

DataSet loginCredentials = new DataSet();
SqlDataAdapter dataAdapter;

try
{
if (conn.State.Equals(ConnectionState.Closed))
{
conn.Open();

dataAdapter = new SqlDataAdapter(cmdString, conn);
dataAdapter.Fill(loginCredentials);

conn.Close();

if (loginCredentials != null)
{
if (loginCredentials.Tables[0].Rows.Count > 0)
{
return true;
}
else
{
lblMessage.Text = "Incorrect Username or Password";
lblMessage.Visible = true;
}
}
}
}
catch (Exception err)
{
lblMessage.Text = err.Message.ToString() + " Error connecting to the Database // " + cmd.Parameters.Count;
lblMessage.Visible = true;
return false;
}

return false;
}

特别是 dataAdapter.Fill(loginCredentials); 被执行的地方。

注释掉的语句在使用正确的用户名和密码登录用户时成功运行,但据我所知并不安全,因为它容易受到 SQL 注入(inject)的攻击,这就是我尝试参数化 SQL 的原因声明。

错误截图如下: Error screenshot

最佳答案

您应该将 sqlcommand 传递给 dataAdapter,因为在您的情况下,sqlcommand (cmd) 包含的信息不仅仅是命令文本和连接字符串。您的代码可能如下所示:

private bool DBConnection(string userName, string password)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

//string cmdString = ("SELECT UserName, Password FROM Users WHERE UserName ='" + userName +
// "'AND Password ='" + password + "'"); //REMOVED AS THIS IS PRONE TO SQL INJECTIONS

string cmdString = ("SELECT * FROM Users WHERE UserName = @uname AND Password = @pw");

SqlCommand cmd = new SqlCommand(cmdString, conn);

cmd.Parameters.Add("uname", SqlDbType.VarChar).Value = userName;
cmd.Parameters.Add("pw", SqlDbType.VarChar).Value = password;

DataSet loginCredentials = new DataSet();
SqlDataAdapter dataAdapter;

try
{
if (conn.State.Equals(ConnectionState.Closed))
{
conn.Open();

dataAdapter = new SqlDataAdapter(cmd);
dataAdapter.Fill(loginCredentials);

conn.Close();

if (loginCredentials != null)
{
if (loginCredentials.Tables[0].Rows.Count > 0)
{
return true;
}
else
{
lblMessage.Text = "Incorrect Username or Password";
lblMessage.Visible = true;
}
}
}
}
catch (Exception err)
{
lblMessage.Text = err.Message.ToString() + " Error connecting to the Database // " + cmd.Parameters.Count;
lblMessage.Visible = true;
return false;
}

return false;
}

关于c# - 必须声明标量变量 "@UserName",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8933634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com