2015-09-15 3 views
-1

Я работаю над приложением базы данных в C#, которое подключается к базе данных Microsoft Access. Теперь я работал, где, когда я нажимаю «Сохранить», он сказал бы, что данные были успешно введены, но я узнал, что он фактически не вводил данные в базу данных.Получение ошибки исключения: Ошибка синтаксиса (отсутствующий оператор) в выражении запроса

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

An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll 

Additional information: Syntax error (missing operator) in query expression '@[Guest First Name]'. 

Мне любопытно, где проблема. Это исключение вызывается, когда оно достигает com.ExecuteNonQuery(); строка следующего кода:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Data.OleDb; 
using System.Data; 
using System.ComponentModel; 


namespace ParkingDatabase 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 


    private void btnSave_Click(object sender, RoutedEventArgs e) 
    { 
     using (OleDbConnection DBConnect = new OleDbConnection()) 
     { 
      DBConnect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source = C:\Users\bkoso\documents\visual studio 2015\Projects\ParkingDatabase\ParkingDatabase\ParkingData.accdb"; 
      using (OleDbCommand com = new OleDbCommand("INSERT INTO [Guest Info]([Guest First Name], [Guest Last Name], [Room Number], [Departure Date], [Return Date], [Vehicle Colour], [Vehicle Make], [Plate Number], [Contact First Name], [Contact Last Name], [Contact Number], [Contact Email], [Tag Number]) Values(@[Guest First Name], @[Guest Last Name], @[Room Number], @[Departure Date], @[Return Date], @[Vehicle Colour], @[Vehicle Make], @[Plate Number], @[Contact First Name], @[Contact Last Name], @[Contact Email], @[Contact Email], @[Tag Number])", DBConnect)) 

//the section below was recently updated 
      { 
       com.Parameters.AddWithValue("@GuestFirstName", txtBxGstFName.Text); 
       com.Parameters.AddWithValue("@GuestLastName", txtBxGstLName.Text); 
       com.Parameters.AddWithValue("@RoomNumber", txtBxRm.Text); 
       com.Parameters.AddWithValue("@DepartureDate", txtBxDDate.Text); 
       com.Parameters.AddWithValue("@ReturnDate", txtBxRDate.Text); 
       com.Parameters.AddWithValue("@VehicleColour", txtBxVColour.Text); 
       com.Parameters.AddWithValue("@VehicleMake", txtBxVMake.Text); 
       com.Parameters.AddWithValue("@PlateNumber", txtBxPlate.Text); 
       com.Parameters.AddWithValue("@ContactFirstName", txtBxContactFName.Text); 
       com.Parameters.AddWithValue("@ContactLastName", txtBxContactLName.Text); 
       com.Parameters.AddWithValue("@ContactNumber", txtBxPhone.Text); 
       com.Parameters.AddWithValue("@ContactEmail", txtBxEmail.Text); 
       com.Parameters.AddWithValue("@TagNumber", txtBxTag.Text); 

       DBConnect.Open(); 
       com.ExecuteNonQuery(); 
       DBConnect.Close(); 
      } 

      if (DBConnect.State == ConnectionState.Open) 
      { 
       //com.ExecuteNonQuery(); 
       MessageBox.Show("Guest Information Saved Successfully"); 
       txtBxGstFName.Text = ""; 
       txtBxGstLName.Text = ""; 
       txtBxRm.Text = ""; 
       txtBxDDate.Text = ""; 
       txtBxRDate.Text = ""; 
       txtBxVColour.Text = ""; 
       txtBxVMake.Text = ""; 
       txtBxPlate.Text = ""; 
       txtBxContactFName.Text = ""; 
       txtBxContactLName.Text = ""; 
       txtBxPhone.Text = ""; 
       txtBxEmail.Text = ""; 
       txtBxTag.Text = ""; 
      } 
     } 
    }  

    private void btnClear_Click(object sender, RoutedEventArgs e) 
    { 
     txtBxGstFName.Text = ""; 
     txtBxGstLName.Text = ""; 
     txtBxRm.Text = ""; 
     txtBxDDate.Text = ""; 
     txtBxRDate.Text = ""; 
     txtBxVColour.Text = ""; 
     txtBxVMake.Text = ""; 
     txtBxPlate.Text = ""; 
     txtBxContactFName.Text = ""; 
     txtBxContactLName.Text = ""; 
     txtBxPhone.Text = ""; 
     txtBxEmail.Text = ""; 
     txtBxTag.Text = ""; 
    } 

    private void btnView_Click(object sender, RoutedEventArgs e) 
    { 

    } 

    private void btnSame_Click(object sender, RoutedEventArgs e) 
    { 

    } 

    private void txtBoxGuestFirstName_TextChanged(object sender, TextChangedEventArgs e) 
    { 

    } 

    private void btnDelete_Click(object sender, RoutedEventArgs e) 
    { 

    } 

    private void btnSearch_Click(object sender, RoutedEventArgs e) 
    { 

    } 
} 
} 
+2

