2

下面的 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 应用程序中进行数据库交互。

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

4

1 回答 1

1

根据文档TypeName,您必须使用 a 的属性为表值参数指定类型名称SqlParameterWebMatrix.Data.Database帮助程序不提供用于指定参数的任何方面的 API,除了它的值。它不是为存储过程而设计的——它最初是为仅与普通 SQL 一起使用而设计的。因此,您别无选择,只能在此实例中使用普通的 ADO.NET,这样您就可以SqlParameter自己设置所需的属性。

于 2013-02-18T08:02:51.620 回答