【问题标题】:Oracle Database, SQL Update statement will not work (OLEDB)Oracle 数据库,SQL 更新语句将不起作用 (OLEDB)
【发布时间】:2015-03-06 16:11:51
【问题描述】:

我设置了一个数字主键和一个存储卡车 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": 无效的标识符。

【问题讨论】:

    标签: c# database oracle oledb


    【解决方案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   
    

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

    【讨论】:

    • 它将使用引号,除非字符串值中包含引号。使用参数可以消除这种风险(和其他风险)。
    猜你喜欢
    • 2019-11-07
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多