代码之家  ›  专栏  ›  技术社区  ›  Michael

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

  •  2
  • Michael  · 技术社区  · 11 年前

    下面的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中的“类型/用户定义的表类型”下

    这是存储的proc(仅添加相关部分以表明我已为@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交互。

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

    1 回复  |  直到 11 年前
        1
  •  1
  •   Mike Brind    11 年前

    根据 the documentation 必须使用为表值参数指定类型名称 TypeName 财产 SqlParameter 这个 WebMatrix.Data.Database helper不提供API来指定参数的任何方面(除了其值)。它并不是为与存储过程一起使用而设计的,它最初是为仅与普通SQL一起使用而开发的。因此,您别无选择,只能在此实例中使用纯ADO.NET,以便设置 SQL参数 你自己