如何通过Webmatrix.Data.Database.Query将表值参数传递给存储过程
下面的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应用程序中进行数据库交互。
急切地等待一些有专业知识的人的指导。提前致谢。
根据the documentation,您必须使用SqlParameter
的TypeName
属性为表值参数指定类型名称。 WebMatrix.Data.Database
帮助程序不提供用于指定参数的任何方面的API,除了它的值。它没有被设计用于存储过程 - 它最初设计只用于纯SQL。因此,除了在此实例中使用纯ADO.NET,您别无选择,因此您可以自己设置SqlParameter
的必需属性。
非常抱歉,在回复和赞赏您的回复方面出现延迟。由于你的回答明确表明Webmatrix不能用于表值参数,我通过设置'SqlParameter.SqlDbType = SqlDbType.Structured返回使用'System.Data.SqlClient.SqlCommand'和'System.Data.SqlClient.SqlParameter' '使用表值参数时。完美地工作。再次感谢你从迈克到迈克。 – Michael 2013-11-29 12:24:35