2015-10-31 5 views
0

enter image description here Я пытаюсь вставить данные в базу данных Access, используя vb для приложения, которое я создаю. Я был BEATING, что у меня была невидимая стена, пытаясь заставить данные войти в базу данных. Ниже приведен код, ниже я объясню это больше.Тип данных Несоответствие Vb.net Доступ

Private Sub btnSubmitExpense_Click(sender As Object, e As EventArgs) Handles btnSubmitExpense.Click 
    provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" 
    dataFile = "C:\PFADatabase.accdb" 
    connString = provider & dataFile 
    myConnection.ConnectionString = connString 
    myConnection.Open() 
    Dim str As String 
    str = "Insert into Expenses ([ExpenseTypeID], [DateOfExpense],[AmountOfExpense]) Values(?,?,?)" 
    Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection) 
    cmd.Parameters.Add(New OleDbParameter("ExpenseTypeID", CType(cboCategoryOfExpense.Text, String))) 
    cmd.Parameters.Add(New OleDbParameter("DateOfExpense", CType(dateOfExpense.Text, String))) 
    cmd.Parameters.Add(New OleDbParameter("AmountOfExpense", CType(txtAmountOfExpense.Text, String))) 

    Try 
     cmd.ExecuteNonQuery() 
     cmd.Dispose() 
     myConnection.Close() 
     'clear the form below 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

[ExpenseTypeID] на самом деле поиск. Объект - это combobox в vb, который я запрограммировал выше кода, который я разместил здесь. [DateOfExpense] также является объектом Date в VB. Я просто перетащил его. Я хочу, чтобы это было связано со всем в этой таблице. [AmountOfExpense] снова привязан к db.

В основном пользователь вводит дату с помощью инструмента, затем выбирает категорию своих расходов и затем вводит сумму. Это все одна таблица, но accountType - это Lookup, фактически находящийся в Access для другой таблицы, поэтому у нас может быть выпадающее меню. Все работает хорошо, пока я не нажму кнопку «Сохранить». Тогда всякий раз, когда я делаю это, я получаю исключение, тип несовместим. Как это исправить? Я УВЕРЕН, что текстовая строка ошибочна, но я пробовал другие вещи, поэтому я думаю, что это нечто большее, чем то, почему я пришел к вам, профессионалы, чтобы получить вход.

спасибо.

EDIT: Ошибка поступающие на

cmd.ExecuteNonQuery() 

и говорит «Несоответствие типов данных в выражении критериев»

'START THE POPULATE THE COMBO BOXES 

    'Gets the database and makes the connection 

    provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" 

    dataFile = "C:\PFADatabase.accdb" 

    connString = provider & dataFile 
    myConnection.ConnectionString = connString 


    'Generates a query command 
    Dim cmd As OleDbCommand = New OleDbCommand("SELECT [ExpenseType] FROM [ExpenseType]", myConnection) 
    myConnection.Open() 'Opens connection 
    Dim dr As OleDbDataReader = cmd.ExecuteReader 


    While dr.Read 
     cboCategoryOfExpense.Items.Add(dr.Item(0)) 
    End While 
    myConnection.Close() 


    'END THE POPULATE OF COMBO BOXES 

Как вы можете видеть в комментариях, он говорит, как комбинированные поля заполнены.

РЕДАКТИРОВАТЬ: На картинке под Расходы находится главный стол. Ключом является FK, и это приводит к PK ExpenseType. Данные, которые мы вытаскиваем, это ExpenseType в ExpenseType. Из того, что я понимаю, вы, ребята, говорите, и я согласен, что он пишет PK ExpenseType, а не данные. ВСЕ, что я хочу сделать, это сохранить данные для графа, который мы будем использовать.

+0

в сообщении об ошибке переговоры о рассогласования между типами данных значений в г наши параметры и тип данных столбцов в таблице базы данных. Вы передаете строки в коллекции параметров, являются ли ваши поля базы данных типа текста? (или они являются числовыми и датами?) – Steve

