2017-03-11 15 views
0
Private Sub btnPurchaseSave_Click(sender As Object, e As EventArgs) Handles btnPurchaseSave.Click 
    Dim InvNo As Integer 
    Dim ItmName As String 
    Dim ItmType As String 
    Dim ItmQuantity As Double 
    Dim ItmPurPrice As Double 
    Dim itmTotalCost As Double 
    Dim DateFormat = "dd/MM/yyyy" 
    Dim InvTotal As Double 

    InvNo = CInt(txtInvoiceNo.Text) 
    InvTotal = TotalCost() 

    Dim InvDate = Format(CDate(txtInvoiceDate.Text), DateFormat) 

    ConnectDatabse() 

    If blnPurchNew = True Then 

     myConnection.Open() 
     ObjCommand.CommandText = "Insert into Invoice (Invoice_No,Invoice_Date,Supplier_Name,Invoice_Total) values (@Invoice_No, @Invoice_Date,@Supplier_Name,@Invoice_Name)" 
     ObjCommand.Connection = myConnection 
     ObjCommand.Parameters.AddWithValue("Invoice_No", InvNo) 
     ObjCommand.Parameters.AddWithValue("Invoice_Date", InvDate) 
     ObjCommand.Parameters.AddWithValue("Supplier_Name", txtSupplierName.Text) 
     ObjCommand.Parameters.AddWithValue("Invoice_Total", InvTotal) 

     ObjCommand.ExecuteNonQuery() 
     ObjCommand.Dispose() 

     ' Try 
     For i = 0 To DGPurchase.Rows.Count - 2 

      ObjCommand.CommandText = "Insert into Item_Invoice (Invoice_No,Item_Name,Item_Type,Item_Quantity,Item_Total_Cost,Item_Purchase_Price) values (@Invoice_No,@Item_Name,@item_Type, @Item_Quantity,@Item_Total_Cost,@Item_Purchase_Price)" 
      ObjCommand.Connection = myConnection 

      ItmName = DGPurchase.Rows(i).Cells(0).Value.ToString 
      ItmType = DGPurchase.Rows(i).Cells(1).Value.ToString 
      ItmQuantity = CDbl(DGPurchase.Rows(i).Cells(2).Value) 
      itmTotalCost = CDbl(DGPurchase.Rows(i).Cells(3).Value) 
      ItmPurPrice = CDbl(DGPurchase.Rows(i).Cells(4).Value) 

      ObjCommand.Parameters.AddWithValue("Invoice_No", InvNo) 
      ObjCommand.Parameters.AddWithValue("Item_Name", ItmName) 
      ObjCommand.Parameters.AddWithValue("Item_Type", ItmType) 
      ObjCommand.Parameters.AddWithValue("Item_Quantity", ItmQuantity) 
      ObjCommand.Parameters.AddWithValue("Item_Total_Cost", itmTotalCost) 
      ObjCommand.Parameters.AddWithValue("Item_Purchase_Price", ItmPurPrice) 
      ObjCommand.ExecuteNonQuery() 
      ObjCommand.Dispose() 

     Next i 

     ' Catch ex As Exception 

     'MsgBox(ex.Message) 
     ' End Try 
     MessageBox.Show("تم حفظ فاتوة المشتريات") 
     lblTotalCost.Text = " الاجمالي : " 
     clear() 
     blnPurchNew = False 

    Else 
     If blnPurchModify = True Then 

      myConnection.Open() 
      ObjCommand.CommandText = "UPDATE Invoice SET [email protected]_Date,[email protected]_Name,[email protected]_Total WHERE Invoice_No=" & CInt(txtInvoiceNo.Text) & " " 
      ObjCommand.Connection = myConnection 
      ObjCommand.Parameters.AddWithValue("Invoice_Date", InvDate) 
      ObjCommand.Parameters.AddWithValue("Supplier_Name", txtSupplierName.Text) 
      ObjCommand.Parameters.AddWithValue("Invoice_Total", InvTotal) 

      ObjCommand.ExecuteNonQuery() 
      ObjCommand.Dispose() 

      ' Try 
      For i = 0 To DGPurchase.Rows.Count - 2 

       ' ObjCommand.CommandText = "UPDATE Item_Invoice SET [email protected]_Name,[email protected]_Type, [email protected]_Quantity,[email protected]_Total_Cost,[email protected]_Purchase_Price WHERE [email protected]_NO" 
       ObjCommand.Connection = myConnection 
       ObjCommand.CommandText = "Update Item_Invoice Set [email protected]_Name Where [email protected]_No" 
       ItmName = DGPurchase.Rows(i).Cells(0).Value.ToString 
       ItmType = DGPurchase.Rows(i).Cells(1).Value.ToString 
       ItmQuantity = CDbl(DGPurchase.Rows(i).Cells(2).Value) 
       itmTotalCost = CDbl(DGPurchase.Rows(i).Cells(3).Value) 
       ItmPurPrice = CDbl(DGPurchase.Rows(i).Cells(4).Value) 

       ObjCommand.Parameters.AddWithValue("Invoice_No", InvNo) 
       ObjCommand.Parameters.AddWithValue("Item_Name", ItmName) 
       ObjCommand.Parameters.AddWithValue("Item_Type", ItmType) 
       ObjCommand.Parameters.AddWithValue("Item_Quantity", ItmQuantity) 
       ObjCommand.Parameters.AddWithValue("Item_Total_Cost", itmTotalCost) 
       ObjCommand.Parameters.AddWithValue("Item_Purchase_Price", ItmPurPrice) 
       ObjCommand.ExecuteNonQuery() 
       ObjCommand.Dispose() 

      Next i 



      MessageBox.Show("تم تعديل فاتوة المشتريات") 
      lblTotalCost.Text = " الاجمالي : " 
      clear() 
      blnPurchModify = False 
     End If 
    End If 

    myConnection.Close() 
    myConnection.Dispose() 
    ObjCommand.Dispose() 


