2015-01-03 4 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 

End Class

+3

У вас есть разница в именах полей между запросами SELECt и INSERT. У вас есть «Amount Paid» или ваше поле называется «AmountPaid» (То же самое уточнение необходимо для других имен полей в SELECT) – Steve

+0

проверить ваш запрос. В refreshdata() вы указали имена столбцов с пробелами между ними и в командной строке у вас есть это без пробелов (например: способ оплаты). Что на самом деле правильно? –

+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) 

Ho wever, неясно, содержит ли ваши имена полей эффективное пространство или нет.
В заявлении 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

Thank вы, это сработало. :) –

Смежные вопросы