C#,Oracle数据库,SQL Update语句不起作用(OLEDB)

时间:2015-03-06 16:11:51

标签: c# database oracle oledb

所以我使用了这个完全相同的语法和其他一百万个更新,我不知道发生了什么,我开始变得非常沮丧。

我设置了一个数字主键和一个存储卡车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”:无效的抵押品。

1 个答案:

答案 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   

就目前而言,您没有在您过滤的值周围加上引号,因此查询将其视为标识符(字段,变量等)而不是常量值。由于您已经在使用"正在使用"值(由于你提供一个常量值,这是不必要的)最好的解决方法是使用过滤器的参数。