使用子句中的C#Foreach值?

时间:2012-01-16 13:04:14

标签: c# visual-web-developer-2010

我正在尝试使用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();
    }
}

6 个答案:

答案 0 :(得分:6)

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)

答案 1 :(得分:3)

您使用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数据块最终会在Dispose上调用InsertCommand - 这就是using语句的作用。无需亲自致电Dispose

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您将“ship_id”变量名称大写:

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

另一方面,

而不是在如此多的操作中向SQLServer发送10000个Insert命令

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

认为它更有效。