【问题标题】:How to pass C# class object as parameter to a stored procedure?如何将 C# 类对象作为参数传递给存储过程?
【发布时间】:2020-02-21 11:32:39
【问题描述】:

我有一个订单类 Orders.cs:

public class Orders
{
        public int OrderId { get; set; }
        public int PersonId { get; set; }
        public int EquipmentId { get; set; }
        public int OrderNumber { get; set; }
        public string OrderScope { get; set; }
}

上面这个Orders类和我的数据库Orders表完全一样。

我还有一个类,其中包含使用 ADO.NET 处理订单表的方法:

public class OrdersData
{
        public static int InsertOrder(Orders Order)
        {
            // Create the SQL Query for inserting a new order
            string sqlQuery = String.Format("Insert into Orders (OrderScope, PersonId , EquipmentId) Values('{0}', '{1}', '{2}');"
            + "Select @@Identity", Order.OrderScope, Order.PersonId, Order.EquipmentId);

            // Create and open a connection to SQL Server
            SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString);
            connection.Open();

            // Create a command object
            SqlCommand command = new SqlCommand(sqlQuery, connection);

            // Execute the command to SQL Server and return the newly created ID
            int newOrderID = Convert.ToInt32((decimal)command.ExecuteScalar());

            // Close and dispose
            command.Dispose();
            connection.Close();
            connection.Dispose();

            // Set return value
            return newOrderID;
        }
}

如您所见,InsertOrder 方法将Orders 对象作为参数。 现在我需要在我的数据库中创建一个存储过程,它插入一个新订单,如InsertOrder 方法。

我已经用谷歌搜索了这个,但我只能找到一些关于将多个参数传递给存储过程的教程,但这并不是我需要做的。

【问题讨论】:

  • 你用Dapper
  • 使用“低级”ADO.NET 和原始 SQL (SqlCommand),没有办法您可以将“对象”作为参数传递。 ORM 之类的 Dapper 或实体框架将允许这样做,因此您不必再处理在 ADO.NET/SQL 中设置所有单个值的所有细节。
  • @marc_s 好吧,从技术上讲,您可以将数据表或 IEnumerable<T> 作为表值参数传递,但这很愚蠢。

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


【解决方案1】:

在我们公司,我们使用的框架仅适用于传入和传出 SQL Server 数据库的对象。但是,这需要一个框架(我们基于 Pconsoft 库)将输入对象转换为存储过程参数,并将结果集转换为单个对象或对象集合。可能还有其他框架可以完成类似的任务。

但是,如果您只是尝试以有限的方式发送对象数据,您可以通过将对象序列化为 XML 并将其传递到读取和扩展该 XML 的 SQL 存储过程(作为参数)中来实现。您可以通过将 XML 转换为字符串并以这种方式传递它来做到这一点,但我们更喜欢将 .NET 中的数据转换为 SqlXml 数据类型,并在 SQL Server 的存储过程中将其作为 XML 数据类型参数接受.希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2012-03-30
    相关资源
    最近更新 更多