MySQL语法错误求助:InsertGuildShare方法执行SQL插入失败
问题原因
- 保留关键字未转义:
Rank是MySQL的保留关键字,作为字段名直接使用会触发语法错误,必须用反引号(`)包裹。 - 引号使用混乱:
- 整型字段
Rank、FamilyID被错误添加单引号,MySQL会将其识别为字符串,导致类型不匹配+语法错误; - 字符串字段
RoleName、FamilyName错误使用反引号(反引号用于包裹数据库对象名,如表、字段),字符串值应该用单引号(')包裹。
- 整型字段
- SQL注入风险:直接拼接字符串生成SQL语句,不仅容易引发语法错误,还存在严重的安全漏洞。
修复方案
临时语法修复(仅解决报错,仍有注入风险)
修改SQL拼接语句,修正引号和关键字转义:
string cmdText = "Insert into t_guildshare(RoleID,Share,GuildID,RoleName,`Rank`,FamilyID,FamilyName) VALUES (" + RoleID + "," + Share + "," + GuildID + ",'" + RoleName + "'," + Rank + "," + FamilyID + ",'" + FamilyName + "')";
- 给
Rank字段添加反引号 - 移除
Rank、FamilyID的单引号 - 将
RoleName、FamilyName的反引号替换为单引号
推荐方案:参数化查询(彻底解决语法+注入问题)
参数化查询是数据库操作的标准方式,自动处理类型转换和标识符转义,同时避免SQL注入:
public bool InsertGuildShare(string RoleName, int RoleID, double Share, int GuildID, int Rank, int FamilyID, string FamilyName) { MySQLConnection conn = null; try { conn = this._Database.DBConns.PopDBConnection(); // 参数化SQL模板 string cmdText = "Insert into t_guildshare(RoleID,Share,GuildID,RoleName,`Rank`,FamilyID,FamilyName) VALUES (@RoleID, @Share, @GuildID, @RoleName, @Rank, @FamilyID, @FamilyName)"; MySQLCommand cmd = new MySQLCommand(cmdText, conn); // 绑定参数,自动处理类型和转义 cmd.Parameters.AddWithValue("@RoleID", RoleID); cmd.Parameters.AddWithValue("@Share", Share); cmd.Parameters.AddWithValue("@GuildID", GuildID); cmd.Parameters.AddWithValue("@RoleName", RoleName); cmd.Parameters.AddWithValue("@Rank", Rank); cmd.Parameters.AddWithValue("@FamilyID", FamilyID); cmd.Parameters.AddWithValue("@FamilyName", FamilyName); cmd.ExecuteNonQuery(); GameDBManager.SystemServerSQLEvents.AddEvent(string.Format("+SQL: {0}", cmdText), EventLevels.Important); cmd.Dispose(); return true; } catch (Exception ex) { LogManager.WriteLog(LogTypes.Guild, "BUG :" + ex.ToString()); return false; } finally { if (null != conn) { this._Database.DBConns.PushDBConnection(conn); } } }
验证说明
修复后执行的SQL会自动转为正确格式:
Insert into t_guildshare(RoleID,Share,GuildID,RoleName,`Rank`,FamilyID,FamilyName) VALUES (202591,2.58,100035,'A_The_LamSao',10,2,'NoMercy')
此时Rank字段被正确转义,各字段值的类型和引号匹配,语法错误将被解决。
内容的提问来源于stack exchange,提问作者Duy Đen
相关产品推荐
相关产品推荐

