所以我使用了这个完全相同的语法和其他一百万个更新,我不知道发生了什么,我开始变得非常沮丧。
我设置了一个数字主键和一个存储卡车FINS的字母数字字段,它基本上只是数字和字母的随机组合。我不生成鳍片,这些鳍片总是和它的卡车车队识别号码相同。
这是代码视图
storeTruckSplit = truckSplit[1];//Stores truck FIN
//Update truck value
try
{
conn.Open();
OleDbCommand command;
command = new OleDbCommand(
"Update Trucks" +
" SET Trucks.TruckInUse = ? WHERE TFIN = " + storeTruckSplit.ToString(), conn);
command.Parameters.Add(new OleDbParameter("@use", "T"));
command.ExecuteNonQuery();//Commit
conn.Close();
}
catch (OleDbException exception)
{
MessageBox.Show(exception.Message, "OleDb Exception");
}
这是表格视图
CREATE TABLE Trucks (
TruckID number(9) CONSTRAINT TRUCK_PK PRIMARY KEY,
TFIN char(9) NOT NULL,
TruckCategory varchar(80) NOT NULL,
TruckCodeName varchar(50) NOT NULL,
MaxWeight number(10) NOT NULL,
TruckSize number(10) NOT NULL,
TruckInUse varchar(1) NULL
);
在此表上插入“TRUCKID”
之前,还有一个序列和触发器我正在收到ORA-00904,请注意这是显示“C6977734D”,这是在更新的where子句中使用的卡车鳍。
确切消息“在处理命令期间发生了一个或多个错误。 ORA-00904:“C6977734D”:无效的抵押品。
答案 0 :(得分:1)
将TFIN
值设为参数:
command = new OleDbCommand(
"Update Trucks" +
" SET Trucks.TruckInUse = ? WHERE TFIN = ?", conn);
command.Parameters.Add(new OleDbParameter("@use", "T"));
command.Parameters.Add(new OleDbParameter("@tfin", storeTruckSplit));
command.ExecuteNonQuery();//Commit
就目前而言,您没有在您过滤的值周围加上引号,因此查询将其视为标识符(字段,变量等)而不是常量值。由于您已经在使用"正在使用"值(由于你提供一个常量值,这是不必要的)最好的解决方法是使用过滤器的参数。