我已经创建了一个存储过程,它接受一个表值参数,该参数是一个只有一列的int
类型的表。其思想是简单地将is列表传递到存储过程中,并允许存储过程处理数据。然而,在没有数据要传递的情况下,我遇到了问题(当我有数据时,事情就会正常工作)。我正在将List<int>
转换为IEnumerable<SqlDataRecord>
,并将其绑定到存储过程的表值参数。我试图绑定一个空的List<SqlDataRecord>
,这导致了这个错误:
System.ArgumentException: SqlDataRecord枚举中没有记录。若要发送不带行的表值参数,请对该值使用null引用。
然后,我尝试绑定一个空值(我认为这就是上面的消息所指的),但这只会导致不同的错误消息
System.NotSupportedException:不支持参数'@MainItemIdList‘的DBNull值。表值参数不能为DBNull。
似乎不能在存储过程声明中将表值参数声明为可空。将空列表绑定到表值参数的正确方法是什么?
发布于 2011-05-24 16:52:59
诀窍是:在所有的中,都不会传入参数。表值参数的默认值是空表。
遗憾的是,异常消息是如此无用。
发布于 2017-07-21 15:41:56
我被“不传递参数”这句话的意思搞糊涂了。最终对实体框架ExecuteSqlCommandAsync()起作用的是:
new SqlParameter("yourParameterName", SqlDbType.Structured)
{
Direction = ParameterDirection.Input,
TypeName = "yourUdtType",
Value = null
};
这会将参数作为'default‘传递。
发布于 2019-01-19 06:22:39
不传递值确实可以使用,但是在有多个表值参数要传递到过程中的情况下就不行了。我解决这个问题的方法是在查询字符串中指定一个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找到了解决这个问题的方法。
https://stackoverflow.com/questions/3630632
复制相似问题