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

时间:2016-12-07 15:16:17

标签: c# sql-server stored-procedures ado.net sqlhelper

我有一个这样的SQL表:

Table

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

我想从项目中传递Topic对象并通过SqlHelper执行此存储过程。

我阅读了许多帖子,例如this并在SQL Server中创建了User-Defind Table,我测试了这段代码:

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(...)中有错误;

Error

如果有人可以解释这个问题的解决方案,那将非常有用。

2 个答案:

答案 0 :(得分:0)

尝试传递以下主题参数:

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());

您还需要修改存储过程。

答案 1 :(得分:0)

您需要传递一个DataTable作为参数 例子

SqlHelper.ExecuteNonQuery(constr, "addTopic", new SqlParameter("@Topic", TopicDatatable));

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