2013-02-18 112 views
2

下面的c#代码是不言自明的。我想通过WebMatrix.Data.Database.Query将DataTable作为表值参数传递给SQL Server 2008中的存储过程,但在下面的c#代码的最后一行(即appDatabase.Query)中抛出异常如何通过Webmatrix.Data.Database.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 @[email protected]", roleIdsTable); 

在我已创建使用此位TSQL

CREATE TYPE dbo.RoleIdsList AS TABLE (RoleId int) 

它执行精细和下类型/用户定义的表型显示出来在SQL Server Management用户定义的表类型的数据库工作室

这是存储过程(仅添加相关部分以显示我已将正确类型分配给@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

根据the documentation,您必须使用SqlParameterTypeName属性为表值参数指定类型名称。 WebMatrix.Data.Database帮助程序不提供用于指定参数的任何方面的API,除了它的值。它没有被设计用于存储过程 - 它最初设计只用于纯SQL。因此,除了在此实例中使用纯ADO.NET,您别无选择,因此您可以自己设置SqlParameter的必需属性。

+0

非常抱歉,在回复和赞赏您的回复方面出现延迟。由于你的回答明确表明Webmatrix不能用于表值参数,我通过设置'SqlParameter.SqlDbType = SqlDbType.Structured返回使用'System.Data.SqlClient.SqlCommand'和'System.Data.SqlClient.SqlParameter' '使用表值参数时。完美地工作。再次感谢你从迈克到迈克。 – Michael 2013-11-29 12:24:35

相关问题