【问题标题】:select data from database, using c# parameter for it从数据库中选择数据,使用 c# 参数
【发布时间】:2014-05-06 04:35:57
【问题描述】:

请你帮我解释为什么我的选择命令不选择任何数据。我尝试将选择从名称更改为 ID,它可以工作,但我需要此选择适用于名称选择,而不是仅适用于 ID。

数据库数据:

id      user      password      level
1       Rad3k       .....         0

选择脚本:

public bool loginVerification(string name, string password)
{
    test = name;
    bool access = false;
    string checkLogin, checkPassword;
    int level;

    commandS = new SqlCommand("SELECT * FROM dbo.users WHERE user like @name", conn);
    try
    {
        conn.Open();
        commandS.Parameters.Clear();

        // Parameters
        SqlParameter nameParam = new SqlParameter("@name", SqlDbType.VarChar, 30);
        nameParam.Value = name;
        commandS.Parameters.Add(nameParam);
        commandS.Prepare();
        SqlDataReader reader = commandS.ExecuteReader();

        while (reader.Read())
        {
            for (int i = 0; i < reader.FieldCount; i++)
                if (reader.IsDBNull(i))
                    return access = false;

            checkLogin = reader.GetString(1);
            checkPassword = reader.GetString(2);
            level = reader.GetInt32(3);

            if (name == checkLogin && hashPassword.ValidatePassword(password, checkPassword) == true)
                access = true;
        }

        return access;
    }
    finally
    {
        conn.Close();
    }
}

如果我使用此选择,它会起作用:

commandS = new SqlCommand("SELECT * FROM dbo.users WHERE id = 1", conn);

但是当我使用它时它不起作用:

commandS = new SqlCommand("SELECT * FROM dbo.users WHERE user like @name", conn);
I try use this without parameter, but it dont work too.
commandS = new SqlCommand("SELECT * FROM dbo.users WHERE user like 'Rad3k'", conn);
commandS = new SqlCommand("SELECT * FROM dbo.users WHERE user like '%Rad3k%'", conn);
commandS = new SqlCommand("SELECT * FROM dbo.users WHERE user like 'Rad3k%'", conn);
commandS = new SqlCommand("SELECT * FROM dbo.users WHERE user = 'Rad3k'", conn);
// and same with paramter still dont work

感谢所有可以帮助我的人。

【问题讨论】:

    标签: c# asp.net sql-server database select


    【解决方案1】:

    你的命令应该是这样的

    SELECT * FROM dbo.users WHERE user like '%" + @name + "%'"
    

    【讨论】:

    • 喜欢'%" + @name + "%'" 没有?
    • @Ehsan 不是一开始就喜欢... ;) 无论如何,只是一个细节!
    • @RaphaëlAlthaus 我最初发布了这个东西。然后我编辑不正确。然后我恢复了......谢谢。
    • 语法和代码是正确的,它可以在 DB 中工作,但不是来自 C# 仍然一无所获。
    【解决方案2】:

    当您针对strings 进行过滤时,您需要使用like 运算符:

     SELECT * FROM dbo.users WHERE user like '%" + @name + "%'"
    

    【讨论】:

      【解决方案3】:

      如果你使用普通的 SQL 语句,你会使用

      SELECT * FROM dbo.users WHERE user like '%Rad3k%'
      

      您需要% 来匹配子字符串,没有它们将意味着完全匹配(只会找到用户“Rad3k”)。请注意,您也可以使用 like 'Rad3k%' 进行“开头为”匹配。

      从带有参数的 C# 中,它会是

      commandS = new SqlCommand("SELECT * FROM dbo.users WHERE user like '%' + @name + '%'", conn);
      

      【讨论】:

        【解决方案4】:

        尝试使用AddWidthValue为传递参数设置值:

        SqlParameter nameParam = new SqlParameter("@name", SqlDbType.VarChar, 30);
        commandS.Parameters.AddWidthValue("name", name);`
        

        【讨论】:

        • 问题是,我尝试使用带参数和不带参数的选择,从 C# 中它什么也没找到。只有当我选择 id 它才有效。我不知道为什么。我直接试试这个。 select * from dbo.user where user like '%Rad3k%' - 它从 C# 中找不到任何东西,当我尝试这个时也没有: commandS = new SqlCommand("SELECT * FROM dbo.users WHERE user like '%' + @name + '%'", conn);
        • 编辑您的查询并尝试 commandS = new SqlCommand("SELECT * FROM dbo.users WHERE user like %@name", conn);
        【解决方案5】:

        您的查询应该有效。您可以使用不带 % 的 like 运算符。如果你想精确匹配用户,你可以使用 user = @name。

        您确定该行中没有任何其他为空的列吗? 此代码取消所有具有空列的行:

                    for (int i = 0; i < reader.FieldCount; i++)
                    if (reader.IsDBNull(i))
                        return access = false;
        

        尝试注释掉这些行并测试您的代码。

        【讨论】:

        • 我认为这不是问题,因为现在我在表中只有一行名称为 Rad3k,正如我所说。此代码仅用于将来的更多数据。但我试着评论它。
        • 是的,但是上面的代码会检查是否有空列。因此,在“Rad3k”行中有任何为 NULL 的列,它将返回 false。我在我的演示数据上测试了你的代码,它运行良好。
        • 我评论了它,但我仍然有同样的问题。我不知道我在哪里失败了
        • 好的,尝试在 SQL Server Management Studio 中运行查询,看看查询是否在那里工作。也尝试调试你的代码,看看它失败的地方?
        猜你喜欢
        • 1970-01-01
        • 2014-03-18
        • 2016-11-26
        • 1970-01-01
        • 2021-05-14
        • 2019-02-21
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        相关资源
        最近更新 更多