如何通过Webmatrix.Data.Database.Query将表值参数传递给存储过程

时间:2013-02-18 07:22:09

标签: c# sql-server-2008 webmatrix table-valued-parameters

下面的c#代码是不言自明的。我想通过WebMatrix.Data.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中的类型/用户定义表类型

这是存储过程(仅添加相关部分以显示我已将正确的类型分配给@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应用程序中进行数据库交互。

急切地等待有专业知识的人的指导。非常感谢。

1 个答案:

答案 0 :(得分:1)

根据the documentation,您必须使用TypeName的{​​{1}}属性为表值参数指定类型名称。 SqlParameter帮助程序不提供用于指定参数除其值之外的任何方面的API。它并非设计用于存储过程 - 它最初设计为仅与纯SQL一起使用。因此,除了在此实例中使用普通ADO.NET之外别无其他选择,因此您可以自己设置WebMatrix.Data.Database所需的属性。