Попробуйте использовать пробелы между словами в параметрах - я не уверен, что SQL поддерживает пробелы между словами в параметрах. I.e., @GuestFirstName вместо @ [Имя гостя]. – Tim

+0

Возможно [это] (http://stackoverflow.com/questions/21636957/access-form-syntax-error-missing-operator-in-query-expression) может помочь. –

+0

, так почему '[]' в параметрах избавляется от пробелов. Также попробуйте заменить раздел значений на '?,?,?,? ... и т. Д. Также есть несколько примеров того, как вставлять в Access БД, использующий C#, пытается показать больше усилий в отношении выполнения поиска в Google, также является хорошим примером http://stackoverflow.com/questions/5893837/using-parameters-inserting-data-into-access-database – MethodMan

ответ

3

Проблема связана с вашими параметрами, они объявлены следующим образом:

@[Guest Name Here] 

@ является правильным, так как оно представляет ваш параметр, однако кронштейн Огромное нет, нет. Скобка символизирует Название столбца в базе данных, что частично может быть причиной вашей проблемы. Пара, что с пробелами, эта ошибка, скорее всего, потерпит неудачу.

Вы должны иметь свой параметр в следующем формате:

@GuestNameHere 

Позвольте мне знать, если это решает проблему. Кроме того, я заметил, что вы открываете свое соединение, ниже своих параметров, добавляете его выше. Структурированные больше похож:

private const string dbConnection = "Provider=Microsoft.ACE.OLEDB.12.0;..."; 
private const string query = "INSERT INTO..."; 
using((OleDbConnection connection = new OleDbConnection(dbConnection)) 
    using(OleDbCommand command = new OleDbCommand(query, connection)) 
    { 
      connection.Open();  
      // Parameter(s) here 
      command.ExecuteNonQuery(); 
      // Any other logic here. 
    } 

Так о фрагменте кода выше, то dbConnection будет readonly поэтому он может получить доступ к данным с вашего config. Это сделает его гибким, если ваша база данных изменится, вы измените ее в одном месте, а не на многих.

Параметр query схож, он позволит вам разместить на странице const со всеми вашими запросами в одном месте с легкостью доступа к изменениям без нескольких изменений запроса.

Также обратите внимание, что при использовании using оно реализует IDispose. Поэтому, как только приложение выйдет из блока using, любое значение станет недоступным, поэтому оно закроет ваше соединение.

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

С тех пор, как вы отметили свою борьбу с dbConnection и query Я частично заполнил, чтобы указать местоположение, которое вам нужно было бы разместить полный контент.


Update:

Я также заметил, что ваш запрос не отражает изменения, вы должны убедиться, столбец действительно присутствует, и в следующем формате:

[GuestName] 

Не в вашем формате, [Guest Name]. Кроме того, образец применяется для вставленных значений, эти значения являются параметрами, которые оба они должны соответствовать.

+0

Итак, я изменил параметры, чтобы исключить квадратные скобки и пробелы, но я все равно получаю то же исключение в одном и том же месте – Bloodstalker

+0

@Bloodstalker, пожалуйста, обновите вопрос своим новым кодом, чтобы мы могли видеть. – dman2306

+0

Как сделать то, что я новичок в этом сайте – Bloodstalker

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