我已经仔细检查了我的SQL语句,似乎我的SQL语句是错误的。我不知道为什么它不起作用。我的SQL语句是正确的,它导致了这个OleDBException。
这是代码
public void updateAccount(Int32 accountid, String username, String password, String isdisable)
{
con.ConnectionString = db.konek();
String sql = "UPDATE accounts SET username = @username, password = @password, isdisable = @isdisable WHERE accountid = @accountid";
try
{
con.Open();
OleDbCommand cmd = new OleDbCommand(sql, con);
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@password", password);
cmd.Parameters.AddWithValue("@isdisable", isdisable);
cmd.Parameters.AddWithValue("@accountid", accountid);
cmd.ExecuteNonQuery();
}
finally
{
con.Close();
}
}
我的MS Access Table的屏幕截图
Exception截图
答案 0 :(得分:5)
您使用的是MICROSOFT JET reserved word密码 这是语法错误的起源。
你应该用方括号封装你的sql命令
String sql = "UPDATE accounts SET username = @username, [password] = @password, " +
"isdisable = @isdisable WHERE accountid = @accountid";
对于命名参数问题。
就Microsoft Access而言,提供程序Microsoft.ACE.OLEDB.12.0允许您使用与SqlServer兼容的上述语法。但是,在OleDbCommand的OleDbParameter集合中插入参数时,您应该尊重参数占位符的正确顺序
答案 1 :(得分:2)
当您添加这样的命名参数时,不会在sql查询中替换该文本。你需要用“?”在sql字符串中,然后将替换参数:
string sql = "UPDATE accounts SET username = ?, password = ?, isdisable = ? WHERE accountid = ?"
使用命名参数进行的操作仅适用于过程,而不适用于文本。
如果您的命令设置如下:
cmd.CommandType = CommandType.StoredProcedure
然后命名参数将起作用。但是,您使用的是CommandType.Text,这是默认设置,因此您需要使用“?”为了让OLEDB驱动程序使用您的参数。
答案 2 :(得分:1)
更新代码适用于SQL Server中的存储过程,可能不适用于访问DB:
string _Update_Emp = "UPDATE AlbahraniNetwork SET FirstName=@FirstName,SecondName=@SecondName,LastName=@LastName,Phone=@Phone,Cell=@Cell,Email=@Email,Address=@Address where FirstName=@FirstName";
string appPath = Path.GetDirectoryName(Application.ExecutablePath);
if (!appPath.EndsWith("\\"))
appPath += "\\";
_Conn.ConnectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + appPath + "Database31.accdb");
//_Conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Abdullah\documents\visual studio 2010\Projects\AlbahraniNetwork2\AlbahraniNetwork2\Database31.accdb";
_Conn.Open();
OleDbCommand _Update_Command = new OleDbCommand(_Update_Emp, _Conn);
_Update_Command.Parameters.AddWithValue("@FirstName", FirstName.Text);
_Update_Command.Parameters.AddWithValue("SecondName", SecondName.Text);
_Update_Command.Parameters.AddWithValue("@LastName", LastName.Text);
_Update_Command.Parameters.AddWithValue("@Phone", Phone.Text);
_Update_Command.Parameters.AddWithValue("@Cell", Cell.Text);
_Update_Command.Parameters.AddWithValue("@Email", Email.Text);
_Update_Command.Parameters.AddWithValue("@Address", Address.Text);
_Update_Command.ExecuteNonQuery();
简化,改为使用:
string _Update_Emp = "UPDATE AlbahraniNetwork SET " +
FirstName=\"" + FirstName.Text + "\"" +
",SecondName=\"" + SecondName.Text + "\"" +
",LastName=\""+ LastName.Text + "\"" +
",Phone=\""+ Phone.Text + "\"" +
",Cell=\"" + Cell.Text + "\"" +
",Email=\"" + Email.Text + "\"" +
",Address=\"" + Address.Text + "\"" +
" where FirstName=\"" + FirstName.Text +";";
string appPath = Path.GetDirectoryName(Application.ExecutablePath);
if (!appPath.EndsWith("\\"))
appPath += "\\";
_Conn.ConnectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + appPath + "Database31.accdb");
//_Conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Abdullah\documents\visual studio 2010\Projects\AlbahraniNetwork2\AlbahraniNetwork2\Database31.accdb";
_Conn.Open();
OleDbCommand _Update_Command = new OleDbCommand(_Update_Emp, _Conn);