2015-01-03 123 views
0

當我運行我的項目時,它不斷給我提供錯誤。第一個例外是da.Fill(dt)。它說IErrorInfo.GetDescription使用E_FAIL(0x80004005)失敗。 第二個異常是在cmd.ExecuteNonQuery()並且在INSERT INTO語句中表示語法錯誤。 請幫幫我。我對VB非常陌生,所以即使我整天看着它,也不能真正看到問題。當我運行我的項目時,我總是收到錯誤

公共類Telephone_Bill

Dim cnn As New OleDb.OleDbConnection 
Private Sub RefreshData() 
    If Not cnn.State = ConnectionState.Open Then 
     cnn.Open() 
    End If 

    Dim da As New OleDb.OleDbDataAdapter("SELECT Month as [Month], " & _ 
             "Day as [Day], Year, Amount Paid, Amount Due, Mode of Payment, Company Name " & _ 
             " FROM Transactions ORDER BY Month", cnn) 

    Dim dt As New DataTable 

    Transaction_Log.dgvTransaction.DataSource = dt 

    da.Fill(dt) 



    cnn.Close() 
End Sub 

Private Sub btnProceed_Click(sender As System.Object, e As System.EventArgs) Handles btnProceed.Click 


    Dim cmd As New OleDb.OleDbCommand 
    If Not cnn.State = ConnectionState.Open Then 
     cnn.Open() 
    End If 

    cmd.Connection = cnn 
    cmd.CommandText = "INSERT INTO Transactions([Month], [Day], [Year], AmountPaid, AmountDue, ModeofPayment, CompanyName) " & _ 
         " VALUES(" & cboMonth1.SelectedItem & ",'" & cboDay1.SelectedItem & "','" & _ 
         cboYear1.SelectedItem & "','" & txtAmount.Text & "','" & _ 
         txtTotalCharges.Text & "','" & cboMonetary.SelectedItem & "','" & _ 
         txtCompName.Text & "')" 
    cmd.ExecuteNonQuery() 

    RefreshData() 

    cnn.Close() 
End Sub 

Private Sub Telephone_Bill_Load(sender As Object, e As System.EventArgs) Handles Me.Load 
    cnn = New OleDb.OleDbConnection 
    cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\Accounts for Bill Payment Center.accdb" 

    Me.RefreshData() 

End Sub 

末級

+3

您在SELECt和INSERT查詢之間的字段名稱有所不同。你有'金額付款'或者你的字段被命名爲'AmountPaid'(對SELECT中的其他字段名稱也需要相同的說明) – Steve

+0

檢查你的查詢。在你指定的列名中使用了refreshdata()並且在commandtext中你沒有空格(例如:支付方式)。實際上什麼是正確的? –

+2

您調用SQL的整個方法都是錯誤的;您需要使用[參數](http://stackoverflow.com/q/11139791/22437)。 –

回答

2

填寫的第一個錯誤可能是由於使用了保留關鍵字,並與周圍空間的字段名失蹤的方括號(Month, Day, Year都保留關鍵字對於許多數據庫系統而言需要在它們周圍的方括號中用於查詢文本)

Dim da As New OleDb.OleDbDataAdapter("SELECT [Month], " & _ 
            "[Day], [Year], [Amount Paid], [Amount Due], " & _ 
            "[Mode of Payment], [Company Name] " & _ 
            " FROM Transactions ORDER BY [Month]", cnn) 

何除此之外,目前還不清楚你的字段名是否包含空格。
在您的INSERT語句中,相同的字段顯示爲不含空格。因此,如果他們有空間,則需要將它們封裝在方括號中,否則,可以將它們留在INSERT查詢中。

在INSERT INTO的錯誤應使用適當的參數化方法

cmd.CommandText = "INSERT INTO Transactions([Month], [Day], [Year], " & _ 
        "AmountPaid, AmountDue, ModeofPayment, CompanyName) " & _ 
        " VALUES(?,?,?,?,?,?,?)" 
cmd.Parameters.AddWithValue("@p1", Convert.ToInt32(cboMonth1.SelectedItem)) 
cmd.Parameters.AddWithValue("@p2", cboDay1.SelectedItem.ToString) 
... and so on for the other fields.... 

注意固定,使用參數時和AddWithValue方法,你應該在你傳遞給參數的值的種類非常精確。如果基礎字段需要數字值,則應按預期將該值轉換爲適當的數據類型。例如,AmountPaid和AmountDue似乎是數字字段,您應該將用戶輸入轉換爲適當的數據類型(十進制?)

+0

感謝你,它的工作。 :) –

相關問題