如何使用ExecuteScalar从插入的行中获取生成的id?

and*_*cci 14 c# oracle ado.net

我知道在Oracle中我可以从插入的行中获取生成的id(或任何其他列)作为输出参数.例如:

insert into foo values('foo','bar') returning id into :myOutputParameter
Run Code Online (Sandbox Code Playgroud)

有没有办法做同样的事情,但使用ExecuteScalar而不是ExecuteNonQuery?

我不想使用输出参数或存储过程.

ps:我使用的是Oracle,而不是sql server!

Chr*_*467 25

如果您使用的是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);
}
Run Code Online (Sandbox Code Playgroud)


Wil*_*ler 8

如果我们可以这么说,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;
Run Code Online (Sandbox Code Playgroud)

如果您想自己管理自动增量,请按以下步骤操作:

INSERT INTO my_table (
    id_my_table,
    description
) VALUES (my_table_seq.NEXTVAL, "Some description");
COMMIT;
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您不想关心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;
Run Code Online (Sandbox Code Playgroud)

然后,当您插入时,只需键入INSERT语句,如下所示:

INSERT INTO my_table (description) VALUES ("Some other description");
COMMIT;
Run Code Online (Sandbox Code Playgroud)

INSERT之后,我想你会想要

SELECT my_table_seq.CURRVAL
Run Code Online (Sandbox Code Playgroud)

或类似的东西来选择序列的实际值.

以下是一些帮助链接:

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

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

希望这可以帮助!