Как вставить данные в таблицу Oracle с виртуальными столбцами?

У меня есть приложение .Net, которое загружает данные из базы данных оракула. Таблица содержит виртуальный столбец.

Когда я вставляю новую строку в datatable, он говорит:

Вставить операцию INSERT, запрещенную для виртуальных столбцов

Я понимаю эту ошибку, но не знаю, как пропустить виртуальные столбцы при сохранении данных обратно в базу данных.

Вот мой код:

    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"))

Но при сохранении данных обратно в базу данных выдает ту же ошибку.

Кто-нибудь может помочь, пожалуйста?

Ваше здоровье,


person Thomas Carlton    schedule 13.08.2018    source источник
comment
Я понятия не имею, что такое Dataadapter, но быстрый поиск в Google (очень быстрый!) показывает, что он поддерживает концепцию сопоставления столбцов данных. По-видимому, таблица может поддерживать более одного сопоставления. Вы должны создать сопоставление, которое сопоставляется только с невиртуальными столбцами, и назвать это сопоставление (а не таблицу в общем случае) при вставке в него. См., например, docs.microsoft .com/en-us/dotnet/framework/data/adonet/   -  person mathguy    schedule 14.08.2018


Ответы (2)


Если вы не пытаетесь заполнить или запросить виртуальный столбец, можете ли вы создать представление для этой таблицы, исключающее виртуальный столбец, и работать с этим представлением.

person Gary Myers    schedule 14.08.2018

Когда вы вставляете данные в таблицу с виртуальными столбцами, вы должны перечислить столбцы, т.е. е. вы не должны использовать

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;

Если вы хотите выбрать виртуальные столбцы, но пропустить их для INSERT (или UPDATE), вы можете создать представление с помощью триггера 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;
person Wernfried Domscheit    schedule 13.08.2018
comment
Это не решение. Я не вставляю данные через SQL, но Dataadapter... - person Thomas Carlton; 13.08.2018
comment
Нет, это это решение. Так или иначе, вам придется изменить то, что вы делаете. - person Bob Jarvis - Reinstate Monica; 14.08.2018
comment
@BobJarvis - этот комментарий не совсем имеет смысла. Если OP использует Dataadapter, ему нужно будет использовать любые функции, доступные в этом продукте, для сопоставления входных данных только с невиртуальными столбцами. Он хочет использовать Dataadapter, а не обойти его. - person mathguy; 14.08.2018