Visual C#.NET ERROR: An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll
Visual C#.NET ERROR: An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll
大家好。我是 visual c#.net 的新手。我正在使用用于 MS Access 数据库的 OleDb。我在向 MS Access 数据库中插入数据时遇到问题,我不知道这里是哪一个出了问题。在我的理论中,我的算法构造得很糟糕。我一直收到这个 OleDb 异常错误,它是 "Additional information: Syntax error in INSERT INTO statement."
这是我的代码:
我的数据库 table 中有 3 个字段,称为 "usersTable"。分别是:user_name、密码和user_type。
adduser.cs
注意:我一直在这行代码中收到错误 global.da.Update(global.ds1, "usersTable");
using System;
using System.Data;
using System.Data.OleDb;
private void dbConnect()
{
global.sconn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source = D:/c# programs/soer_final/User.accdb";
global.dbConn = new OleDbConnection(global.sconn);
global.dbCmd.Connection = global.dbConn;
global.dbCmd.CommandText = "Select * from usersTable";
global.da.SelectCommand = global.dbCmd;
global.dbConn.Open();
global.ds1.Clear();
global.da.Fill(global.ds1, "usersTable");
}
private void SaveButton_Click(object sender, EventArgs e)
{
try {
dbConnect();
DataRow dRow = global.ds1.Tables["usersTable"].NewRow();
dRow[0] = user_name.Text;
dRow[1] = password.Text;
dRow[2] = user_type.Text;
global.ds1.Tables["usersTable"].Rows.Add(dRow);
global.da.Update(global.ds1, "usersTable");
global.dbConn.Close();
MessageBox.Show("User added");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
Program.cs
using System.Data;
using System.Data.OleDb;
public class global
{
public static string sconn;
public static OleDbConnection dbConn;
public static OleDbDataAdapter da = new OleDbDataAdapter();
public static OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
public static OleDbCommand dbCmd = new OleDbCommand();
public static DataSet ds1 = new DataSet();
public static DataRow[] foundrow;
}
您需要更改构建 OleDbCommandBuilder 的行。
OleDbCommandBuilder cb = new OleDbCommandBuilder(da)
{ QuotePrefix = "[", QuoteSuffix = "]"};
这将强制 OleDbCommandBuilder 将生成的命令(用于更新、插入和删除操作)的字段名称括在方括号中。反过来,这避免了由于在列名 (PASSWORD) 中使用保留关键字而导致的语法错误。
当然,您也可以更改该列名称并一劳永逸地删除问题的根源。
顺便说一下,我强烈建议不要使用全局 class 来让所有这些变量在程序的生命周期内保持活动状态。它们将成为您程序的持久麻烦源。未关闭和处理的连接、带有先前使用参数和文本的命令、更改其配置的适配器等。最好在需要时实例化这些对象,然后销毁它们。就性能而言,成本并不高
大家好。我是 visual c#.net 的新手。我正在使用用于 MS Access 数据库的 OleDb。我在向 MS Access 数据库中插入数据时遇到问题,我不知道这里是哪一个出了问题。在我的理论中,我的算法构造得很糟糕。我一直收到这个 OleDb 异常错误,它是 "Additional information: Syntax error in INSERT INTO statement."
这是我的代码:
我的数据库 table 中有 3 个字段,称为 "usersTable"。分别是:user_name、密码和user_type。
adduser.cs
注意:我一直在这行代码中收到错误 global.da.Update(global.ds1, "usersTable");
using System;
using System.Data;
using System.Data.OleDb;
private void dbConnect()
{
global.sconn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source = D:/c# programs/soer_final/User.accdb";
global.dbConn = new OleDbConnection(global.sconn);
global.dbCmd.Connection = global.dbConn;
global.dbCmd.CommandText = "Select * from usersTable";
global.da.SelectCommand = global.dbCmd;
global.dbConn.Open();
global.ds1.Clear();
global.da.Fill(global.ds1, "usersTable");
}
private void SaveButton_Click(object sender, EventArgs e)
{
try {
dbConnect();
DataRow dRow = global.ds1.Tables["usersTable"].NewRow();
dRow[0] = user_name.Text;
dRow[1] = password.Text;
dRow[2] = user_type.Text;
global.ds1.Tables["usersTable"].Rows.Add(dRow);
global.da.Update(global.ds1, "usersTable");
global.dbConn.Close();
MessageBox.Show("User added");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
Program.cs
using System.Data;
using System.Data.OleDb;
public class global
{
public static string sconn;
public static OleDbConnection dbConn;
public static OleDbDataAdapter da = new OleDbDataAdapter();
public static OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
public static OleDbCommand dbCmd = new OleDbCommand();
public static DataSet ds1 = new DataSet();
public static DataRow[] foundrow;
}
您需要更改构建 OleDbCommandBuilder 的行。
OleDbCommandBuilder cb = new OleDbCommandBuilder(da)
{ QuotePrefix = "[", QuoteSuffix = "]"};
这将强制 OleDbCommandBuilder 将生成的命令(用于更新、插入和删除操作)的字段名称括在方括号中。反过来,这避免了由于在列名 (PASSWORD) 中使用保留关键字而导致的语法错误。
当然,您也可以更改该列名称并一劳永逸地删除问题的根源。
顺便说一下,我强烈建议不要使用全局 class 来让所有这些变量在程序的生命周期内保持活动状态。它们将成为您程序的持久麻烦源。未关闭和处理的连接、带有先前使用参数和文本的命令、更改其配置的适配器等。最好在需要时实例化这些对象,然后销毁它们。就性能而言,成本并不高