2017-08-09 110 views
0

我有如下所示的对象列表。使用存储过程将对象列表保存到单独的表中

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; 
} 

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

感谢

+0

您是否尝试调试您的项目?你的SP只是插入一个只有一个“字段名称”的记录,最多为15个字符。 –

+0

是的。我正在为我的对象获得正确的值。但我不知道如何将@XHotelInfoDetails插入到我的存储过程中以保存数据。 –

+0

创建一个单独的SP来保存一个'Hotel'并使用一个循环来保存每个(在一个事务中) –

回答

0

当使用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<List>以一次插入一个。

+0

我不知道你是如何构建这个'_sqlHelper.SqlSpExecute' –

+0

其实这不是我正在寻找的。我的存储过程正常工作。但我不知道如何将对象列表添加到该列表中。这就是我的问题 –

+0

试图检查这个'_sqlHelper.SqlSpExecute'你的存储过程的样子。 –