You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:20:59