Foreach循环在使用块内部工作方式不同于外部?

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

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

}
c#
2个回答
7
投票

你在第二个版本中忘记了Command.ExecuteNonQuery();。 因此,操作永远不会提交给数据库。


0
投票

在循环中执行查询时,尽量使其尽可能短:将所有声明移出循环并保留参数aggignments和查询执行

码:

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();
    }   
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.