using子句中的C#Foreach值

本文关键字:C#Foreach 子句 using | 更新日期: 2023-09-27 18:20:21

我试图使用foreach控件循环遍历字符串数组,然后使用每个值在数据库中插入信息。有人能帮我理解为什么在using子句中我不能使用foreach变量吗?

string[] ship_ids = ShipsInScope.Split('|');
foreach (string ship_id in ship_ids)
{
     using (SqlCommand InsertCommand = new SqlCommand("insert into PROJECT_SHIP (CR_Number, Ship_Id) VALUES (@CR_Number, @CCF_Number)", DBConn))
    {
         InsertCommand.Parameters.Add("@CR_Number", SqlDbType.NVarChar, 10).Value = CRNumber;
         InsertCommand.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10).Value = Ship_Id;
         InsertCommand.ExecuteNonQuery();
         InsertCommand.Dispose();
    }
}

using子句中的C#Foreach值

C#区分大小写。您的迭代变量是ship_id,但您正试图在循环中使用Ship_Id

理想情况下,使用C#命名约定(对于其他变量也是如此):

// Declared outside the method.
private const string InsertSql = 
    "insert into PROJECT_SHIP (CR_Number, Ship_Id) " +
    "VALUES (@CR_Number, @CCF_Number)";
...
string[] shipIds = ShipsInScope.Split('|');
foreach (string shipId in shipIds)
{
    using (SqlCommand command = new SqlCommand(InsertSql, connection))
    {
        command.Parameters.Add("@CR_Number", SqlDbType.NVarChar, 10)
                          .Value = crNumber; // Unclear what this means
        command.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10)
                          .Value = shipId;
        command.ExecuteNonQuery();
    }
}

注:

  • 已将常量SQL提取为类级常量。没有必要,但可能会澄清问题
  • 将所有变量重命名为不带下划线的camelCase
  • StackOverflow的换行符-您的代码中可能不需要那么多换行
  • 删除了对Dispose的冗余显式调用(因为using语句已经调用Dispose)

您使用的是Ship_id而不是ship_id。C#区分大小写。

string[] ship_ids = ShipsInScope.Split('|');
foreach (string ship_id in ship_ids)
{
     using (SqlCommand InsertCommand = new SqlCommand("insert into PROJECT_SHIP (CR_Number, Ship_Id) VALUES (@CR_Number, @CCF_Number)", DBConn))
    {
         InsertCommand.Parameters.Add("@CR_Number", SqlDbType.NVarChar, 10).Value = CRNumber;
         InsertCommand.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10).Value = ship_Id;
         InsertCommand.ExecuteNonQuery();
    }
}

此外,using块最终将在InsertCommand上调用Dispose——using语句就是这样做的。无需自己致电Dispose

如果您使用的是using语句,则不需要调用Dispose()方法,它在内部调用,并且参数的名称不同,在sql语句中为@CCF_Number,在parameters部分为@Ship_Id

您将"ship_id"变量名大写:

             InsertCommand.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10).Value = Ship_Id

根据到目前为止的答案和注释,您可以按如下方式重新构建代码:

const string sql = @"
    INSERT INTO PROJECT_SHIP (CR_Number, Ship_Id) 
    VALUES (@CR_Number, @Ship_Id)";
using (SqlCommand InsertCommand = new SqlCommand(sql, DBConn))
{
    var parameters = InsertCommand.Parameters;
    var crNumberParameter = parameters.Add("@CR_Number", SqlDbType.NVarChar, 10); 
    var shipIdParameter = parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10);
    string[] ship_ids = ShipsInScope.Split('|');
    foreach (string ship_id in ship_ids)
    {
        crNumberParameter.Value = CRNumber;
        shipIdParameter.Value = ship_id;
        InsertCommand.ExecuteNonQuery();
    }
}

另一方面,

而不是在这么多操作中向SQLServer发送10000个Insert命令

当您可以创建一个脚本,在一个操作中添加整个集合时。

认为它更有效。