65

我创建了一个存储过程,它采用表值参数,该参数是具有单列类型的表int。这个想法是简单地将 id 列表传递给存储过程,并允许存储过程处理数据。但是,在没有数据传入的情况下,我遇到了问题(当我有数据时事情正常)。我正在将 a 转换为 a List<int>IEnumerable<SqlDataRecord>并将其绑定到存储过程的表值参数。我试图绑定一个空的List<SqlDataRecord>,这导致了错误:

System.ArgumentException:SqlDataRecord 枚举中没有记录。要发送不带行的表值参数,请改用空值引用。

然后我尝试绑定一个空值(我认为这是上面的消息所得到的),但这只会导致不同的错误消息

System.NotSupportedException:不支持参数“@MainItemIdList”的 DBNull 值。表值参数不能为 DBNull。

您似乎不能在存储过程声明中将表值参数声明为可为空。将空列表绑定到表值参数的正确方法是什么?

4

4 回答 4

92

诀窍是:根本不要传入参数。表值参数的默认值为空表。

很遗憾,异常消息如此无用。

于 2011-05-24T08:52:59.467 回答
6

我对“不传递参数”语句的含义感到有些困惑。最终为实体框架 ExecuteSqlCommandAsync() 工作的是:

  new SqlParameter("yourParameterName", SqlDbType.Structured)
  {
      Direction = ParameterDirection.Input,
      TypeName = "yourUdtType",
      Value = null
  };

这会将参数作为“默认”传递。

于 2017-07-21T07:41:55.517 回答
3

不传递值确实有效,但在我有多个表值参数要传递到过程中的情况下则不行。我如何解决它是DEFAULT在我的查询字符串中指定一个值。例如,

string sqlQuery = "[dbo].[GetOrderData] @QueueId";

if (OrderIdList.Any())
{
    sqlQuery = sqlQuery + ", @OrderIdList";
}
else
{
    sqlQuery = sqlQuery + ", DEFAULT";
}

if (RegionIdList.Any())
{
    sqlQuery = sqlQuery + ", @RegionIdList";
}
else
{
    sqlQuery = sqlQuery + ", DEFAULT";
}

感谢http://www.sommarskog.se/arrays-in-sql-2008.html#Invoking我在这里找到了解决方案。

于 2019-01-18T22:22:39.173 回答
0

传递一个空时我收到错误,IEnumerable<int>但是当我传递一个空时它工作正常List<int>

于 2017-08-23T12:34:47.787 回答