gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:07 25 4
gpt4 key购买 nike

下面的 C# 代码是不言自明的。我想通过 WebMatrix.Data.Database.Query 将 DataTable 作为表值参数传递给 SQL Server 2008 中的存储过程,但在下面的 c# 代码的最后一行(即 appDatabase.Query)中抛出异常

"The table type parameter '0' must have a valid type name."

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。我只是在我的 Controller 中使用这个命名空间在我的 MVC4 应用程序中进行数据库交互。

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

最佳答案

根据 the documentation您必须使用 SqlParameterTypeName 属性为表值参数指定类型名称。 WebMatrix.Data.Database 助手不提供 API 来指定参数的任何方面(参数值除外)。它不是为与存储过程一起使用而设计的——它最初是为与纯 SQL 一起使用而设计的。因此,您别无选择,只能在此实例中使用纯 ADO.NET,这样您就可以自己设置 SqlParameter 的所需属性。

关于c# - 如何通过 Webmatrix.Data.Database.Query 将表值参数传递给存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14931289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com