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

时间:2014-05-15 01:17:36

标签: c# sql login

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

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

  

必须声明表变量" @ database"

代码:

 public static bool clsFuncLogin(string USER, string PASS, 
         string conStr, string strDatabase)
{
    SqlConnection conn = new SqlConnection(
       ConfigurationManager.ConnectionStrings[conStr].ConnectionString);
    conn.Open();


    using (SqlCommand StrQuer = 
         new SqlCommand("SELECT COUNT(*) FROM @database "+ 
            "WHERE Username = @userid AND Password = @password", conn))
    {
        StrQuer.Parameters.AddWithValue("@userid", USER);
        StrQuer.Parameters.AddWithValue("@password", PASS);
        StrQuer.Parameters.AddWithValue("@database", strDatabase);
        int DataQuery = Convert.ToInt32(StrQuer.ExecuteScalar().ToString());
        if (DataQuery == 1)
        {
            System.Web.HttpContext.Current.Session["User"] = USER;
            System.Web.HttpContext.Current.Session["Pass"] = PASS;
            System.Web.HttpContext.Current.Session["loggedIn"] = "True";

            return true;

        }
        else if (DataQuery > 1)
        {
           //to tell if a double is created in the db
           //probably to be removed

            System.Web.HttpContext.Current.Session["Double"] = USER;
            return false;
        }
        else 
        {
            return false;

        }
    }
}

我也完成了查询

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

但我被告知这是不好的做法。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我从未见过将表名作为参数传递,并且基于其他帖子(例如thisthis),我认为不能轻易完成......至少,不是通过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);

        ...
        ...

答案 1 :(得分:-1)

使用的主要原因

SELECT * FROM TABLE WHERE column=@column
带参数的

是为了避免为值提供正确格式的所有复杂性。更重要的是,如果您的应用程序的用户以自由文本的形式提供值,那么如果您无法正确解决所有格式问题(基本上不值得为参数提供解决方案的努力),您将打开SQL注入攻击的所有可能性。

我真的希望您不允许用户提供您自己的代码提供的表名,这样您就可以安全地使用

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

但是,我建议创建两个单独的查询,而不是正确地分离问题。