查询表达式中出现语法错误(缺少操作符)
本文关键字:操作符 错误 语法 表达式 查询表 查询 | 更新日期: 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
块,任何值都将超出作用域,因此它将关闭您的连接。
你应该在顶部表示连接是打开的,这样更容易阅读,并且在你试图操作查询之前确保连接是打开的。
由于您注意到您与dbConnection
和query
的斗争,我部分填写,以指示您必须放置完整内容的位置。
更新:
我也注意到你的查询没有反映变化,你需要确保列确实存在,并以以下格式:
[GuestName]
不是你的格式,[Guest Name]
。同样,示例应用于插入的值,这些值是它们都需要匹配的参数。