Foreach循环在使用块内部与在外部使用不同?

时间:2019-03-27 14:35:29

标签: c#

我正在尝试用C#完成一个项目,我想知道为什么这两个代码的行为不同。

我正在尝试使用字符串中的值填充数据库。 我的代码的第一个版本有效,但第二个版本则无效。

foreach (var Line in Lines)
{
    string[] SplittedLine = Line.Split(Spliter);

    using (SqlCeConnection Connection = new SqlCeConnection(ConnectionString))
    {
        Connection.Open();
        SqlCeCommand Command = new SqlCeCommand(
          @"INSERT INTO Localitati(Nume) VALUES (@Nume)", 
            Connection);

        Command.Parameters.AddWithValue(@"Nume", SplittedLine[0]);
        Command.ExecuteNonQuery();
     }
}
using (var Connection = new SqlCeConnection(ConnectionString))
{
    Connection.Open();

    foreach (var Line in Lines)
    {
        string[] SplittedLine = Line.Split(Spliter);
        MessageBox.Show(SplittedLine[0]);
        var Command = new SqlCeCommand(
          @"INSERT INTO Localitati(Nume) VALUES (@Nume)", 
            Connection);
        Command.Parameters.AddWithValue(@"Nume", SplittedLine[0]);
    }

}

2 个答案:

答案 0 :(得分:7)

您在第二个变量中忘记了Command.ExecuteNonQuery();

因此,该操作永远不会提交到数据库。

答案 1 :(得分:0)

循环中执行查询时,请尝试使其尽可能短:将所有声明移出循环,并保留参数聚集和查询执行

代码:

using (var Connection = new SqlCeConnection(ConnectionString)) {
  Connection.Open();

  string sql = 
     @"INSERT INTO Localitati(Nume) 
            VALUES (@Nume)";

  using (SqlCeCommand Command = new SqlCeCommand(sql, Connection)) {
    Command.Parameters.Add("@Nume", SqlDbType.VarChar); //TODO: provide RDBMS type here

    foreach (var Line in Lines) {
      // Assign parameter(s)...
      Command.Parameters["@Nume"].Value = Line.Substring(0, Line.IndexOf(Spliter));
      // ... and execute query
      Command.ExecuteNonQuery();
    }   
  }
}