将空列表或空值绑定到存储过程(.net)上的表值参数

Bri*_*nes 60 .net stored-procedures sql-server-2008 table-valued-parameters

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

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

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

System.NotSupportedException:不支持参数'@MainItemIdList'的DBNull值.表值参数不能是DBNull.

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

Dan*_*idy 84

诀窍是:根本不传递参数.表值参数的默认值是空表.

很遗憾,异常消息是如此无益.

  • 添加新答案或改进答案永远不会伤害.这些信息仍然相关,其他人会发现它很有用(这就是本网站的重点!).+1 (8认同)

Nop*_*pey 5

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

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

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