End Sub 

両方のテーブルを保存して最初の "請求書"を更新​​することはできますが、アイテム請求書更新に関する2番目の部分の何が問題なのか分かりません。 私はエラーが発生していません。テーブルデータベースのデータが変更されずに更新の成功メッセージが表示されます。VB.NETはMSAccessデータベースのレコードを更新できません

申し訳ありませんが、長いコードのために、私はそれを明確にしたいと思いました。

ご協力いただきありがとうございます。

+0

わかりません。また、objCommand.Disposeの呼び出しは、objCommand – Steve

+0

を使用しているコードの最後に移動する必要があります。私は運がないとあなたが提案したものを試しました。 ObjCommand.Disposeの最後にobjCommand.Parameters.Clearと同じことをやり直してください。さらに、レコードを保存するためにInsert Statementと同じコードとループを使用していますが、正常に動作しています。 Thanks –

+0

いいえ、DisposeはobjCommandを破棄します。 ObjectDisposed例外を受け取らないのは幸いです。 OleDbCommandに割り当てを解除するためのリソースがないことは、あなたにとって幸いです。絶対にその行を削除する必要があります。 – Steve

答えて

0

更新の問題は、パラメータの定義順です。
OleDbは、パラメータの名前を調べず、パラメータがコレクションに追加された順序で表示します。
更新SQL文では、最初にInvoice_Noパラメータを追加してからItem_nameを追加します。しかし、クエリでは、最初のパラメータのプレースホルダはItem_Nameで、最後はInvoice_Noです。

パラメータを追加するときは、プレースホルダの順序に従う必要があります。

For i = 0 To DGPurchase.Rows.Count - 2 
    ..... 
    ObjCommand.Connection = myConnection 
    ObjCommand.CommandText = "Update Item_Invoice 
      Set [email protected]_Name 
      Where [email protected]_No" 
    .... 

    ObjCommand.Parameters.AddWithValue("Item_Name", ItmName) 
    ' the Invoice_No should be the last parameter added not the first 
    ObjCommand.Parameters.AddWithValue("Invoice_No", InvNo) 
    ..... 
    ObjCommand.ExecuteNonQuery() 

私のアドバイスを繰り返します。常に同じOleDbCommandを使用し、使用を終了するまでは処理しないでください。
また、各ExecuteNonQuery間でパラメータコレクションをクリアする必要があります。それ以外の場合は引き続きパラメータを追加して、間違った値を挿入したり、データベースにレコードを複製したりすることがあります。これはあなたの問題の原因ですが、ループ内の最初の行は、あなたが同じのOleDbCommandにパラメータを追加していきそう_objCommand.Parameters.Clear_すべきかどう

Private Sub btnPurchaseSave_Click(sender As Object, e As EventArgs) Handles btnPurchaseSave.Click 

    .... 
    ConnectDatabse() 

    If blnPurchNew = True Then 

     myConnection.Open() 
     .... 
     ObjCommand.ExecuteNonQuery() 

     ' Do not destroy the objCommand 
     ' ObjCommand.Dispose() 

     ' Try 
     For i = 0 To DGPurchase.Rows.Count - 2 
      ObjCommand.Parameters.Clear() 
      ObjCommand.CommandText = ..... 
      ObjCommand.ExecuteNonQuery() 

      ' No destroy 
      ' ObjCommand.Dispose() 

     Next i 
     .... 
    Else 
     If blnPurchModify = True Then 
      myConnection.Open() 
      ObjCommand.CommandText = "UPDATE ...." 
      .... 
      ObjCommand.ExecuteNonQuery() 
      ' ObjCommand.Dispose() 

      For i = 0 To DGPurchase.Rows.Count - 2 
       ObjCommand.Parameters.Clear() 
       ObjCommand.CommandText = "UPDATE Item_Invoice ...." 
       .... 
       ObjCommand.ExecuteNonQuery() 

      Next i 
      .... 
     End If 
    End If 

    myConnection.Close() 
    myConnection.Dispose() 
    ObjCommand.Dispose() 
End Sub 
+0

これはうまくいきませんでした。私は別の問題をどこかで解決しようとしますか?ありがとう –

+0

私は私の間違いを持っ​​ています。あなたは正しい@スティーブ、あなたの方法はうまくいきます、間違いはDataBaseで、私は今、別の問題を抱えています。インボイス番号2のための多くの項目を持つインボイスがあります。オレンジ、アップル、バナナがあります。DataGrid "Update Item_Name Where Invoice_No = 2"を使用して、DataGridの最初のアイテムをレモンに変更すると、すべてのアイテムがレモンになります。どのようにして問題を克服し解決するか。事前に感謝 –

+0

喜んで助けになる。他の問題については、新しい質問を投稿することをお勧めします。これがサイトの仕組みです。非常に少数の人々があなたのコメントを読むためにここに来るので、質問に新しい問題を追加することは歓迎されません。また、サイトの新しいユーザーとして、[回答の受け入れはどのように行われますか](http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work)を読むことをお勧めします。 – Steve

関連する問題