【问题标题】:How to pass multiple parameters from a loop to SQL Server Stored Procedure如何将多个参数从循环传递到 SQL Server 存储过程
【发布时间】:2017-07-19 01:37:13
【问题描述】:

我有这个 SQL Server 表(示例)

-----------------------------------------
|PartyRef|Level|Description|OtherColumns|
|--------+-----+-----------+------------|
|123ABCDE|3    |CASH ACCT  |OTHER DATA  |
|---------------------------------------|

我使用这个存储过程来显示数据:

ALTER PROCEDURE [dbo].[CRS_AMENDCOUNTERPARTY_VIEW](
    @PARTYREF NVARCHAR(50)=''
) WITH RECOMPILE
AS
BEGIN

CREATE TABLE #TempCRS
(
    p2kValue Varchar(50), 
    ColumnName Varchar(50)
)

INSERT INTO #TempCRS
    SELECT * 
    FROM
        (SELECT
             cast([PartyRef] AS VARCHAR(50)),
             cast([Level] AS VARCHAR(50)),
             cast([Description] AS VARCHAR(50)),
             cast([OtherColumns] AS VARCHAR(50))
         FROM
             [dbo].[tblParty] AS t
         WHERE 
             [PartyRef] = @PARTYREF) AS SourceTable
UNPIVOT
(
    p2kValue FOR ColumnName IN
    (      [PartyRef]
      ,[Level]
      ,[Description]
      ,[OtherColumns] )
) AS unpvt

输出如下:

-------------------------
|p2kValue  |ColumnName  |
|----------+------------|
|123ABCDE  |PartyRef    |
|3         |Level       |
|CASH ACCT |Description |
|OTHER DATA|OtherColumns|
-------------------------

现在,对于 MVC,我有这个模型类:

public class ViewPartyModels
{
   public string ColumnName { get; set; }
   public string p2kValue { get; set; }
}

控制器:

public ActionResult Index()
{
    var model = new List<ViewPartyModels>();

    try
    {
        con.Open();

        SqlCommand command = new SqlCommand("[dbo].[AMENDPARTY_VIEW]", con);
        command.CommandType = CommandType.StoredProcedure;

        command.Parameters.AddWithValue("@PARTYREF", Request.Params["Party"]);

        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                model.Add(new ViewCounterpartyDataModels()
                {
                    ColumnName = reader["ColumnName"].ToString(),
                    p2kValue = reader["p2kValue"].ToString()
                });
            }
        }

        con.Close();
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return View(model);
}

[HttpPost]
public ActionResult Update(ViewPartyModels obj, string Update)
{
    if (Request.Form["Update"] != null)
    {
        con.Open();

        SqlCommand command = new SqlCommand("[dbo].[AMENDPARTY_UPDATE]", con);
        command.CommandType = CommandType.StoredProcedure;

        //command.Parameters.AddWithValue(TO BE SOLVED);

        command.ExecuteReader();
        con.Close();
    }

    return View();
}

和视图:

@using (Html.BeginForm("Update", "AmendParty", FormMethod.Post)){
<table class="table table-hover">
<tbody>
@foreach (var item in Model)
{
<tr>
<td align="right"><b>@item.ColumnName</b></td>
<td colspan="2"><input type="text" value="@item.p2kValue" name="TxtBasicInfo" id="BasicInfoID"></td>
</tr>
<button type="submit" name="btnUpdate">Save</button>
}

有了上面的代码,我在MVC表单上显示数据就没有问题了。

我的问题是如何将 textbox 值从循环传递到更新函数的存储过程。

在我的实际程序中,我的表单中有 30 个textboxes,我知道在存储过程中声明 30 个变量并逐个传递数据效率不高。

要考虑的另一件事是如何将每个数据分配给其对应的列,因为基本上,它只是来自循环中的一个textbox

请帮帮我。非常感谢您。

【问题讨论】:

标签: c# sql-server asp.net-mvc razor model-view-controller


【解决方案1】:

我建议两个选项:

1) 如果所有参数都是字符串,用分隔符连接值(不存在于任何字符串中),将其传递给 SP 并在 SP 内拆分

2) 否则,填充一个表并将其传递给 SP (https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多