代码之家  ›  专栏  ›  技术社区  ›  andrecarlucci

如何使用ExecuteEscalar从插入的行中获取生成的ID?

  •  14
  • andrecarlucci  · 技术社区  · 15 年前

    我知道 甲骨文公司 我可以从插入的行中获取生成的ID(或任何其他列)作为输出参数。 前任:

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

    有没有办法做到这一点,但使用executescalar而不是executenonquery?

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

    我正在使用 甲骨文公司 ,不是SQL Server!!!!

    5 回复  |  直到 9 年前
        1
  •  8
  •   Will Marcouiller    15 年前

    如果我们可以这么说的话,Oracle使用序列作为他的标识列。

    如果为表主键设置了序列,则还必须编写一个触发器,将sequence.nextvalue等插入主键字段。

    假设您已经熟悉这个概念,只需查询您的序列,就可以得到您的答案。在Oracle中,最常用的方法是使自己成为一个返回int的函数,然后在函数中执行插入操作。假设您已经正确设置了触发器,那么您将能够通过查询返回序列的值。

    下面是一个实例:

    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;
    

    另一方面,如果您不想关心主键增量,可以继续使用触发器。

    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

    希望这有帮助!

        2
  •  24
  •   Christian13467    15 年前

    如果您使用的是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
  •  4
  •   Girish Gupta    9 年前

    您可以使用下面的代码。

        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
  •  1
  •   cranky974    13 年前

    如果可以向表中添加一个名为“guid”的列,则有一种可能的方法: 从C_插入一条记录时,生成一个guid并将其写入guid列。 然后用生成的GUID执行选择,您就得到了插入记录的ID:)

        5
  •  0
  •   musefan    13 年前
    Select  t.userid_pk From Crm_User_Info T
    Where T.Rowid = (select max(t.rowid) from crm_user_info t) 
    

    这将返回您所需的ID