C# 通过SqlHelper将对象参数传递给存储过程

C# 通过SqlHelper将对象参数传递给存储过程,c#,sql-server,stored-procedures,ado.net,sqlhelper,C#,Sql Server,Stored Procedures,Ado.net,Sqlhelper,我有这样一个SQL表: public class Topic { public int ModuleID { get; set; } public string Name { get; set; } public string BodyHTML { get; set; } } ID是标识列 我在ASP.Net项目中为这个表设置了一个类,如下所示: public class Topic { public i

我有这样一个SQL表:

public class Topic
    {
        public int ModuleID { get; set; }
        public string Name { get; set; }
        public string BodyHTML { get; set; }
    }

ID
是标识列

我在ASP.Net项目中为这个表设置了一个类,如下所示:

public class Topic
    {
        public int ModuleID { get; set; }
        public string Name { get; set; }
        public string BodyHTML { get; set; }
    }
我还有一个存储过程:

ALTER PROCEDURE [dbo].[addTopic] 
    @Topic dbo.Topic READONLY
AS
BEGIN
    insert into OnlineHelp_Topic
    select * from @Topic
END
我想从项目中传递一个
主题
对象,并通过SqlHelper执行此存储过程

我阅读了许多类似帖子,并在SQL Server中创建了一个
用户定义表
,我测试了以下代码:

Topic Topic = new Topic()
            {
                BodyHTML = "test body",
                ModuleID = 1000,
                Name = "test"
            };
string constr = ConfigurationManager.ConnectionStrings["testConnection"].ConnectionString;
int rowsAffected = SqlHelper.ExecuteNonQuery(constr, "addTopic", new SqlParameter("@Topic", Topic));
但是这段代码在
SqlHelper.ExecuteNonQuery(…)
中有这样的错误


如果有人能解释这个问题的解决方案,那将非常有帮助。

尝试传递如下主题参数:

List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@ModuleID ", topic.ModuleID ));
parameters.Add(new SqlParameter("@Name", topic.Name));
parameters.Add(new SqlParameter("@BodyHTML", topic.BodyHTML));
int rowsAffected = SqlHelper.ExecuteNonQuery(constr, "addTopic", parameters.ToArray());
List参数=新列表();
添加(新的SqlParameter(“@ModuleID”,topic.ModuleID));
parameters.Add(新的SqlParameter(“@Name”,topic.Name));
Add(新的SqlParameter(“@BodyHTML”,topic.BodyHTML));
int rowsAffected=SqlHelper.ExecuteNonQuery(constr,“addTopic”,parameters.ToArray());

您还需要修改存储过程。

尝试传递如下主题参数:

List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@ModuleID ", topic.ModuleID ));
parameters.Add(new SqlParameter("@Name", topic.Name));
parameters.Add(new SqlParameter("@BodyHTML", topic.BodyHTML));
int rowsAffected = SqlHelper.ExecuteNonQuery(constr, "addTopic", parameters.ToArray());
List参数=新列表();
添加(新的SqlParameter(“@ModuleID”,topic.ModuleID));
parameters.Add(新的SqlParameter(“@Name”,topic.Name));
Add(新的SqlParameter(“@BodyHTML”,topic.BodyHTML));
int rowsAffected=SqlHelper.ExecuteNonQuery(constr,“addTopic”,parameters.ToArray());

您还需要修改存储过程。

您需要将数据表作为参数传递 范例


DataTable必须具有相同的列:用户定义表类型的名称和数据类型。

您需要将DataTable作为参数传递 范例


DataTable必须具有相同的列:用户定义表类型的名称和数据类型。

错误是什么?我不熟悉
SqlHelper
,但我认为您需要在
DataTable
或至少某种类型的集合中传递UDT数据。还有一种方法可以告诉它查询类型是存储过程。@Mahdi我添加了错误。看看这个问题,它可能会给你一些提示:。。。基本上,您需要创建list对象,以便从SPX查询它。错误是什么?我不熟悉
SqlHelper
,但我认为您需要在
DataTable
或至少某种类型的集合中传递UDT数据。还有一种方法可以告诉它查询类型是存储过程。@Mahdi我添加了错误。看看这个问题,它可能会给你一些提示:。。。基本上,您需要创建list对象,以便从sp查询它