diff --git a/FunGame.Server/Controllers/DataRequestController.cs b/FunGame.Server/Controllers/DataRequestController.cs index 5fef652..457b430 100644 --- a/FunGame.Server/Controllers/DataRequestController.cs +++ b/FunGame.Server/Controllers/DataRequestController.cs @@ -217,11 +217,11 @@ namespace Milimoe.FunGame.Server.Controller } if (roomid != "-1" && SQLHelper != null) { - SQLHelper.Execute(RoomQuery.Insert_CreateRoom(roomid, user.Id, type, gamemodule, gamemap, isrank, password, maxusers)); + SQLHelper.Execute(RoomQuery.Insert_CreateRoom(SQLHelper, roomid, user.Id, type, gamemodule, gamemap, isrank, password, maxusers)); if (SQLHelper.Result == SQLResult.Success) { ServerHelper.WriteLine("[CreateRoom] Master: " + user.Username + " RoomID: " + roomid); - SQLHelper.ExecuteDataSet(RoomQuery.Select_IsExistRoom(roomid)); + SQLHelper.ExecuteDataSet(RoomQuery.Select_IsExistRoom(SQLHelper, roomid)); if (SQLHelper.Result == SQLResult.Success && SQLHelper.DataSet.Tables[0].Rows.Count > 0) { room = Factory.GetRoom(SQLHelper.DataSet.Tables[0].Rows[0], user); @@ -283,7 +283,7 @@ namespace Milimoe.FunGame.Server.Controller { if (SQLHelper != null) { - SQLHelper.ExecuteDataSet(RoomQuery.Select_IsExistRoom(roomid)); + SQLHelper.ExecuteDataSet(RoomQuery.Select_IsExistRoom(SQLHelper, roomid)); if (SQLHelper.Success) { Config.RoomList.IntoRoom(roomid, Server.User); @@ -535,7 +535,7 @@ namespace Milimoe.FunGame.Server.Controller if (verifycode.Trim() == "") { // 先检查账号是否重复 - SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistUsername(username)); + SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistUsername(SQLHelper, username)); if (SQLHelper.Result == SQLResult.Success) { ServerHelper.WriteLine(Server.GetClientName() + " 账号已被注册"); @@ -545,7 +545,7 @@ namespace Milimoe.FunGame.Server.Controller else { // 检查邮箱是否重复 - SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistEmail(email)); + SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistEmail(SQLHelper, email)); if (SQLHelper.Result == SQLResult.Success) { ServerHelper.WriteLine(Server.GetClientName() + " 邮箱已被注册"); @@ -555,7 +555,7 @@ namespace Milimoe.FunGame.Server.Controller else { // 检查验证码是否发送过 - SQLHelper.ExecuteDataSet(RegVerifyCodes.Select_HasSentRegVerifyCode(username, email)); + SQLHelper.ExecuteDataSet(RegVerifyCodes.Select_HasSentRegVerifyCode(SQLHelper, username, email)); if (SQLHelper.Result == SQLResult.Success) { DateTime RegTime = (DateTime)SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime]; @@ -570,9 +570,9 @@ namespace Milimoe.FunGame.Server.Controller { // 发送验证码,需要先删除之前过期的验证码 SQLHelper.NewTransaction(); - SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(username, email)); + SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(SQLHelper, username, email)); _regVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6); - SQLHelper.Execute(RegVerifyCodes.Insert_RegVerifyCode(username, email, _regVerify)); + SQLHelper.Execute(RegVerifyCodes.Insert_RegVerifyCode(SQLHelper, username, email, _regVerify)); if (SQLHelper.Result == SQLResult.Success) { SQLHelper.Commit(); @@ -607,7 +607,7 @@ namespace Milimoe.FunGame.Server.Controller else { // 先检查验证码 - SQLHelper.ExecuteDataSet(RegVerifyCodes.Select_RegVerifyCode(username, email, verifycode)); + SQLHelper.ExecuteDataSet(RegVerifyCodes.Select_RegVerifyCode(SQLHelper, username, email, verifycode)); if (SQLHelper.Result == SQLResult.Success) { // 检查验证码是否过期 @@ -616,7 +616,7 @@ namespace Milimoe.FunGame.Server.Controller { ServerHelper.WriteLine(Server.GetClientName() + " 验证码已过期"); msg = "此验证码已过期,请重新注册。"; - SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(username, email)); + SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(SQLHelper, username, email)); } else { @@ -625,12 +625,12 @@ namespace Milimoe.FunGame.Server.Controller { SQLHelper.NewTransaction(); ServerHelper.WriteLine("[Reg] Username: " + username + " Email: " + email); - SQLHelper.Execute(UserQuery.Insert_Register(username, password, email, Server.Socket?.ClientIP ?? "")); + SQLHelper.Execute(UserQuery.Insert_Register(SQLHelper, username, password, email, Server.Socket?.ClientIP ?? "")); if (SQLHelper.Result == SQLResult.Success) { success = true; msg = "注册成功!请牢记您的账号与密码!"; - SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(username, email)); + SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(SQLHelper, username, email)); SQLHelper.Commit(); } else @@ -691,13 +691,13 @@ namespace Milimoe.FunGame.Server.Controller ServerHelper.WriteLine("[" + DataRequestSet.GetTypeString(DataRequestType.Login_Login) + "] Username: " + username); if (SQLHelper != null) { - SQLHelper.ExecuteDataSet(UserQuery.Select_Users_LoginQuery(username, password)); + SQLHelper.ExecuteDataSet(UserQuery.Select_Users_LoginQuery(SQLHelper, username, password)); if (SQLHelper.Result == SQLResult.Success) { DataSet dsUser = SQLHelper.DataSet; if (autokey.Trim() != "") { - SQLHelper.ExecuteDataSet(UserQuery.Select_CheckAutoKey(username, autokey)); + SQLHelper.ExecuteDataSet(UserQuery.Select_CheckAutoKey(SQLHelper, username, autokey)); if (SQLHelper.Result == SQLResult.Success) { ServerHelper.WriteLine("[" + DataRequestSet.GetTypeString(DataRequestType.Login_Login) + "] AutoKey: 已确认"); @@ -783,7 +783,7 @@ namespace Milimoe.FunGame.Server.Controller // 先检查验证码 if (SQLHelper != null) { - SQLHelper.ExecuteDataSet(ForgetVerifyCodes.Select_ForgetVerifyCode(username, email, verifycode)); + SQLHelper.ExecuteDataSet(ForgetVerifyCodes.Select_ForgetVerifyCode(SQLHelper, username, email, verifycode)); if (SQLHelper.Result == SQLResult.Success) { // 检查验证码是否过期 @@ -792,7 +792,7 @@ namespace Milimoe.FunGame.Server.Controller { ServerHelper.WriteLine(Server.GetClientName() + " 验证码已过期"); msg = "此验证码已过期,请重新找回密码。"; - SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(username, email)); + SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(SQLHelper, username, email)); } else { @@ -800,7 +800,7 @@ namespace Milimoe.FunGame.Server.Controller if (_forgetVerify.Equals(SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_ForgetVerifyCode])) { ServerHelper.WriteLine("[ForgerPassword] Username: " + username + " Email: " + email); - SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(username, email)); + SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(SQLHelper, username, email)); msg = ""; } else msg = "验证码不正确,请重新输入!"; @@ -814,7 +814,7 @@ namespace Milimoe.FunGame.Server.Controller // 检查账号和邮箱是否匹配 if (SQLHelper != null) { - SQLHelper.ExecuteDataSet(UserQuery.Select_CheckEmailWithUsername(username, email)); + SQLHelper.ExecuteDataSet(UserQuery.Select_CheckEmailWithUsername(SQLHelper, username, email)); if (SQLHelper.Result != SQLResult.Success) { msg = "此邮箱未绑定此账号,请重试!"; @@ -822,13 +822,13 @@ namespace Milimoe.FunGame.Server.Controller else { // 检查验证码是否发送过和是否过期 - SQLHelper.ExecuteDataSet(ForgetVerifyCodes.Select_HasSentForgetVerifyCode(username, email)); + SQLHelper.ExecuteDataSet(ForgetVerifyCodes.Select_HasSentForgetVerifyCode(SQLHelper, username, email)); if (SQLHelper.Result != SQLResult.Success || (DateTime.Now - ((DateTime)SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_SendTime])).TotalMinutes >= 10) { // 发送验证码,需要先删除之前过期的验证码 - SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(username, email)); + SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(SQLHelper, username, email)); _forgetVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6); - SQLHelper.Execute(ForgetVerifyCodes.Insert_ForgetVerifyCode(username, email, _forgetVerify)); + SQLHelper.Execute(ForgetVerifyCodes.Insert_ForgetVerifyCode(SQLHelper, username, email, _forgetVerify)); if (SQLHelper.Result == SQLResult.Success) { if (MailSender != null) @@ -885,7 +885,7 @@ namespace Milimoe.FunGame.Server.Controller string password = DataRequest.GetDictionaryJsonObject(requestData, UserQuery.Column_Password) ?? ""; if (username.Trim() != "" && password.Trim() != "") { - Server.SQLHelper?.Execute(UserQuery.Update_Password(username, password)); + SQLHelper?.Execute(UserQuery.Update_Password(SQLHelper, username, password)); if (SQLHelper?.Success ?? false) { // 更新成功返回空值 diff --git a/FunGame.Server/Models/ServerModel.cs b/FunGame.Server/Models/ServerModel.cs index 2b6d57e..04299e6 100644 --- a/FunGame.Server/Models/ServerModel.cs +++ b/FunGame.Server/Models/ServerModel.cs @@ -324,7 +324,7 @@ namespace Milimoe.FunGame.Server.Model { User NewMaster = users[0]; Room.RoomMaster = NewMaster; - SQLHelper?.Execute(RoomQuery.Update_QuitRoom(roomid, User.Id, NewMaster.Id)); + SQLHelper?.Execute(RoomQuery.Update_QuitRoom(SQLHelper, roomid, User.Id, NewMaster.Id)); this.InRoom = General.HallInstance; await UpdateRoomMaster(Room, true); result = true; @@ -332,7 +332,7 @@ namespace Milimoe.FunGame.Server.Model else // 没人了就解散房间 { Config.RoomList.RemoveRoom(roomid); - SQLHelper?.Execute(RoomQuery.Delete_QuitRoom(roomid, User.Id)); + SQLHelper?.Execute(RoomQuery.Delete_QuitRoom(SQLHelper, roomid, User.Id)); this.InRoom = General.HallInstance; ServerHelper.WriteLine("[ " + GetClientName() + " ] 解散了房间 " + roomid); result = true; @@ -399,7 +399,7 @@ namespace Milimoe.FunGame.Server.Model ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Username + " 已添加"); // 更新最后登录时间、IP地址 _loginTime = DateTime.Now.Ticks; - SQLHelper?.Execute(UserQuery.Update_CheckLogin(_username, Socket?.ClientIP.Split(':')[0] ?? "127.0.0.1")); + SQLHelper?.Execute(UserQuery.Update_CheckLogin(SQLHelper, _username, Socket?.ClientIP.Split(':')[0] ?? "127.0.0.1")); return true; } return false; @@ -411,7 +411,7 @@ namespace Milimoe.FunGame.Server.Model { _logoutTime = DateTime.Now.Ticks; int TotalMinutes = Convert.ToInt32((new DateTime(_logoutTime) - new DateTime(_loginTime)).TotalMinutes); - SQLHelper?.Execute(UserQuery.Update_GameTime(User.Username, TotalMinutes)); + SQLHelper?.Execute(UserQuery.Update_GameTime(SQLHelper, User.Username, TotalMinutes)); if (SQLHelper != null && SQLHelper.Result == SQLResult.Success) { ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Username + " 本次已游玩" + TotalMinutes + "分钟"); diff --git a/FunGame.Server/Others/FunGameSystem.cs b/FunGame.Server/Others/FunGameSystem.cs index 1d517e3..7a22f7b 100644 --- a/FunGame.Server/Others/FunGameSystem.cs +++ b/FunGame.Server/Others/FunGameSystem.cs @@ -186,7 +186,7 @@ namespace Milimoe.FunGame.Server.Others /// public static void ServerLogin(SQLHelper sqlHelper) { - sqlHelper.Execute(ServerLoginLogs.Insert_ServerLoginLogs(Config.ServerName, Config.ServerKey)); + sqlHelper.Execute(ServerLoginLogs.Insert_ServerLoginLogs(sqlHelper, Config.ServerName, Config.ServerKey)); } /// @@ -194,7 +194,7 @@ namespace Milimoe.FunGame.Server.Others /// public static void ClearRoomList(SQLHelper sqlHelper) { - sqlHelper.Execute(RoomQuery.Delete_Rooms()); + sqlHelper.Execute(RoomQuery.Delete_Rooms(sqlHelper)); } /// diff --git a/FunGame.Server/Utilities/MySQL/MySQLHelper.cs b/FunGame.Server/Utilities/MySQL/MySQLHelper.cs index f48ae18..0ae6ff2 100644 --- a/FunGame.Server/Utilities/MySQL/MySQLHelper.cs +++ b/FunGame.Server/Utilities/MySQL/MySQLHelper.cs @@ -16,6 +16,7 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility public override SQLServerInfo ServerInfo => _serverInfo ?? SQLServerInfo.Create(); public override int UpdateRows => _updateRows; public override DataSet DataSet => _dataSet; + public override Dictionary Parameters { get; } = []; private readonly string _connectionString = ""; private MySqlConnection? _connection; @@ -90,11 +91,16 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility { NewTransaction(); } + OpenConnection(); Script = script; ServerHelper.WriteLine("SQLQuery -> " + script, InvokeMessageType.Api); using MySqlCommand command = new(script, _connection); command.CommandType = CommandType; + foreach (KeyValuePair param in Parameters) + { + command.Parameters.AddWithValue(param.Key, param.Value); + } if (_transaction != null) command.Transaction = _transaction; _updateRows = command.ExecuteNonQuery(); @@ -110,6 +116,7 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility finally { if (localTransaction) Close(); + Parameters.Clear(); } return UpdateRows; } @@ -138,6 +145,7 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility { NewTransaction(); } + OpenConnection(); Script = script; ServerHelper.WriteLine("SQLQuery -> " + script, InvokeMessageType.Api); @@ -146,6 +154,11 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility { CommandType = CommandType }; + foreach (KeyValuePair param in Parameters) + { + command.Parameters.AddWithValue(param.Key, param.Value); + } + if (_transaction != null) command.Transaction = _transaction; MySqlDataAdapter adapter = new() { @@ -155,6 +168,8 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility adapter.Fill(_dataSet); if (localTransaction) Commit(); + + _result = _dataSet.Tables.Cast().Any(table => table.Rows.Count > 0) ? SQLResult.Success : SQLResult.NotFound; } catch (Exception e) { @@ -165,6 +180,7 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility finally { if (localTransaction) Close(); + Parameters.Clear(); } return _dataSet; } diff --git a/FunGame.Server/Utilities/SQLite/SQLiteHelper.cs b/FunGame.Server/Utilities/SQLite/SQLiteHelper.cs index b4f8ea8..6e483aa 100644 --- a/FunGame.Server/Utilities/SQLite/SQLiteHelper.cs +++ b/FunGame.Server/Utilities/SQLite/SQLiteHelper.cs @@ -16,6 +16,7 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility public override SQLServerInfo ServerInfo => _serverInfo ?? SQLServerInfo.Create(); public override int UpdateRows => _updateRows; public override DataSet DataSet => _dataSet; + public override Dictionary Parameters { get; } = []; private readonly string _connectionString = ""; private SqliteConnection? _connection; @@ -88,11 +89,16 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility { NewTransaction(); } + OpenConnection(); Script = script; ServerHelper.WriteLine("SQLQuery -> " + script, InvokeMessageType.Api); using SqliteCommand command = new(script, _connection); command.CommandType = CommandType; + foreach (KeyValuePair param in Parameters) + { + command.Parameters.AddWithValue(param.Key, param.Value); + } if (_transaction != null) command.Transaction = _transaction; _updateRows = command.ExecuteNonQuery(); @@ -108,6 +114,7 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility finally { if (localTransaction) Close(); + Parameters.Clear(); } return UpdateRows; } @@ -126,7 +133,6 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility /// /// /// - /// public override DataSet ExecuteDataSet(string script) { bool localTransaction = _transaction == null; @@ -137,6 +143,7 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility { NewTransaction(); } + OpenConnection(); Script = script; ServerHelper.WriteLine("SQLQuery -> " + script, InvokeMessageType.Api); @@ -144,12 +151,24 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility { CommandType = CommandType }; + foreach (KeyValuePair param in Parameters) + { + command.Parameters.AddWithValue(param.Key, param.Value); + } + if (_transaction != null) command.Transaction = _transaction; + using SqliteDataReader reader = command.ExecuteReader(); _dataSet = new(); - DataTable table = new(); - table.Load(reader); - _dataSet.Tables.Add(table); + do + { + DataTable table = new(); + table.Load(reader); + _dataSet.Tables.Add(table); + } while (reader.NextResult()); + if (localTransaction) Commit(); + + _result = _dataSet.Tables.Cast().Any(table => table.Rows.Count > 0) ? SQLResult.Success : SQLResult.NotFound; } catch (Exception e) { @@ -160,6 +179,7 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility finally { if (localTransaction) Close(); + Parameters.Clear(); } return _dataSet; } @@ -179,7 +199,6 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility /// /// 提交事务 /// - /// public override void Commit() { try @@ -197,7 +216,6 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility /// /// 回滚事务 /// - /// public override void Rollback() { try diff --git a/FunGame.WebAPI/Controllers/UserController.cs b/FunGame.WebAPI/Controllers/UserController.cs index 96d2ceb..a8dffaf 100644 --- a/FunGame.WebAPI/Controllers/UserController.cs +++ b/FunGame.WebAPI/Controllers/UserController.cs @@ -39,7 +39,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers // 创建User对象 if (model.SQLHelper != null) { - model.SQLHelper.ExecuteDataSet(UserQuery.Select_Users_LoginQuery(username, password)); + model.SQLHelper.ExecuteDataSet(UserQuery.Select_Users_LoginQuery(model.SQLHelper, username, password)); Core.Entity.User user = Factory.GetUser(model.SQLHelper?.DataSet ?? new()); if (user.Id != 0) {