如何存储来自mysql查询的结果

时间:2019-03-26 16:49:35

标签: c# mysql

如何存储mysql查询的结果以最有效地用于其他类?

我尝试了以下代码,该代码可以正确执行并将所有数据按需存储在 reader 中。如果我愿意,可以在这里读取DataReader!

public class DatabaseHandler
{
    public void MySqlGetUserByName(string input_username, MySqlDataReader reader)
    {
        try
        {
            _database.Open();
            string query = "SELECT * FROM users WHERE username = '@input'";
            MySqlParameter param = new MySqlParameter(); param.ParameterName = "@input"; param.Value = input_username;
            MySqlCommand command = new MySqlCommand(query, _database);
            command.Parameters.Add(param);
            reader = command.ExecuteReader();
            _database.Close();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
}

但是当我尝试在此处读取相同的 DataReader 时,它为null并引发异常(在Debug6之后)。

public class LoginHandler
{
    public static void UserAuth(Client user, string input_username, string input_password)
    {
        DatabaseHandler dataBase = new DatabaseHandler();
        MySqlDataReader dataReader = null; 
        dataBase.MySqlGetUserByName(input_username, dataReader);

        Console.WriteLine("Debug6");
        if (!dataReader.HasRows)
        {
            user.SendChatMessage("No match found.");
            return;
        }

        while (dataReader.Read())
        {
            user.SetData("ID", (int)dataReader[0]);
            user.SetData("username", (string)dataReader[1]);
            user.SetData("email", (string)dataReader[2]);
            user.SetData("password", (string)dataReader[3]);
        }
        dataReader.Close();
    }
}

请让我知道如何进行此工作,或者是否有更有效的方法来执行此操作而不限制MySqlGetUserByName的功能。这样做的目的是输入一个名称和一个位置,以将匹配中的所有信息存储在数据库中。

此外,请随意提出任何其他建议,以使代码更高效。

1 个答案:

答案 0 :(得分:1)

如果一切顺利,则可以更改MySqlGetUserByName以返回User实例,否则,将空实例返回给调用方(或者可以引发异常,也可以在DatabaseHandler类中设置全局错误标志... ,但为了简单起见,我选择返回null)

public class DatabaseHandler
{
    public User MySqlGetUserByName(string input_username)
    {
        User result = null;
        try
        {
            string query = "SELECT * FROM users WHERE username = @input";
            using(MySqlConnection cnn = new MySqlConnection(......))
            using(MySqlCommand command = new MySqlCommand(query, cnn))
            {
                cnn.Open();
                command.Parameters.AddWithValue("@input", input_username);
                using(MySqlDataReader dataReader = command.ExecuteReader())
                {
                   if (dataReader.Read())
                   {
                       result = new User();
                       result.ID = Convert.ToInt32(dataReader[0]);
                       ..... and so on with the other user properties ....
                   }
                }
            }
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        // Return the user to the caller. If we have not found the user we return null
        return result;
    }
}

以呼叫者处理情况的相同方式

public class LoginHandler
{
    public static void UserAuth(string input_username, string input_password)
    {
        DatabaseHandler dataBase = new DatabaseHandler();
        User result = dataBase.MySqlGetUserByName(input_username);

        // If we have not found the user we have a null in the variable 
        if(result == null)
        {
            // Send your message using a static method in the user class
            // User.SendMessage("User with username {input_username} not found!");
        }
        else
        {
            // User ok. return it? or do something with its data?
        }
    }
}