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

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

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

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

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

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

如果我们可以这么说,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

希望这可以帮助!

如果您使用的是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); } 

您可以使用以下代码。

  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); } 

一种可能的方法,如果可以向表中添加一个名为“guid”的列:从c#插入一条记录时,生成一个guid并将其写入guid列。 然后使用生成的guid执行选择,并且您已获得插入记录的id 🙂

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

这将返回您所需的ID