代码之家  ›  专栏  ›  技术社区  ›  Thomas Carlton

如何在具有虚拟列的Oracle表中插入数据?

  •  1
  • Thomas Carlton  · 技术社区  · 7 年前

    当我在datatable中插入新行时,它会说:

    在虚拟列上不允许插入插入操作

    这是我的代码:

        Dim Command As OracleCommand
        Dim TempDataAdapter As OracleDataAdapter
        Dim DataSet = new DataSet
        Dim Name = "MyTable"
        Dim TempDataAdapter As OracleDataAdapter
        Dim DataTable as DataTable
    
        'The connection is defined somewhere else...
        Command = New OracleCommand("MyTable", Me.Connection) 
        Command.CommandType = CommandType.Text
    
        TempDataAdapter = New OracleDataAdapter(Command)
    
        'Fill the table from the database 
        TempDataAdapter.FillSchema(DataSet, SchemaType.Source, Name)
        DataTable = DataTable = DataSet.Tables(0)           
    

    以及将数据保存回数据库的代码:

        TempDataAdapter.Update(DataTable)
    

    DataTable.Columns.Remove(DataTable.Columns(“MyVirtualColumn”))

    但当将数据保存回数据库时,它返回相同的错误。

    干杯,

    2 回复  |  直到 7 年前
        1
  •  3
  •   Gary Myers    7 年前

    如果不尝试填充或查询虚拟列,则可以在该表上创建排除虚拟列的视图并使用该视图。

        2
  •  1
  •   Wernfried Domscheit    6 年前

    将数据插入具有虚拟列的表时,必须列出列,即不能使用

    Insert into table_x values (x, y, z)
    

    Insert into table_x (col1, col2, col3) values (x, y, z)
    

    相应地编写.net语句。如果您尝试使用 DataTable

    CREATE OR REPLACE VIEW V_MyTable AS 
    SELECT col1, col2 -- skip virtual_col3 
    FROM MyTable;
    

    如果您希望选择虚拟列,但跳过它们进行插入(或更新),则可以使用INSTEAD OF触发器创建视图。会是这样的:

    CREATE OR REPLACE VIEW V_MyTable AS 
    SELECT col1, col2, virtual_col3
    FROM MyTable;
    
    CREATE OR REPLACE TRIGGER IO_MyTable
        INSTEAD OF INSERT OR UPDATE ON V_MyTable
        FOR EACH ROW
    
    BEGIN
    
        IF UPDATING THEN
            UPDATE MyTable SET 
                col1 = :NEW.col1, 
                col2 = :NEW.col2
            WHERE primary_key_col = :OLD.primary_key_col;
        ELSIF INSERTING THEN
            INSERT INTO MyTable (col1, col2) VALUES (:NEW.col1, :NEW.col2);
        END IF;
    
    END;