为什么我的 ASP.NET MVC 5 ActionResult 中的 C# 循环会抛出此错误消息

问题描述 投票:0回答:2

我的代码:

int total = Convert.ToInt32(form["REC-tr-total"]); 
int value = 0;
string insValOutput = ""; 

if (total > 0)
{
  for (int i = 1; i <= total; i++) 
  {
    value = Convert.ToInt32(form["inventoryID[" + i + "]"]); 
    insValOutput = $"(" + vCAS_capture_payments.Id + ", value{i + 1}),"; 
  }

db.Database.ExecuteSqlCommand(String.Format(@"INSERT INTO dbo.VCAS_capture_payments__REF_items (FK_capture_paymentsId, FK_inventoryId)                 VALUES {0};", insValOutput));             
}

错误信息:

enter image description here

这似乎是一个非常简单的循环,但错误不断出现......专家请指教。

更新:对于那些询问的人,我已更新此行如下:

insValOutput = String.Format(@"({0},{1}),", vCAS_capture_payments.Id, value);  // (1, value1),(2, value2) ...

但我得到了相同的结果。

更新2号

感谢大家的评论,真的很感激。我知道代码不是最好的,但我一直在努力解决如何在我当前的代码库中通过 LinQ 和实体框架最好地实现多重插入。

但是,根据提供的答案,我可以按如下方式修改代码,这是有效的。

罪魁祸首是 SQL 语句和连接。

int total = Convert.ToInt32(form["REC-tr-total"]); // -- Total Receipt item rows
int value = 0;
string insValOutput = ""; // -- Insert VALUES variable

if (total > 0)
{
    for (int i = 1; i <= total; i++)
    {
        value = Convert.ToInt32(form["inventoryID["+i+"]"]); // -- Fetch the inventory ID for index i   
        insValOutput += String.Format(@"({0},{1}),", vCAS_capture_payments.Id, value);  // (1, value1),(2, value2) ...
    }

    db.Database.ExecuteSqlCommand(String.Format(@"
                    INSERT INTO dbo.VCAS_capture_payments__REF_items (FK_capture_paymentsId, FK_inventoryId)
                    VALUES {0};", insValOutput.TrimEnd(',', ' ')));
}
c# asp.net-mvc-5
2个回答
2
投票

看起来您正在尝试构建传递给插入语句的值列表。 您希望结果为 Values (itemA1, itemA2), (itemB2, itemB2), ... 如果这是不正确的,则答案的其余部分可能不相关。

错误出现在构建此集合的行中:

insValOutput = $"(" + vCAS_capture_payments.Id + ", value{i + 1}),";

您在构建值集合的条件中存在一些问题......

第一个问题是你只会有 1 个(itema、itemb)集合,因为你没有附加到 insValOutput 变量。 实际上,每次执行循环时都会覆盖它。

第二个是,一旦清除“{”的错误,您将收到逗号错误,因为您在文本末尾添加了逗号,而最后一个元素需要省略逗号。

第三个是您现在收到的具体错误。

insValOutput = $"(" + vCAS_capture_payments.Id + ", value{i + 1}),";

当前,您实际上将字符串“value{i + 1}”放入 insValOutput 中,错误表明大括号语法不正确。

我想你正在寻找的是这个:

insValOutput += $"({vCAS_capture_payments.Id}, {value}),"

但即使纠正了这一点,您仍然会遇到上述问题。 另外,它看起来很丑陋,找到一种不混合字符串插值和连接“+”的方法。

您应该重新审视如何构建此 Values 集合,然后您应该捕获您传递的整个语句,以便双方都可以校对它,然后在 SMS 会话中执行它以检查错误。

正如其他人所指出的,这也不是在应用程序中构建查询的好方法。 您绝对应该考虑重构您的代码以及它如何构建查询。


1
投票

试试这个:

int total = Convert.ToInt32(form["REC-tr-total"]); 
int value = 0;
string insValOutput = ""; 

if (total > 0)
    {
        List<string> valuesList = new List<string>();
        
        for (int i = 1; i <= total; i++) 
        {
            value = Convert.ToInt32(form["inventoryID[" + i + "]"]); 
            valuesList.Add($"({vCAS_capture_payments.Id}, {value})"); 
        }
    
        insValOutput = string.Join(", ", valuesList);
    
        db.Database.ExecuteSqlCommand(
            string.Format(@"INSERT INTO dbo.VCAS_capture_payments__REF_items 
                            (FK_capture_paymentsId, FK_inventoryId) 
                            VALUES {0};", insValOutput));             
    }
© www.soinside.com 2019 - 2024. All rights reserved.