首页 > 解决方案 > MySQL Parameters.AddWithValue 不工作 C#

问题描述

我一直在尝试编写连接代码以连接数据库。进展顺利,但我遇到了一个我似乎无法解决的奇怪问题。

当我尝试向查询中添加参数时,它不会检索数据。但是当我切换参数时,它确实检索到了正确的数据。

数据访问层如下所示。(我知道这很不安全,但我才刚刚开始):

public static class UserDA
{
    private static MySqlCommand cmd = null;
    private static DataTable dt;
    private static MySqlDataAdapter da;

    public static User RetrieveUser(String username)
    {
        // Create the query
        const String query = "SELECT `Username`, `Password` FROM login WHERE `Username` = '@Username';";
        cmd = DbHelper.Select(
            query, 
            new Dictionary<String, String> 
            {
                {"@Username", username}
            });

        //Setup model
        User user = null;
        if (cmd == null) return null;

        // Get the data and add it to the user model
        dt = new DataTable();
        da = new MySqlDataAdapter(cmd);
        da.Fill(dt);
        foreach (DataRow dataRow in dt.Rows)
        {
            user = new Models.User(
                dataRow["Username"].ToString(),
                dataRow["Password"].ToString());
        }

        return user;
    }
}

Select 方法如下所示:

public static class DbHelper
{
    private static MySqlConnection _connection;
    private static MySqlCommand _cmd;
    private static DataTable _dataTable;
    private static MySqlDataAdapter _adapter;

    public static void EstablishConnection()
    {
        // Gets a connection to the database. Code works.
    }

    /// <summary>
    /// Give the query and a dict with the param name and value
    /// </summary>
    public static MySqlCommand Select(String query, Dictionary<String , String> param)
    {
        try
        {
            if (_connection != null)
            {
                _connection.Open();
                _cmd = _connection.CreateCommand();
                _cmd.CommandType = CommandType.Text;
                _cmd.CommandText = query;
                foreach (KeyValuePair<String, String> keyValuePair in param)
                {
                    _cmd.Parameters.AddWithValue(keyValuePair.Key, keyValuePair.Value);
                }

                _cmd.ExecuteScalar();
                _connection.Close();
            }
        }
        catch (Exception e)
        {
            _connection?.Close();
        }
        return _cmd;
    }
}

最后是用户模型:

public class User
{
    public String Username;
    public String Password;

    public User(String username = "", String password = "")
    {
        Username = username;
        Password = password;
    }
}

当我尝试从中获取数据时会出现问题。如果我使用带有参数的选择查询,它不起作用,但只要我将参数更改为实际值,它就会很好地检索它。在这一点上,我真的很挠头。我是不是在某个地方忘记了一步?

谢谢!

标签: c#mysqlmysql.data

解决方案


尝试删除 SQL 代码中 @Username 周围的引号。

SELECT `Username`, `Password` FROM login WHERE `Username` = '@Username';

SELECT `Username`, `Password` FROM login WHERE `Username` = @Username;

如果这不起作用,请尝试将您的字典从 <String, String> 更改为 <string, string>。


推荐阅读