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

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

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

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

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

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

Ответы [ 5 ]

25 голосов
/ 27 августа 2009

Если вы используете 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);
}
8 голосов
/ 27 августа 2009

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;

После ВСТАВКИ, я думаю, вы захотите

SELECT my_table_seq.CURRVAL

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

Вот несколько ссылок, чтобы помочь:

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

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

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

4 голосов
/ 02 сентября 2015

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

    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);
    }
1 голос
/ 21 июля 2011

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

0 голосов
/ 22 декабря 2011
Select  t.userid_pk From Crm_User_Info T
Where T.Rowid = (select max(t.rowid) from crm_user_info t) 

это вернет вам необходимый идентификатор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...