+0

@Steve - это дата, другая - текстовый поиск, последний - валюта. – wwe9112

+0

И вы передаете строки. Очевидно, что база данных не нравится. Вы должны преобразовать значения в соответствующий тип данных перед добавлением преобразованного значения к вашим параметрам. И не используйте конструктор Параметров без указания типа – Steve

ответ

1

Преобразуйте свой вход в соответствующий тип данных, как того требуют ваши столбцы. Если вы не указываете тип ваших параметров и передать всегда строки, то вы легко цель такого рода ошибок

... 
    Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection) 

    Dim expID As Integer 
    if Not Int32.TryParse(cboCategoryOfExpense.Text, expID) Then 
     MessageBox.Show("Invalid integer") 
     return 
    End If 
    cmd.Parameters.Add("ExpenseTypeID", OleDbType.Integer).Value = expID 

    Dim dtExp as DateTime 
    if Not DateTime.TryParse(dateOfExpense.Text, dtExp) Then 
     MessageBox.Show("Invalid Date") 
     return 
    End If 
    cmd.Parameters.Add("DateOfExpense", OleDbType.Date).Value = dtExp 

    Dim amount As Decimal 
    if Not Decimal.TryParse(txtAmountOfExpense.Text, amount) Then 
     MessageBox.Show("Invalid Decimal") 
     return 
    End If 
    cmd.Parameters.Add("AmountOfExpense", OleDbType.Currency).Value = amount 
    .... 

Глядя на ваши изменения и комментарии, возможно, это то, что вам нужно

' Be sure to have a combobox with DropDownList style to avoid 
' user entering an unexpected value then.... 

'Load the combobox from the table ExpenseType 
Dim cmd As OleDbCommand = New OleDbCommand("SELECT [ExpenseTypeID], " & _ 
          "[ExpenseType] FROM [ExpenseType]", myConnection) 
myConnection.Open() 'Opens connection 
Dim dr As OleDbDataReader = cmd.ExecuteReader 
Dim dt = new DataTable() 
dt.Load(dr) 

cboCategoryOfExpense.DataSource = dt 

' The visible part of the combo contains value from ExpenseType field 
cboCategoryOfExpense.DisplayMember = "ExpenseType" 

' The hidden part refers to the ExpenseTypeID field 
cboCategoryOfExpense.ValueMember = "ExpenseTypeID" 
... 

и теперь при преобразовании значения COMBOBOX вы coud написать

Dim expID As Integer 

    ' Sanity check in case the user want to insert but has not 
    ' selected anything from the combobox 
    if cboCategoryOfExpense.SelectedValue Is Nothing Then 
     MessageBox.Show("Select an Expense") 
     return 
    End if 
    cmd.Parameters.Add("ExpenseTypeID", OleDbType.Integer).Value = Convert.ToInt32(cboCategoryOfExpense.SelectedValue) 
    .... 
+0

Спасибо :). Я попробовал это, и получил недопустимую целочисленную ошибку. Я предполагаю, что это потому, что теперь, когда я пошел и посмотрел на ее БД, у нее есть поиск в качестве автонабора. Я не думаю, что вы можете преобразовать тех, кто может или может их обработать, поскольку они находятся в собственной таблице? – wwe9112

+0

Столбцы Autonumbers имеют целочисленный тип данных. Если вы получите сообщение _Invalid integer_, то это ваш текст combobox, который не является числом. Как вы загружаете эту комбо? Вы должны использовать свойства _ValueMember_ и _DisplayMember_ для отображения текста и целочисленного значения для вашего запроса, считывающего свойство SelectedValue. – Steve

+0

Я редактировал исходное сообщение для заполнения поля со списком. Это происходит из другого стола. Я использовал некоторое руководство по работе. Есть ли учебник для этого? – wwe9112

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