2014-10-07 3 views
0

По какой-то причине, когда я пытаюсь добавить данные в свою базу данных, я получаю:Невозможно добавить данные в базу данных Access

первого шанса исключение типа «System.Data.OleDb.OleDbException» произошло в System.Data.dll

Дополнительная информация: Отсутствует точка с запятой (;) в конце инструкции SQL.

Вот мой код. Теперь я установил механизм базы данных, и я изменил процессор на x86.

Private Sub SaveButton_Click(sender As Object, e As EventArgs) Handles SaveButton.Click 


    If DirectCast(AdminCheckBox, CheckBox).Checked = True Then 

     Dim result1 As Integer 
     Dim cmd As New OleDb.OleDbCommand 
     cnn = New OleDb.OleDbConnection 
     cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & "C:\Users\daNo\Documents\Visual Studio 2013\Projects\WindowsApplication1\WindowsApplication1\bin\chem.accdb;" 

     If Not cnn.State = ConnectionState.Open Then 
      cnn.Open() 

     End If 

     result1 = MsgBox("Are you sure you want to add this user a admin?", MsgBoxStyle.YesNo, "Add New User") 

     If result1 = vbYes Then 

      cmd.Connection = cnn 
      cmd.CommandText = "INSERT INTO Users(UserName, [password], Email) " & _ 
           "VALUES(?,?,?)'" 

      cmd.Parameters.AddWithValue("@p1", Me.UserNameTextBox.Text) 
      cmd.Parameters.AddWithValue("@p2", Me.PasswordTextBox2.Text) 
      cmd.Parameters.AddWithValue("@p3", Me.EmailTextBox.Text) 

      cmd.ExecuteNonQuery() 

      MsgBox("Account has been created!", MsgBoxStyle.OkOnly, "Add New User") 

      Dim ACCSETTINGS As New ACCSETTINGS 
      ACCSETTINGS.Show() 
      Me.Hide() 

      Me.Close() 

     ElseIf result1 = vbNo Then 

      Dim NEWUSER As New NewUser 
      NEWUSER.Show() 
      Me.Hide() 

     End If 

    End If 
+0

Это только часть кода, все остальное объявлено. –

+0

спасибо за это? –

ответ

1

Имя пользователя, Пароль и EMail текстовые поля, так что вы должны передать значения для них заключены в одинарные кавычки. Ваша команда пропускает эти кавычки вокруг значений в конкатенации строк, которые строят команду. Что-то вроде этого

"INSERT INTO Users(UserName, [password], Email) VALUES('" & Me.UserNameTextBox.Text & "'.... 

но это действительно плохой способ построить команду sql. Вы должны всегда использовать параметризованный запрос

Dim result1 = MsgBox("Are you sure you want to add this user a admin?", MsgBoxStyle.YesNo, "Add New User") 
If result1 = vbYes Then 
    Using cnn = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;.....") 
    Using cmd = new OleDb.OleDbCommand("INSERT INTO Users(UserName, [password], Email) " & _ 
             "VALUES(?,?,?)" 
     cnn.Open() 
     cmd.Parameters.AddWithValue("@p1",Me.UserNameTextBox.Text) 
     cmd.Parameters.AddWithValue("@p2",Me.PasswordTextBox2.Text) 
     cmd.Parameters.AddWithValue("@p3",Me.EmailTextBox.Text) 
     Dim rowAdded = cmd.ExecuteNonQuery() 
     if rowAdded > 0 Then 
       MessageBox.Show("Account has been created!") 
       .... 
     Else 
       MessageBox.Show("Problems!") 
     End If 
End If 

параметризованных запросы устраняют необходимость построения сложного текста запроса путем конкатенации части входных значений от вашего пользователя, добавляя необходимые кавычки для строк (в конце концов, парсинг для встроенных кавычек), проверка правильный десятичный разделитель, когда это необходимо, передача дат в правильном формате, но самое главное, параметризованный запрос устраняет возможность Sql Injection, где ваш злоумышленник готовит специальную форматированную строку, которая может нанести ущерб базе данных.

В качестве примечания стороны. Хранение паролей в ясном тексте - действительно плохая практика с точки зрения безопасности. В зависимости от контекста вашего приложения это не преуменьшение. Если кто-то может захватить копию вашего файла базы данных, он сможет читать каждый пароль пользователя.

EDIT

Проверка снова строку, используемую в строке соединения, чтобы установить имя базы данных он появляется на самом деле не так.

Здесь расщепляется для читаемости

"...;Data Source=" & Application.StartupPath & "C:\Users\daNo\Documents\" & _ 
"Visual Studio 2013\Projects\WindowsApplication1\WindowsApplication1\bin\chem.accdb;..." 

Это приводит к неправильному пути к базе данных. Если у вас есть фиксированное место, где вы храните файл accdb, вы можете удалить его. Application.StartupPath

+0

ничего не меняет. –

+0

Первое случайное исключение типа «System.Data.OleDb.OleDbException» произошло в System.Data.dll Дополнительная информация: Недействительное имя файла. –

+0

происходит на cnn.open –

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