gpt4 book ai didi

c# - 如何使用 IN sql 关键字构建参数化查询?

转载 作者:行者123 更新时间:2023-11-30 19:46:23 25 4
gpt4 key购买 nike

这就是我尝试过但失败了的:

      string sql = "... WHERE [personID] IN (@sqlIn) ...";
string sqlIn = "1,2,3,4,5";
SqlCeCommand cmd.Parameters.Add("@sqlIn", SqlDbType.NText).Value = sqlIn;

SqlCeDataAdapter da = new SqlCeDataAdapter(cmd);
da.Fill(ds); // > Error

错误详情:

The ntext and image data types cannot be used in WHERE, HAVING, GROUP BY, ON, or IN clauses, except when these data types are used with the LIKE or IS NULL predicates.

我不能将所有 ID 作为一个参数传递吗?我应该将所有 ID 一个一个地添加吗?

P.S: 注意SqlCE

最佳答案

您不能将其参数化为单个参数。您的查询正在对单个 值进行“输入”,因此本质上是:

... Where personId = '1,2,3,4,5'

(提供或接受参数)。这通常也是一个无效或次优等式测试,当然不是您要查询的内容。

选项;

  • 使用原始连接:通常涉及 SQL 注入(inject)风险,并允许糟糕的查询计划重用
  • 在完整的 SQL 服务器上:使用 UDF 拆分单个参数
  • 在完整的 SQL 服务器上,使用 TVP
  • 动态添加参数,将各种@param3等添加到TSQL中

最后一个是最可靠的,“dapper-dot-net”有一个内置的功能可以为你做这件事(因为它通常需要):

int[] ids = ...
var rows = conn.Query<SomeType>(
@"... Where Id in @ids",
new { ids }).ToList();

当通过 dapper-dot-net 运行时,将为“ids”中的每个项目添加一个参数,为其赋予正确的值等,并修复 SQL 以便其执行,例如:

"... Where Id in (@ids0, @ids1, @ids2)"

(如果“ids”中有 3 个项目)

关于c# - 如何使用 IN sql 关键字构建参数化查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8646475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com