2017-05-08 130 views
-2

我目前工作的地方我一直在問下列要求在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(記錄) - >,< - 值(記錄)」; –

回答

0

首先,我將如何構建您的代碼。

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

剛剛看到你的答案...是的,你是對的...應該選擇那個。 –

0

當你這樣做:

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

你「揍」無論是Command之前,所以你永遠不會在任何地方實際的查詢是什麼規定。這就是爲什麼它給你例外 - 你從字面上給它沒有查詢運行。

需要注意的是這一行:

SqlCommand Command = new SqlCommand(Query, Connection); 

目前是沒有任何區別。

+0

感謝您通知我這件事。我會做出一些改變,並希望它能解決我的問題。 –

相關問題