首页 > 解决方案 > C#中的SQL多值参数

问题描述

这就是我所拥有的:

 select *
 from AuditQuestionnaires
 where Companyid = @companyid 
   and RiskTypeID != @RiskIdList[x];

为什么我不能添加这样的参数:

command2.Parameters.Add(new SqlParameter("RiskIdList[x]", RiskIdList[x]));

我正在使用 SQL Server,这是我在 .cs 文件中使用的脚本

标签: c#sqlsql-server

解决方案


首先,由于您使用的是 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)

推荐阅读