查询表达式中出现语法错误(缺少操作符)

本文关键字:操作符 错误 语法 表达式 查询表 查询 | 更新日期: 2023-09-27 18:13:02

我正在c#中连接到Microsoft Access数据库的数据库应用程序。现在我让它工作了,当我点击Save时它会说数据输入成功,但我发现它实际上并没有将数据输入到数据库中。

因此,在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)
    {
    }
}
}

查询表达式中出现语法错误(缺少操作符)

问题出在你的参数上,它们的声明方式如下:

@[Guest Name Here]

@是正确的,因为它代表你的参数,但是括号是一个巨大的no, no。括号的符号是数据库中的Column Name,这可能是造成问题的部分原因。再加上空格,这个错误很可能会失败。

参数的格式应该如下:

@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块,任何值都将超出作用域,因此它将关闭您的连接。

你应该在顶部表示连接是打开的,这样更容易阅读,并且在你试图操作查询之前确保连接是打开的。

由于您注意到您与dbConnectionquery的斗争,我部分填写,以指示您必须放置完整内容的位置。


更新:

我也注意到你的查询没有反映变化,你需要确保列确实存在,并以以下格式:

[GuestName]

不是你的格式,[Guest Name]。同样,示例应用于插入的值,这些值是它们都需要匹配的参数。