source

ExecuteScalar를 사용하여 삽입된 행에서 생성된 ID를 가져오는 방법은 무엇입니까?

manycodes 2023. 7. 20. 22:03
반응형

ExecuteScalar를 사용하여 삽입된 행에서 생성된 ID를 가져오는 방법은 무엇입니까?

Oracle에서는 삽입된 행에서 생성된 ID(또는 다른 열)를 출력 매개 변수로 가져올 수 있습니다.예:

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

ExecuteNonQuery 대신 ExecuteScalar를 사용하여 동일한 방법이 있습니까?

출력 매개 변수나 저장 프로시저를 사용하지 않습니다.

ps: 저는 sql server가 아닌 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);
}

Oracle은 ID 열에 대해 시퀀스를 사용합니다.

테이블 기본 키에 대한 시퀀스를 설정한 경우 시퀀스를 삽입할 트리거도 작성해야 합니다.기본 키 필드에 다음 값을 입력합니다.

이미 이 개념에 익숙하다고 가정하고 시퀀스에 질문하면 답변을 얻을 수 있습니다.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;

반면에, 기본 키 증가에 대해 관심을 갖지 않으려면 트리거를 진행할 수 있습니다.

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

이것이 도움이 되길 바랍니다!

아래 코드를 사용할 수 있습니다.

    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를 반환합니다.

언급URL : https://stackoverflow.com/questions/1336911/how-to-get-the-generated-id-from-an-inserted-row-using-executescalar

반응형