我知道在 Oracle 中,我可以从插入的行中获取生成的id(或任何其他列)作为输出参数。 例如:
insert into foo values('foo','bar') returning id into :myOutputParameter
有没有办法做同样的事情,但使用ExecuteScalar而不是ExecuteNonQuery?
我不想使用输出参数或存储过程。
ps:我正在使用 Oracle ,而不是sql server !!!
答案 0 :(得分: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);
}
答案 1 :(得分: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;
如果您想自己管理自动增量,请按以下步骤操作:
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 :(得分:4)
您可以使用以下代码。
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);
}
答案 3 :(得分:1)
一种可能的方法,如果可以向表中添加一个名为“guid”的列: 从c#插入一条记录时,生成一个guid并将其写入guid列。 然后使用生成的guid执行选择,并且您已获得插入记录的id:)
答案 4 :(得分:0)
Select t.userid_pk From Crm_User_Info T
Where T.Rowid = (select max(t.rowid) from crm_user_info t)
这将返回您所需的ID