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

C#如何向MySQL的WHERE IN子句传入多GUID字符串?求助

问题:C#中MySQL WHERE IN子句传入多GUID参数无结果

我需要从C#应用读取MySQL数据库数据,不能用存储过程,只能在代码里写查询语句。通过Postman传入一组GUID格式的meetingIds:

{
   "meetingIds":[
      "9a4059c9-8c41-0afp-245e-9b9147bd5549",
      "b90oz505-9adb-ca9c-7791-5b9133bb7a1c",
      "9ghfc65b-1abb-88u6-8584-5e8p8af61050"
   ]
}

接收后我给每个ID加单引号拼接成字符串:

var singleQuote = "";
string stringOfIds = string.Join(", ", request.meetingIds.Select(x => singleQuote + x + singleQuote));

得到的字符串格式:

'9a4059c9-8c41-0afp-245e-9b9147bd5549', 'b90oz505-9adb-ca9c-7791-5b9133bb7a1c', '9ghfc65b-1abb-88u6-8584-5e8p8af61050'

把这个字符串作为参数传入WHERE IN子句时查询无结果,但单个ID传入能正常返回数据。查询语句如下:

MySqlCommand cmd = new MySqlCommand(
@"select     u.user_id          as userId,
             u.first_name       as firstName,
             u.last_name        as lastName,
             u.date_inserted    as dateModified, 
             u.campaign         as campaignId, 
             u.status           as status, 
             from meetings u
             where m.id in (@meetingIds);", conn);

cmd.Parameters.AddWithValue("@meetingIds", meetingIds);

我知道这样有SQL注入风险,但找不到其他实现方式,而且当前方案还不工作,求建议。


解决方案

问题根源

你现在的写法是把拼接好的字符串作为单个参数传入,MySQL会把整个字符串当成一个完整值去匹配,而不是解析成多个独立ID,所以查不到结果。另外原SQL里还有语法错误:表别名是u,但WHERE子句里写的是m.id,这也会导致查询异常。

正确实现方式(无SQL注入风险)

不要手动拼接带引号的字符串,而是为每个ID创建独立参数:

  1. 生成对应数量的参数名(比如@id0, @id1, @id2)
  2. 将参数名列表嵌入IN子句
  3. 逐个为参数绑定ID值

代码示例:

// 为每个ID生成唯一参数名
var parameterNames = request.meetingIds.Select((_, index) => $"@id{index}").ToArray();
// 拼接IN子句的参数部分
var inClause = string.Join(", ", parameterNames);

// 构造正确的SQL语句(修正表别名错误)
var sql = $@"select     u.user_id          as userId,
             u.first_name       as firstName,
             u.last_name        as lastName,
             u.date_inserted    as dateModified, 
             u.campaign         as campaignId, 
             u.status           as status
             from meetings u
             where u.id in ({inClause});";

MySqlCommand cmd = new MySqlCommand(sql, conn);

// 逐个绑定参数值
for (int i = 0; i < request.meetingIds.Length; i++)
{
    cmd.Parameters.AddWithValue($"@id{i}", request.meetingIds[i]);
}

// 执行查询并处理结果
// ...

额外注意点

  • 这种方式完全避免SQL注入,因为每个ID都是独立参数,MySQL会自动处理值的转义
  • 如果meetingIds数量超过1000个,MySQL的IN子句会有长度限制,这时可以考虑分批查询或者使用临时表
  • 务必确保表别名和字段引用一致,避免出现类似原SQL中m.id的错误

内容的提问来源于stack exchange,提问作者sosNiLa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:50:29