如何使用C#Foreach循环将记录插入数据库?

问题描述:

我目前工作的地方我一直在问下列要求在WPF工作项目:如何使用C#Foreach循环将记录插入数据库?

  1. 允许用户能够在一个堆叠面板
  2. 保存添加更多的文本框在 在每个文本作为新记录用户输入(如串/ nvarchar的)数据库

这背后的想法是,如果我们收到多个包,每票货物通常分成多个位置,我们” d需要位于每个组件所在的位置。

我已经在下面包含了我的代码样本,它的准系统可能不仅仅是将要插入的'Records'字段。我将RecordID字段设置为身份字段,因此我不担心声明ID字段。它不包含在示例中,但每条记录都链接到ShipmentID。

我会很感激,因为我一直有实现它的麻烦(和已经碰了壁与我的研究)作为我的代码任何帮助跑入:

“System.InvalidOperationException”发生在System.Data .dll'与CommandText属性未初始化错误,当我尝试我尝试保存记录。不幸的是,我发现只有一些模糊的小技巧可以解决我的问题(或者我在研究中很糟糕)。

private void StackAddTB(object sender, RoutedEventArgs e) 
    { 
     TextBox NewBox = new TextBox() { Margin = new Thickness(0, 10, 0, 0), Width = 100, Height = 20 }; 
     StackBoxes.Children.Add(NewBox); 
    } 

    private void SaveMulti(object sender, RoutedEventArgs e) 
    { 
     string CStr = Manifesting.Properties.Settings.Default.PSIOpsSurfaceCS; 
     SqlConnection Connection = new SqlConnection(CStr); 
     string Query = "INSERT INTO TestLoop (Record), Values (Record)"; 
     SqlCommand Command = new SqlCommand(Query, Connection) 

     foreach (TextBox TestTB in StackBoxes.Children.OfType<TextBox>()) 
     { 
      try 
      { 
       Connection.Open(); 
       Command = Connection.CreateCommand(); 
       Command.Parameters.AddWithValue("@Record", TestTB.Text); 
       Command.ExecuteNonQuery(); 
      } 
      catch (SqlException ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
      finally 
      { 
       Connection.Close(); 
      } 
     } 

编辑:我已经通过通过文本框问题循环检查(按照先生红魔评论),虽然我已经找到了一些东西从其他岗位有用它不细讲如何这些值保存在数据库中。

+2

[Loop Through Textboxes](http://stackoverflow.com/questions/4863051/loop-through-textboxes) –

+0

而不是'Connection.Open()'和所有其他所需的连接代码使用SqlConnection对象的实例'SqlConnection.Open();'你也应该在循环之前打开连接,然后用'using()'语句包装你的连接,你不必手动关闭它。 – prospector

+0

额外的逗号。字符串查询=“INSERT INTO TestLoop(记录) - >,

首先,我将如何构建您的代码。

private void SaveMulti(object sender, RoutedEventArgs e) 
    { 
     string CStr = Manifesting.Properties.Settings.Default.PSIOpsSurfaceCS; 
     string Query = "INSERT INTO TestLoop (Record) Values (@Record)"; 
     string Record = StackBoxes.Children.OfType<TextBox>().ToString(); 

     using(var conn = new SqlConnection(CStr)) 
     { 
      foreach (TextBox TestTB in StackBoxes.Children.OfType<TextBox>()) 
      { 
       using(var cmd = new SqlCommand(Query, conn)) 
       { 
        try 
        { 
         //Removed as pointed out by EJoshuaS 
         //cmd = conn.CreateCommand(); 
         cmd.Parameters.AddWithValue("@Record", TestTB.Text); 
         cmd.ExecuteNonQuery(); 
        } 
        catch (SqlException ex) 
        { 
         MessageBox.Show(ex.ToString()); 
        } 
       } 
      } 
     } 
    } 

接下来,这条线的目的是什么?

string Record = StackBoxes.Children.OfType<TextBox>().ToString(); 
+0

我并不坐在IDE的前面,但我认为这与OP的原始代码具有完全相同的问题。 – EJoshuaS

+1

@EJoshuaS请注意他们打开和关闭连接但重新使用该命令的事实。他在录制前还缺少@,因此没有“cmd.Parameters.AddWithValue(”@ Record“,TestTB.Text)参数;”线。 –

+0

刚刚看到你的答案...是的,你是对的...应该选择那个。 –

当你这样做:

Command = Connection.CreateCommand(); 
    Command.Parameters.AddWithValue("@Record", TestTB.Text); 
    Command.ExecuteNonQuery(); 

你“揍”无论是Command之前,所以你永远不会在任何地方实际的查询是什么规定。这就是为什么它给你例外 - 你从字面上给它没有查询运行。

需要注意的是这一行:

SqlCommand Command = new SqlCommand(Query, Connection); 

目前是没有任何区别。

+0

感谢您通知我这件事。我会做出一些改变,并希望它能解决我的问题。 –