Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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# 使用Parameters.AddWithValue传递数据库名称失败_C#_Sql_Login - Fatal编程技术网

C# 使用Parameters.AddWithValue传递数据库名称失败

C# 使用Parameters.AddWithValue传递数据库名称失败,c#,sql,login,C#,Sql,Login,我一直在尝试执行登录查询。我认为这个函数的主要问题是参数.AddWithValue部分,但我并不真正理解哪里出了问题 以下代码在运行时返回错误: 必须声明表变量“@database” 代码: 我也做了同样的查询 "SELECT COUNT(*) FROM" + strDatabase + " WHERE Username = " + USER + " AND Password = " + PASS; 但有人告诉我,这是一种糟糕的做法。有什么建议吗?我从未见过表名作为参数传递,

我一直在尝试执行登录查询。我认为这个函数的主要问题是
参数.AddWithValue
部分,但我并不真正理解哪里出了问题

以下代码在运行时返回错误:

必须声明表变量“@database”

代码:

我也做了同样的查询

"SELECT COUNT(*) FROM" + strDatabase + " WHERE Username = " + USER + 
        " AND Password = " + PASS;

但有人告诉我,这是一种糟糕的做法。有什么建议吗?

我从未见过表名作为参数传递,根据其他帖子(例如),我认为这不容易做到。。。至少,不是通过
SqlCommand.Parameters

听起来好像只有两个表——管理员和普通用户。作为替代方案,您可以只向该方法传递bool,如
isAdmin
,然后根据用户是管理员还是普通用户进行两次查询

public static bool clsFuncLogin(string user, string pass, string conStr, bool isAdmin)
{
    ...

    var query = isAdmin
        ? "SELECT COUNT(*) FROM ADMIN_TABLE WHERE Username = @userid AND Password = @password"
        : "SELECT COUNT(*) FROM REGULAR_TABLE WHERE Username = @userid AND Password = @password";

    using (var sqlCommand = new SqlCommand(query, conn))
    {
        sqlCommand.Parameters.AddWithValue("@userid", user);
        sqlCommand.Parameters.AddWithValue("@password", pass);

        ...
        ...
使用的主要原因

SELECT * FROM TABLE WHERE column=@column
使用参数可以避免为值提供正确格式的所有复杂情况。如果应用程序的用户将值作为自由文本提供,则这一点更为重要,因为如果您无法正确解决所有格式问题(这基本上不值得为给定的参数解决方案付出努力),您将打开SQL注入攻击的所有可能性

我真的希望您不允许用户提供表名,它是由您自己的代码提供的,因此您可以非常安全地使用它

var query = String.Format("SELECT * FROM {0} WHERE column=@column", tableName);

但是,我建议您创建两个单独的查询,以正确地分离关注点。

您的意思是存在错误还是对为什么这样做感到困惑?Don Don do Password=PASS directly,因为它可能会被SQL注入攻击击中。很抱歉造成混淆,但是发布的函数不起作用。返回一个“必须声明表变量”@数据库“当它运行时,我不明白它为什么不工作。我计划稍后加密和腌制这只是一个逻辑test@GrantWinneystrDatabase是正在访问的表。主题外,但我建议查看并尝试规范化您的名称。我已更改了标题-请确保它符合您的意图(显然符合答案)。下次请避免使用“new here”/“thank you”,而是内联有关错误的详细信息—消息、堆栈,。。。考虑不要使用误导性的名字,如<代码> Strug/<代码>(而不是<代码>查询< /代码>)。因此,状态的问题是不能用参数替换表名吗?它像你所说的那样工作,谢谢帮助。我假设Parameters.AddWithValue会替换查询中的一些文本。谢谢你的澄清!
var query = String.Format("SELECT * FROM {0} WHERE column=@column", tableName);