如何通过Webmatrix.Database.Query将表值参数传递给存储过程
本文关键字:参数传递 存储过程 何通过 Webmatrix Database Query | 更新日期: 2023-09-27 17:59:45
下面的c#代码不言自明。我想通过WebMatrix.Database.Query将DataTable作为表值参数传递给SQL Server 2008中的存储过程,但在下面c#代码的最后一行(即appDatabase.Query)中,抛出了一个异常
"表类型参数"0"必须具有有效的类型名称。"
public JsonResult GetUserListForRoles(int[] RoleIds)
{
using (Database appDatabase = Database.Open("DefaultConnection"))
{
DataTable roleIdsTable = new DataTable();
roleIdsTable.Columns.Add("RoleId", typeof(int));
foreach(int role in RoleIds)
{
roleIdsTable.Rows.Add(role);
}
List<UserNameIdModel> userNameIdModelList = new List<UserNameIdModel>();
var userNameIdList = appDatabase.Query("EXEC dbo.sp_GetUserListForRoles @roleIdsList=@0", roleIdsTable);
在数据库中,我使用TSQL的这一位创建了一个用户定义的表类型
CREATE TYPE dbo.RoleIdsList AS TABLE (RoleId int)
它执行得很好,并显示在SQL Server Management Studio 中的Types/User Defined Table Type下
这是存储的过程(只添加相关部分以表明我已为@roleIdsList参数分配了正确的类型,并将其标记为READONLY,这是表值参数所必需的)
ALTER PROCEDURE [dbo].[sp_GetUserListForRoles]
-- Add the parameters for the stored procedure here
@roleIdsList dbo.RoleIdsList READONLY
我做了大量的搜索,但找不到处理WebMatrix.Data.Database的解决方案…我找到的所有解决方案都涉及SqlCommand和SqlParameter。我已经在我的应用程序中使用了WebMatrix.Data.Database,需要保持一致。
请注意:我不使用WebMatrix IDE。我只是在控制器中使用这个名称空间,以便在MVC4应用程序中进行DB交互。
急切地等待着有专业知识的人的指导。提前非常感谢。
根据文档,必须使用SqlParameter
的TypeName
属性为表值参数指定类型名称。WebMatrix.Data.Database
助手不提供API来指定参数的除值以外的任何方面。它并不是为与存储过程一起使用而设计的,它最初只是为仅与普通SQL一起使用而被设计的。因此,您别无选择,只能在此实例中使用纯ADO.NET,这样您就可以自己设置SqlParameter
所需的属性。