Подтвердить что ты не робот

Как получить сгенерированный идентификатор из вставленной строки с помощью ExecuteScalar?

Я знаю, что в Oracle я могу получить сгенерированный идентификатор (или любой другой столбец) из вставленной строки в качестве выходного параметра. Пример:

insert into foo values('foo','bar') returning id into :myOutputParameter

Есть ли способ сделать то же самое, но используя ExecuteScalar вместо ExecuteNonQuery?

Я не хочу использовать выходные параметры или хранимые процедуры.

ps: Я использую Oracle, а не сервер sql!!!

4b9b3361

Ответ 1

Oracle использует последовательности как для своих столбцов идентичности, если можно так сказать.

Если вы установили последовательность для первичного ключа вашей таблицы, вам также нужно написать триггер, который будет вставлять Sequence.NextValue или так в поле первичного ключа.

Предполагая, что вы уже знакомы с этой концепцией, просто запросите свою последовательность, затем вы получите ответ. То, что очень хорошо практикуется в Oracle, - это сделать себе функцию, которая вернет INT, а затем внутри вашей функции вы выполните свой INSERT. Предполагая, что вы правильно настроили свой триггер, вы сможете вернуть значение своей последовательности, запросив его.

Здесь экземпляр:

CREATE TABLE my_table (
    id_my_table INT PRIMARY KEY
    description VARCHAR2(100) NOT NULL
)

CREATE SEQUENCE my_table_seq
   MINVALUE 1
   MAXVALUE 1000
   START WITH 1
   INCREMENT BY 2
   CACHE 5;

Если вы хотите самостоятельно управлять автоматическим приращением, выполните следующие действия:

INSERT INTO my_table (
    id_my_table,
    description
) VALUES (my_table_seq.NEXTVAL, "Some description");
COMMIT;

С другой стороны, если вы хотите не заботиться о приращении PRIMARY KEY, вы можете продолжить с помощью триггера.

CREATE OR REPLACE TRIGGER my_table_insert_trg
    BEFORE INSERT ON my_table FOR EACH ROW
BEGIN
    SELECT my_table_seq.NEXTVAL INTO :NEW.id_my_table FROM DUAL;
END;

Затем, когда вы вставляете, вы просто вводите инструкцию INSERT следующим образом:

INSERT INTO my_table (description) VALUES ("Some other description");
COMMIT;

После INSERT, я думаю, вы захотите

SELECT my_table_seq.CURRVAL

или что-то вроде этого, чтобы выбрать фактическое значение вашей последовательности.

Вот несколько ссылок, которые помогут:

http://www.orafaq.com/wiki/Sequence

http://www.orafaq.com/wiki/AutoNumber_and_Identity_columns

Надеюсь, это поможет!

Ответ 2

Если вы находитесь в oracle, вам нужно использовать ExecuteNonQuery и ResultParameter. Невозможно написать это как запрос.

using (OracleCommand cmd = con.CreateCommand()) {
    cmd.CommandText = "insert into foo values('foo','bar') returning id into :myOutputParameter";
    cmd.Parameters.Add(new OracleParameter("myOutputParameter", OracleDbType.Decimal), ParameterDirection.ReturnValue);
    cmd.ExecuteNonQuery(); // an INSERT is always a Non Query
    return Convert.ToDecimal(cmd.Parameters["myOutputParameter"].Value);
}

Ответ 3

Вы можете использовать код ниже.

    using (OracleCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = @"INSERT INTO my_table(name, address)
            VALUES ('Girish','Gurgaon India')
            RETURNING my_id INTO :my_id_param";
        OracleParameter outputParameter = new OracleParameter("my_id_param", OracleDbType.Decimal);
        outputParameter.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(outputParameter);        
        cmd.ExecuteNonQuery();        
        return Convert.ToDecimal(outputParameter.Value);
    }

Ответ 4

один из возможных способов, если в таблицу можно добавить один столбец с именем "guid": при вставке одной записи из С#, создайте направляющую и запишите ее в столбец guid. затем выполните выбор с помощью сгенерированного guid, и у вас есть идентификатор вставленной записи:)

Ответ 5

Select  t.userid_pk From Crm_User_Info T
Where T.Rowid = (select max(t.rowid) from crm_user_info t) 

это вернет ваш необходимый id