使用c#异步发送和检索MySQL数据
本文关键字:检索 MySQL 数据 异步 使用 | 更新日期: 2025-05-08 13:07:50
我正试图在C#中创建某种机器人,加入网络浏览器游戏,收集数据并踢被禁止的人。我将我的数据发送到MySQL数据库,这样人们就可以在网站上查找他们的数据。
我试着尽可能简化我的代码,以便更好地解释正在发生的事情。
我有一个eventHandler,当一个人在我身上发生什么事情时,它会被调用,所以我相信它可以在同一时间被调用。
//EventHandler
public static void OnMessage(object sender, InOutPlayerc.Message m)
{
int id = m.getInt(0);
switch (m.Type)
{
//If a player logged in (m = [id, name])
case "login":
Player p = loadPlayerSQL(m.getString(1));
if(p.Status == "BANNED") {
kickPlayer(p);
}
else {
//Store the player local, this way
savePlayerLocal(id, p);
}
return;
//If a player said something (m = [id, chatmessage])
case "talk":
addTimesTalked(loadPlayerLocal(id));
return;
//If a player logs out (m = [id])
case "logout":
savePlayerSQL(loadPlayerLocal(id));
return;
}
}
因为InOutPlayerc.Message m只包含不同InOutPlayerc.Message.Type的id,所以我必须将播放器存储在本地。因此,我可以通过提供id来取回Player对象。
public static void savePlayerLocal(int id, Player p){...};
public static Player loadPlayerLocal(int id){...};
以下是我的其余功能:
public static Player loadPlayerSQL(string username)
{
try
{
int timessaid;
string status;
using (MySqlCommand cmd = DB.CreateCommand())
{
cmd.CommandText = "SELECT * FROM Players WHERE Username = @Username";
cmd.Parameters.AddWithValue("@Username", username);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
reader.Read();
timessaid = Convert.ToInt32(reader["Chat"]);
status = reader["Status"].ToString();
}
}
return new Player(username, status, timessaid);
}
catch (Exception e)
{
return new Player(username, "DEFAULT", 0);
}
}
public static void addTimesTalked(Player p)
{
try
{
using (MySqlCommand cmd = DB.CreateCommand())
{
p.Chat = p.Chat + 1;
cmd.CommandText = "UPDATE Players SET Chat = @Chat WHERE Username = @Username";
cmd.Parameters.AddWithValue("@Username", p.Username);
cmd.Parameters.AddWithValue("@Chat", p.Chat);
cmd.ExecuteNonQuery();
}
}
catch (Exception e)
{
}
}
public static void savePlayerSQL(Player p)
{
try
{
using (MySqlCommand cmd = DB.CreateCommand())
{
cmd.CommandText = "UPDATE Players SET Status = @Status, Chat = @Chat WHERE Username = @Username";
cmd.Parameters.AddWithValue("@Username", p.Username);
cmd.Parameters.AddWithValue("@Status", p.Status);
cmd.Parameters.AddWithValue("@Chat", p.Chat);
cmd.ExecuteNonQuery();
}
}
catch (Exception e)
{
}
}
下面是我的问题:-我在"if(p.Status=="BANNED"){"处得到System.NullReferenceException。这段代码是否立即被调用,而不需要等待之前用函数中的MySQL数据创建Player对象?-函数可以同时调用,这样可以同时创建MySQL命令。-我想处理所有MySQL查询。不应跳过任何内容。
所以我想的是异步的,还是在处理新的MySQL查询之前等待的锁?
我刚开始学习C#,我发现这部分有点难,我该怎么解决。有人能帮我解决这些问题吗?或者甚至暗示我应该寻找什么?
提前谢谢!
如果id和username不一样,那就是问题所在。loadPlayerSQL中的SQL(字符串用户名)找不到您的用户,因为您传入的是id而不是用户名。