2011-04-07 2 views
4

직렬 기본 키가있는 PostgreSQL 테이블에 행을 삽입하려고하는데 삽입 한 후이 열을 검색해야합니다. 나는 다음과 같은 것을 얻었습니다.ExecuteScalar를 사용하여 삽입 할 때 Npgsql을 사용하여 일련 ID 검색

"pais"테이블은 id, pais, capital; id는 직렬 열이며 기본 키입니다.

NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital)", conn); 
query.Parameters.Add(new NpgsqlParameter("nombre", NpgsqlDbType.Varchar)); 
query.Parameters.Add(new NpgsqlParameter("capital", NpgsqlDbType.Varchar)); 
query.Prepare(); 
query.Parameters[0].Value = this.textBox1.Text; 
query.Parameters[1].Value = this.textBox2.Text; 
Object res = query.ExecuteScalar(); 
Console.WriteLine(res); 

테이블에 행을 삽입하지만 "res"값은 null입니다. nexval ('table_sequence')과 함께 삽입하면 null도 반환됩니다.

테이블의 ID를 어떻게 반환 할 수 있습니까? 내가 놓친 게 있니?

미리 감사드립니다.

+0

스칼라로 반환 할 값을 "선택"하는 쿼리를 읽지 않습니까? –

답변

5

는 사용할 필요가 삽입?
삽입물 사이에 다른 삽입물이 생기면 어떻게합니까? "INSERT INTO table (fieldnames) VALUES (values) RETURNING idcolumn"을 사용하지 않는 이유는 무엇입니까?

+0

Excelent! 나는 lastval()을 사용하여 tryied하고 query.Prepare() 행을 사용하지 않고 작동합니다. 링크 된 게시물과 같습니다. 감사! – Cheluis

2

삽입 자체로 인해 값이 반환되지 않습니다. ExecuteScalar를 수행 할 때 말하자면 "Selected"가되도록 단일 값을 찾고 있습니다.

귀하의 문제를 해결하기 위해 귀하의 삽입물을 선택 진술서에 따라야한다고 생각합니다. 만약 t-SQL을 사용한 경우
은 "는 표 (필드 명) 값으로 (@ParamName)를 삽입;" = 그래서

문자열 SQL처럼 이렇게 것이다 + "CAST를 선택 (SCOPE_IDENTITY()을 int로서) ";

ExecuteScalar는 고유 ID를 반환합니다.

postGresql의 정확한 구문을 잘 모르겠지만 잘하면이 문제를 해결할 수 있습니다. 스레드 안전

NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital);select currval('table_sequence');", conn); 
+0

고마워, 내가 postgres – Cheluis

+1

에 그것을 수행하는 방법을 확인합니다 문자열 sql = "INSERT INTO [테이블] (FieldName) VALUES (@ParamName);"+ "SELECT CAST (lastval() AS 정수)"; – Cheluis

+0

좋아요. 정확한 구문을 명확히 해 주셔서 감사합니다. 죄송합니다. SQL Server 토지에서 수년간 길을 잃었습니다. :) – Matt

12

입니다 : 그래서 당신의 선택 문이 같아야합니다 currval(sequencename)

을 : 마지막 ID를 선택하기 위해

+0

깨끗한 솔루션 :) – Florjon

+2

http://www.postgresql.org/docs/8.4/interactive/functions-sequence에서 동일한 "세션"에 있기 때문에 select가 동일한 쿼리에 있으면 스레드로부터 안전합니다.html : "세션 로컬 값을 반환하기 때문에 현재 세션 이후 다른 세션이 nextval을 실행했는지 여부를 예측할 수 있습니다." – markmnl

+0

수락 된 대답이 나에게 적합하지 않았습니다. 이 하나가, 그래서 그것을 추가 주셔서 감사합니다. – Leonard

8
insert into pais(nombre, capital) values(@nombre, @capital) RETURNING id 
enter code here 기본 키

교체 idres 내부

Object res = query.ExecuteScalar(); 

을 사용하는 당신은 PK를해야합니다.

관련 문제