1

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

6 回答 6

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)
于 2012-01-16T13:05:52.920 回答
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自己打电话。

于 2012-01-16T13:06:51.453 回答
2

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

于 2012-01-16T13:09:23.607 回答
1

您将“ship_id”变量名大写:

             InsertCommand.Parameters.Add("@Ship_Id", SqlDbType.NVarChar, 10).Value = Ship_Id
于 2012-01-16T13:07:17.710 回答
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();
    }
}
于 2012-01-16T13:25:13.053 回答
0

另一个注意事项,

而不是在这么多操作中向 SQLServer 发送 10000 条插入命令

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

认为它更有效。

于 2012-01-16T13:18:45.100 回答