【问题标题】:Save list of objects to a separate table by using stored procedure使用存储过程将对象列表保存到单独的表中
【发布时间】:2017-08-09 06:14:27
【问题描述】:

我有如下所示的对象列表的类。

public class Details
    {

        public string Reference { get; set; }

        public List<Hotel> HotelDetails { get; set; }
 }

我已经创建了存储过程来保存详细信息表的值。并且工作正常。以下是我的存储过程。

USE [UL_SLHEV]
GO
/****** Object:  StoredProcedure [dbo].[SP_EVoucherDetails_Insert]    Script Date: 8/9/2017 11:20:31 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[SP_Details_Insert]
    @XRequestReference varchar(15),
AS
BEGIN

    DECLARE @RequestReference AS VARCHAR(15) = ISNULL(@XRequestReference,'')


    INSERT INTO Voucher(
    RequestReference,
    )

    VALUES(
    @RequestReference,
    )

END

在这里,我必须以相同的保存方法和相同的存储过程将酒店详细信息列表保存在另一个表中。以下是我用来在表格中保存酒店详细信息的 C# 代码。

public EVoucherDetails SaveEVoucherDetails(EVoucherDetails detailsModel)
        {
            Func<SqlCommand, EVoucherDetails> injector = (cmd) =>
            {
                cmd.Parameters.Add("@XRequestReference", SqlDbType.VarChar).Value = detailsModel.RequestReference;

                var pList = new SqlParameter("@XHotelInfoDetails", SqlDbType.Structured);
                pList.TypeName = "dbo.HotelInfo";
                pList.Value = GetHotelList(detailsModel.HotelInfo, detailsModel.RequestReference);
                cmd.Parameters.Add(pList);

            };
            return _sqlHelper.SqlSpExecute("SP_Details_Insert", injector);
        }

 private List<SqlDataRecord> GetHotelList(List<HotelInfo> list, string RequestRef)
{
    List<SqlDataRecord> datatable = new List<SqlDataRecord>();

    SqlMetaData[] sqlMetaData = new SqlMetaData[11];
    sqlMetaData[0] = new SqlMetaData("HotelID", SqlDbType.Int);
    sqlMetaData[1] = new SqlMetaData("RequestReference", SqlDbType.VarChar, 15);
    sqlMetaData[2] = new SqlMetaData("FromDate", SqlDbType.DateTime);
    sqlMetaData[3] = new SqlMetaData("ToDate", SqlDbType.DateTime);
    sqlMetaData[4] = new SqlMetaData("Nights", SqlDbType.Int);
    sqlMetaData[5] = new SqlMetaData("MealPlan", SqlDbType.VarChar, 10);
    sqlMetaData[6] = new SqlMetaData("StarCategory", SqlDbType.Int);
    sqlMetaData[7] = new SqlMetaData("Status", SqlDbType.Int);
    sqlMetaData[8] = new SqlMetaData("LastUpdatedBy", SqlDbType.VarChar, 50);
    sqlMetaData[9] = new SqlMetaData("LastUpdatedDate", SqlDbType.DateTime);
    sqlMetaData[10] = new SqlMetaData("CreatedDateTime", SqlDbType.DateTime);
    sqlMetaData[10] = new SqlMetaData("CreatedUserId", SqlDbType.VarChar, 15);

    foreach (var info in list) {
        SqlDataRecord row = new SqlDataRecord(sqlMetaData);
        int? hotelId = GetHoteId(info.HotelName);
        row.SetValues(hotelId, RequestRef, info.FromDate, info.ToDate, info.Nights, info.MealPlan, info.StarCategory, info.Status, info.LastUpdatedBy, info.LastUpdatedDateTime, info.CreatedDateTime, info.CreatedUserId);
        datatable.Add(row);
    }

    return datatable;
}

我不知道如何使用上述相同的存储过程来获取酒店详细信息。有人可以帮我吗?

谢谢

【问题讨论】:

  • 您是否尝试过调试您的项目?您的 SP 只是插入一条只有一个 Field Name 的记录,最多 15 Character
  • 是的。我得到了我的对象的正确值。但我不知道如何将@XHotelInfoDetails 插入到我的存储过程中以保存数据。
  • 创建一个单独的 SP 来保存 Hotel 并使用循环来保存每个(在事务中)

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


【解决方案1】:

在 sql 中使用参数时,它看起来像:

  exec SP_Details_Insert "InputValueHere"

您有多个字段:

 sqlMetaData[0] = new SqlMetaData("HotelID", SqlDbType.Int);
    sqlMetaData[1] = new SqlMetaData("RequestReference", SqlDbType.VarChar, 15);
    sqlMetaData[2] = new SqlMetaData("FromDate", SqlDbType.DateTime);
    sqlMetaData[3] = new SqlMetaData("ToDate", SqlDbType.DateTime);
    sqlMetaData[4] = new SqlMetaData("Nights", SqlDbType.Int);
    sqlMetaData[5] = new SqlMetaData("MealPlan", SqlDbType.VarChar, 10);
    sqlMetaData[6] = new SqlMetaData("StarCategory", SqlDbType.Int);
    sqlMetaData[7] = new SqlMetaData("Status", SqlDbType.Int);
    sqlMetaData[8] = new SqlMetaData("LastUpdatedBy", SqlDbType.VarChar, 50);
    sqlMetaData[9] = new SqlMetaData("LastUpdatedDate", SqlDbType.DateTime);
    sqlMetaData[10] = new SqlMetaData("CreatedDateTime", SqlDbType.DateTime);
    sqlMetaData[10] = new SqlMetaData("CreatedUserId", SqlDbType.VarChar, 15);

现在如果你想Insert所有这些记录你的Stored Procedure不能处理这个数据因为它只使用一个参数值VALUES( @RequestReference, )

您需要在您的 SP 中拥有一个与您的数据相同的多个参数,并循环您的 data&lt;List&gt; 以一次将其全部插入。

【讨论】:

  • 我不知道你是如何构造这个_sqlHelper.SqlSpExecute
  • 其实这不是我要找的。我的存储过程工作正常。但我不知道如何将对象列表添加到该列表中。那是我的问题
  • 尝试检查这个_sqlHelper.SqlSpExecute 你的存储过程是什么样子的。
猜你喜欢
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多