2011-10-10 2 views
2

두 가지 기능이 있습니다.SQLite는 연결이 닫힌 후 마지막 행 ID를 얻습니다.

하나 데이터베이스에 삽입하십시오. 삽입 후 연결을 열고 닫습니다. 기타 GetLastID 함수입니다.

나는 가장 큰 신분증을 질문 할 수 있지만 나는 나쁜 습관이라고 들었다.

"SELECT sqlite_last_insert_rowid();" 삽입 후 연결을 닫을 것이므로 사용하지 않는 것 같습니다.

답변

3

데이터를 삽입하고 동일한 연결을 사용하여 ID를 검색해야합니다 (닫지 않고).

string sql = "Insert into Product (Name) values(@Name); SELECT last_insert_rowid() AS ProductID;"; 

다음 당신은 ROWID를 얻을 수 ExecuteNonQuery()ExecuteScalar() 기능 대신 명령 개체를 사용해야합니다 :

당신은 아래의 SQL과 유사한 일을 할 것입니다.

테이블에 ProductID이라는 열 (일반적으로 자동 증가가있는 INTEGER 및 기본 키로 설정)이 있는지 확인하십시오.

0

성격 상 last_insert_rowid() (및 다른 데이터베이스의 유사한 기능)는 현재 연결에서만 작동합니다. 연결을 닫기 전에 last_insert_rowid()에 쿼리 할 코드를 리펙토링 할 수 있습니까?

그 이유가 무엇이든간에 가능하지 않다면, 가장 큰 ID를 쿼리하는 것만 남았을 것입니다. 그 직후에 다른 행이 삽입되어서 생각하는 행의 ID를 얻는다는 것을 보장 할 수 없기 때문에 이것은 나쁜 습관으로 간주됩니다. 대신에 쿼리 할 수있는 고유 인덱스가있는 데이터베이스의 다른 열이 있습니까? 즉, 다음과 같습니다.

SELECT id FROM users WHERE email = '[email protected]' 

은 고유 한 이메일이 보장되는 경우 신뢰할 수있는 대체 방법입니다.