簡體   English   中英

如何存儲mysql查詢的結果

[英]How to store result from mysql query

如何最有效地存儲來自 mysql 查詢的結果以在其他類中使用?

我已經嘗試了以下代碼,它可以正確執行並將所有數據存儲在閱讀器中。 如果我願意,在這里閱讀 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 的功能的情況下執行此操作。 它的目的是輸入一個名字和一個地方來存儲數據庫中匹配的所有信息。

此外,請隨意提出任何其他可以提高代碼效率的建議。

如果一切順利,您可以更改 MySqlGetUserByName 以返回一個 User 實例,否則您將向調用方返回一個空實例(或者您可以拋出異常,或者您可以在 DatabaseHandler 類中設置一個全局錯誤標志...,但要保持簡單,我選擇返回空值)

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?
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM