2016-08-22 47 views
0

我创建一个系统,它允许用户输入文本框控件10点的数据,然后一起保存在数据库中。但是,这个错误让我有一段时间的股票,我不知道我哪里错了。有人可以帮助我吗?请善待并提前致谢。也随时编辑我的问题。错误:需要的ExecuteNonQuery开放和可用的连接

这里是我的代码:

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    DateTime getdate = DateTime.Now; 
    String time = getdate.ToString("F"); 
    try 
    { 
     con.Open(); 
     var rows = new[] 
     { 
      new {Item = txtItem.Text, Product = txtProduct.Text, Quantity = txtQuantity.Text}, 
      new {Item = txtItem2.Text, Product = txtProduct2.Text, Quantity = txtQuantity2.Text}, 
      new {Item = txtItem3.Text, Product = txtProduct3.Text, Quantity = txtQuantity3.Text}, 
      new {Item = txtItem4.Text, Product = txtProduct4.Text, Quantity = txtQuantity4.Text}, 
      new {Item = txtItem5.Text, Product = txtProduct5.Text, Quantity = txtQuantity5.Text}, 
      new {Item = txtItem6.Text, Product = txtProduct6.Text, Quantity = txtQuantity6.Text}, 
      new {Item = txtItem7.Text, Product = txtProduct7.Text, Quantity = txtQuantity7.Text}, 
      new {Item = txtItem8.Text, Product = txtProduct8.Text, Quantity = txtQuantity8.Text}, 
      new {Item = txtItem9.Text, Product = txtProduct9.Text, Quantity = txtQuantity9.Text}, 
      new {Item = txtItem10.Text, Product = txtProduct10.Text, Quantity = txtQuantity10.Text} 
     }; 

     foreach (var row in rows)//Check if ItemCode exist 
     { 
      if (!String.IsNullOrEmpty(row.Item)) 
      { 
       OleDbCommand command = new OleDbCommand(@"Select * from TblInventory where ItemCode='" + txtItem.Text + "'"); 
       command.Connection = con; 
       command.Parameters.AddWithValue("itemcode", txtItem.Text); 
       OleDbDataReader reader = command.ExecuteReader(); 

       if (reader.Read()) 
       { 
        OleDbCommand cmd = new OleDbCommand(@"Update TblInventory set Quantity = Quantity + @Quantity WHERE ItemCode = @itemcode"); 

        cmd.Connection = con; 
        cmd.Parameters.AddWithValue("@Quantity", Convert.ToInt32(txtQuantity.Text)); 
        txtProduct.Text = reader["ProductName"].ToString(); 
        cmd.Parameters.AddWithValue("@itemcode", txtItem.Text); 
        cmd.Parameters.AddWithValue("@DateAndTime", time); 
        cmd.ExecuteNonQuery();// HERE <<< 
        MessageBox.Show("You added " + txtQuantity.Text + " " + txtProduct.Text, "Existing Item"); 
       } 
      } 
      else //Add new Data if Item Code is not exit; 
      { 
       var rows2 = new[] 
       { 
        new {Item = txtItem.Text, Product = txtProduct.Text, Quantity = txtQuantity.Text}, 
        new {Item = txtItem2.Text, Product = txtProduct2.Text, Quantity = txtQuantity2.Text}, 
        new {Item = txtItem3.Text, Product = txtProduct3.Text, Quantity = txtQuantity3.Text}, 
        new {Item = txtItem4.Text, Product = txtProduct4.Text, Quantity = txtQuantity4.Text}, 
        new {Item = txtItem5.Text, Product = txtProduct5.Text, Quantity = txtQuantity5.Text}, 
        new {Item = txtItem6.Text, Product = txtProduct6.Text, Quantity = txtQuantity6.Text}, 
        new {Item = txtItem7.Text, Product = txtProduct7.Text, Quantity = txtQuantity7.Text}, 
        new {Item = txtItem8.Text, Product = txtProduct8.Text, Quantity = txtQuantity8.Text}, 
        new {Item = txtItem9.Text, Product = txtProduct9.Text, Quantity = txtQuantity9.Text}, 
        new {Item = txtItem10.Text, Product = txtProduct10.Text, Quantity = txtQuantity10.Text} 
       }; 

       foreach (var row2 in rows) 
       { 
        if (!String.IsNullOrEmpty(row2.Item) && !String.IsNullOrEmpty(row2.Product) && !String.IsNullOrEmpty(row2.Quantity)) 
        { 
         OleDbCommand cmdInsert = new OleDbCommand(
           @"insert into TblInventory (ItemCode,ProductName,Quantity,DateAndTime)values(@ItemCode,@ProductName,@Quantity,@DateAndTime)"); 
         cmdInsert.Connection = con; 
         cmdInsert.Parameters.AddWithValue("ItemCode", row2.Item); 
         cmdInsert.Parameters.AddWithValue("ProductName", row2.Product); 
         cmdInsert.Parameters.AddWithValue("Quantity", row2.Quantity.ToString()); 
         cmdInsert.Parameters.AddWithValue("DateAndTime", DateTime.Now); 

         cmdInsert.ExecuteNonQuery(); HERE <<< 
         MessageBox.Show("You added " + row.Quantity + " " + row.Product, "New Item"); 
        } 
       } 
      } 
      showGrid2(); 
      con.Close(); 
      clear(); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 
+0

该行中显示出了错误?我的意思是哪个'ExecuteNonQuery' –

+0

这两个命令都显示错误先生。在''Update Condition''上,MessageBox显示在错误在'else condition'上弹出之前,没有消息框只显示错误。 –

回答

0

这是我第一次回答一个问题,这样下去容易对我,如果我误解的东西。

从我所看到的,在某个点cmdInsert.ExecuteNonQuery();被称为之后con.Close();在您的foreach循环中。 由于每次迭代满足if子句时都会调用con.Close();

也许尝试这样的事:

editted


private void btnAdd_Click(object sender, EventArgs e) 
     { 
      DateTime getdate = DateTime.Now; 
      String time = getdate.ToString("F"); 
      try 
      { 

       var rows = new[] 
       { 
        new {Item = txtItem.Text, Product = txtProduct.Text, Quantity = txtQuantity.Text}, 
        new {Item = txtItem2.Text, Product = txtProduct2.Text, Quantity = txtQuantity2.Text}, 
        new {Item = txtItem3.Text, Product = txtProduct3.Text, Quantity = txtQuantity3.Text}, 
        new {Item = txtItem4.Text, Product = txtProduct4.Text, Quantity = txtQuantity4.Text}, 
        new {Item = txtItem5.Text, Product = txtProduct5.Text, Quantity = txtQuantity5.Text}, 
        new {Item = txtItem6.Text, Product = txtProduct6.Text, Quantity = txtQuantity6.Text}, 
        new {Item = txtItem7.Text, Product = txtProduct7.Text, Quantity = txtQuantity7.Text}, 
        new {Item = txtItem8.Text, Product = txtProduct8.Text, Quantity = txtQuantity8.Text}, 
        new {Item = txtItem9.Text, Product = txtProduct9.Text, Quantity = txtQuantity9.Text}, 
        new {Item = txtItem10.Text, Product = txtProduct10.Text, Quantity = txtQuantity10.Text} 
       }; 
       foreach (var row in rows)//Check if ItemCode exist 
       { 
        con.Open(); 
        if (!String.IsNullOrEmpty(row.Item)) 
        { 
         OleDbCommand command = new OleDbCommand(@"Select * from TblInventory where ItemCode='" + txtItem.Text + "'"); 
         command.Connection = con; 
         command.Parameters.AddWithValue("itemcode", txtItem.Text); 
         OleDbDataReader reader = command.ExecuteReader(); 

         if (reader.Read()) 
         { 
          OleDbCommand cmd = new OleDbCommand(@"Update TblInventory set Quantity = Quantity + @Quantity WHERE ItemCode = @itemcode"); 

          cmd.Connection = con; 
          cmd.Parameters.AddWithValue("@Quantity", Convert.ToInt32(txtQuantity.Text)); 
          txtProduct.Text = reader["ProductName"].ToString(); 
          cmd.Parameters.AddWithValue("@itemcode", txtItem.Text); 
          cmd.Parameters.AddWithValue("@DateAndTime", time); 
          cmd.ExecuteNonQuery();// HERE 
          MessageBox.Show("You added " + txtQuantity.Text + " " + txtProduct.Text, "Existing Item"); 
         } 
        } 
        else //Add new Data if Item Code is not exit; 
        { 
         var rows2 = new[] 
         { 
          new {Item = txtItem.Text, Product = txtProduct.Text, Quantity = txtQuantity.Text}, 
          new {Item = txtItem2.Text, Product = txtProduct2.Text, Quantity = txtQuantity2.Text}, 
          new {Item = txtItem3.Text, Product = txtProduct3.Text, Quantity = txtQuantity3.Text}, 
          new {Item = txtItem4.Text, Product = txtProduct4.Text, Quantity = txtQuantity4.Text}, 
          new {Item = txtItem5.Text, Product = txtProduct5.Text, Quantity = txtQuantity5.Text}, 
          new {Item = txtItem6.Text, Product = txtProduct6.Text, Quantity = txtQuantity6.Text}, 
          new {Item = txtItem7.Text, Product = txtProduct7.Text, Quantity = txtQuantity7.Text}, 
          new {Item = txtItem8.Text, Product = txtProduct8.Text, Quantity = txtQuantity8.Text}, 
          new {Item = txtItem9.Text, Product = txtProduct9.Text, Quantity = txtQuantity9.Text}, 
          new {Item = txtItem10.Text, Product = txtProduct10.Text, Quantity = txtQuantity10.Text} 
         }; 
         foreach (var row2 in rows) 
         { 
          if (!String.IsNullOrEmpty(row2.Item) && !String.IsNullOrEmpty(row2.Product) && !String.IsNullOrEmpty(row2.Quantity)) 
          { 
           OleDbCommand cmdInsert = new OleDbCommand(
               @"insert into TblInventory (ItemCode,ProductName,Quantity,DateAndTime)values(@ItemCode,@ProductName,@Quantity,@DateAndTime)"); 
           cmdInsert.Connection = con; 
           cmdInsert.Parameters.AddWithValue("ItemCode", row2.Item); 
           cmdInsert.Parameters.AddWithValue("ProductName", row2.Product); 
           cmdInsert.Parameters.AddWithValue("Quantity", row2.Quantity.ToString()); 
           cmdInsert.Parameters.AddWithValue("DateAndTime", DateTime.Now); 

           cmdInsert.ExecuteNonQuery(); HERE 
           MessageBox.Show("You added " + row.Quantity + " " + row.Product, "New Item"); 
          } 
         } 
        } 
        showGrid2(); 
        clear(); 
        con.Close(); 
       } 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
+0

我很欣赏先生的回应。当我按照你所说的话,这个错误告诉连接没有关闭。可能是因为con.open在try catch语句的开头初始化 –

+0

尝试新编辑的代码,我错过了更大的foreach循环,con.Close();应该在那之外。 –

+0

先生@Keyur错误仍然告知''连接不close'' –

0

使用使用打开连接,它会自动处理connection.So闭幕的最佳和高效的做法是打开尽可能晚的连接并尽快关闭。

foreach (var row in rows)//Check if ItemCode exist 
        { 

          if (!String.IsNullOrEmpty(row.Item)) 
          { 
           OleDbCommand command = new OleDbCommand(@"Select * from TblInventory where ItemCode='" + txtItem.Text + "'"); 
           using (command.Connection = con) 
           { 
           command.Parameters.AddWithValue("itemcode", txtItem.Text); 
           con.open; 
           OleDbDataReader reader = command.ExecuteReader(); 

           if (reader.Read()) 
           { 
            OleDbCommand cmd = new OleDbCommand(@"Update TblInventory set Quantity = Quantity + @Quantity WHERE ItemCode = @itemcode"); 

            cmd.Connection = con; 
            cmd.Parameters.AddWithValue("@Quantity", Convert.ToInt32(txtQuantity.Text)); 
            txtProduct.Text = reader["ProductName"].ToString(); 
            cmd.Parameters.AddWithValue("@itemcode", txtItem.Text); 
            cmd.Parameters.AddWithValue("@DateAndTime", time); 
            cmd.ExecuteNonQuery();// HERE 
            MessageBox.Show("You added " + txtQuantity.Text + " " + txtProduct.Text, "Existing Item"); 
           } 
           } 

        } 
      } 
    //dont use con.Close anywhere in the code .  
相关问题