2014-12-30 3 views
-2

Я пытаюсь заставить мою систему вставлять значения полей со списком в мою базу данных доступа. Я всегда получаю эту очень длинную ошибку, когда я пытаюсь нажать кнопку «добавить», и я как-то ощущаю это, потому что это из-за моего заявления INSERT. Это мой код для моей формы. Любая помощь будет оценена! СпасибоВставка значений со списком?

Imports System.Data.OleDb 

Public Class AdmMain 


    Sub fillcombo() 
     strsql = " select yrgr from yearandgrade" 
     Dim acscmd As New OleDb.OleDbCommand 
     acscmd.CommandText = strsql 
     acscmd.Connection = acsconn 
     acsdr = acscmd.ExecuteReader 

     While (acsdr.Read()) 
      cboyr.Items.Add(acsdr("yrgr")) 
     End While 
     acscmd.Dispose() 
     acsdr.Close() 
    End Sub 

    Sub comb2() 
     strsql = " select sections from sectio" 
     Dim acscmd As New OleDb.OleDbCommand 
     acscmd.CommandText = strsql 
     acscmd.Connection = acsconn 
     acsdr = acscmd.ExecuteReader 

     While (acsdr.Read()) 
      cbosec.Items.Add(acsdr("sections")) 
     End While 
     acscmd.Dispose() 
     acsdr.Close() 
    End Sub 

    Private Sub LinkLabel1_LinkClicked(sender As System.Object, e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked 
     If MessageBox.Show("Are you sure you want to logout?", "Logout", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then 
      MessageBox.Show("You have successfully logged out of VCM's Library Information System!", "Logout Confirmed") 
      Me.Close() 
      LoginUser.Show() 
     End If 
    End Sub 

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click 
     Me.txtFName.Text = "" 
     Me.txtMName.Text = "" 
     Me.txtLName.Text = "" 
     Me.cboyr.Text = "" 
     Me.cbosec.Text = "" 
     Me.txtFName.Focus() 
    End Sub 

    Private Sub AdmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
     Module1.connect() 
     Me.fillcombo() 
     Me.comb2() 

    End Sub 


    Private Sub btnAdd_Click(sender As System.Object, e As System.EventArgs) Handles btnAdd.Click 
     Dim rbdtext As String = cboyr.SelectedItem.ToString 
     Dim uno As String = cbosec.SelectedItem.ToString 
     Try 
      Using conn = New System.Data.OleDb.OleDbConnection() 
       conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
             "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Thesis\Thesis\Database1.accdb" 
       conn.Open() 
       Dim sqlquery As String = "INSERT INTO students (StudentID, FirstName,MiddleName,LastName,Yr, Section) " & _ 
             "VALUES (@studid, @fname,@mname,@lname,@yr, @sec)" 
       Dim SqlCommand As New System.Data.OleDb.OleDbCommand 
       SqlCommand.Parameters.AddWithValue("@studid", TxtID.Text) 
       SqlCommand.Parameters.AddWithValue("@fname", txtFName.Text) 
       SqlCommand.Parameters.AddWithValue("@mname", txtMName.Text) 
       SqlCommand.Parameters.AddWithValue("@lname", txtLName.Text) 
       SqlCommand.Parameters.AddWithValue("@yr", rbdtext) 
       SqlCommand.Parameters.AddWithValue("@sec", uno) 
       SqlCommand.Connection = conn 

       Dim sqlRead As System.Data.OleDb.OleDbDataReader = SqlCommand.ExecuteReader() 

       MsgBox("One record successfully added!", "Added!") 

      End Using 
     Catch ex As Exception 
      MsgBox(ex.ToString) 
     End Try 

    End Sub 

Heres ошибка продолжает показывать кстати! http://i.imgur.com/DgjiWqm.png

+0

Используйте ExecuteNonQuery вместо ExecuteReader (ну, если вы установите команду, она также работает с ExecuteReader, но нет смысла возвращать читателя, когда вы вставляете запись) – Steve

+0

«Dim sqlRead As System.Data.OleDb.OleDbDataReader = SqlCommand.ExecuteNonQuery« Я получаю синюю линию ниже Sqlcommand.ExecuteNonQuery , «Значение типа« Целое »не может быть преобразовано в« System.Data.OleDb.OleDbDataReader ».» – Phonseal

+0

Точно. ExecuteNonQuery возвращает количество строк, которые ваша команда (команда не SELECT) была изменена, вставлена, удалена. Оператор insert не возвращает читателя, потому что читать нечего, просто количество вставленных строк (оно должно быть 1 для вашего запроса). – Steve

ответ

0

Вам нужно изменить запрос таким образом

Private Sub btnAdd_Click(sender As System.Object, e As System.EventArgs) Handles btnAdd.Click 
    Dim rbdtext As String = cboyr.SelectedItem.ToString 
    Dim uno As String = cbosec.SelectedItem.ToString 

    Try 
     Dim cnString = = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
         "Data Source=C:\Thesis\Thesis\Database1.accdb" 
     Dim sqlquery As String = "INSERT INTO students " & _ 
      "(StudentID, FirstName,MiddleName,LastName,Yr, [Section]) " & _ 
      "VALUES (@studid, @fname,@mname,@lname,@yr, @sec)" 

     ' Use this form to initialize both connection and command to 
     ' avoid forgetting to set the appropriate properties.... 

     Using conn = New System.Data.OleDb.OleDbConnection(cnString) 
     Using cmd = New System.Data.OleDb.OleDbCommand(sqlQuery, conn) 

      conn.Open() 
      cmd.Parameters.AddWithValue("@studid", TxtID.Text) 
      cmd.Parameters.AddWithValue("@fname", txtFName.Text) 
      cmd.Parameters.AddWithValue("@mname", txtMName.Text) 
      cmd.Parameters.AddWithValue("@lname", txtLName.Text) 
      cmd.Parameters.AddWithValue("@yr", rbdtext) 
      cmd.Parameters.AddWithValue("@sec", uno) 

      Dim rowsInserted = cmd.ExecuteNonQuery() 
      if rowsInserted > 0 Then 
       MessageBox.Show("One record successfully added!", "Added!") 
      else 
       MessageBox.Show("Failure to add new record!", "Failure!") 
      End if 
     End Using 
     End Using 
    Catch ex As Exception 
     MessageBox.Show("Error: " & ex.Message) 
    End Try 

Я изменил имя вашего объекта OleDbCommand, чтобы избежать ненужной путаницы с классом SqlCommand используется в SqlClient пространстве имен (не является строго необходимым, но, тем не менее запутанным при чтении ваш код). Затем я использовал конструктор OleDbCommand, который получает как текст команды, так и соединение, которое будет использоваться вашей командой. Это позволяет избежать забыть настройки этих основных свойств, наконец РАЗДЕЛ является reserved keyword for MS-Access, таким образом, при использовании в тексте запроса, вам нужно оформить его в квадратные скобки, в противном случае вы получите SYNTAX ERROR

+0

Он все еще дает мне ошибку http://i.imgur.com/h46l5Ec.png? Спасибо за ценный ответ! @Steve – Phonseal

+0

Это похоже на звонок в MsgBox. Попробуйте использовать NET Framework [MessageBox.Show method] (http://msdn.microsoft.com/en-us/library/system.windows.forms.messagebox.show (v = vs.110) .aspx), а не совместимость с VB6. Теперь ответ на вопрос – Steve

+0

Большое спасибо! Наконец он работал :) – Phonseal

1

Похоже, что вы никогда не назначая выберите заявление SqlCommand внутри метода btnAdd_Click. Попробуйте добавить SqlCommand.CommandText = sqlquery.

+0

Я попытался добавить SqlCommand.CommandText = sqlquery. но при запуске моей программы возникла еще одна ошибка. Что-то вроде ошибки синтаксиса в инструкции INSERT INTO. – Phonseal

+0

@Phonseal - «Что-то вроде»? Как мы можем помочь вам разобраться, если вы так расплывчаты? Пожалуйста, укажите весь текст ошибки. –

+0

Извините. Вот. http://i.imgur.com/3HODub4.png – Phonseal

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