c# - C#中的SQL多值参数
问题描述
这就是我所拥有的:
select *
from AuditQuestionnaires
where Companyid = @companyid
and RiskTypeID != @RiskIdList[x];
为什么我不能添加这样的参数:
command2.Parameters.Add(new SqlParameter("RiskIdList[x]", RiskIdList[x]));
我正在使用 SQL Server,这是我在 .cs 文件中使用的脚本
解决方案
首先,由于您使用的是 SQL Server,因此您不能有一个名为 @RiskTypeId[x] 的参数。它根本不是一个有效的名称。
其次,当从 c# 传递参数时,参数名称必须包含初始的“@”。
第三,作为一般规则,构造包含 DataType 的 SQLParameter 要好得多。这意味着不需要猜测,而且猜测偶尔会出错。
第四,在我看来,你想遍历一个数组。没有什么可以阻止你在 c# 中这样做。您只需像这样创建一个 SqlParameter
command2.Parameters.Add(new SqlParameter { ParameterName = "@RiskTypeId", DBType = DBType.Int32, Value = RiskIDList[x] });
但是我怀疑你真正想做的是向 SQL Server 发送一个列表。为此,您需要使用User-Defined Table Type
. 在您的情况下,以下内容就足够了:
CREATE TYPE [dbo].[IdList] AS TABLE ([Id] int);
然后你可以为你的查询定义一个参数:
@RiskTypeIdList IdList READONLY
最后,您必须将数组的内容放入 DataTable。因为这是我经常做的事情,所以我有一个适合这项工作的课程:
public class TDataTable<int> : DataTable
{
public TDataTable(IEnumerable<T> ids) : base()
{
Columns.Add("Id", typeof(T));
var added = new HashSet<T>();
foreach (T id in ids)
{
//ensure unique values
if (added.Add(id))
{
Rows.Add(id);
}
}
}
public TDataTable() : base()
{
Columns.Add("Id", typeof(T));
}
}
然后,您可以像这样传递参数:
command2.Parameters.Add(new SqlParameter { ParameterName = "@RiskTypeIdList", SqlDBType = SqlDBType.Structured, Value = new TDataTable<int>(RiskIDList) });
然后,在您的 SQL 中,您可以执行 Thorsten 建议的操作:
WHERE RiskTypeId NOT IN (SELECT Id FROM @RiskTypeIdList)
推荐阅读
- flutter - Rxdart CombineLatest 与可选字段相结合
- python - 如何在python 3中计算拉普拉斯函数
- python - 缺少值时如何旋转和重命名连接的级别列?
- postgresql - 在 Postgresql 中,相同的词对相同的查询给出真假
- asp.net-mvc - 限制(阻止)用户在 ASP.Net MVC 中使用相同的凭据多次登录
- django - 如何预先填写数据库中已经存在的表单字段中的值并交付部分表单或获取剩余的输入
- c# - 在使用 HtmlSanitizer C# 进行消毒时允许模型中的与号 (&)
- swift - 快速语言中的 ctrl
- javascript - 在javascript中将数据从控制器插入数组
- java - 无法选择下拉选项