2009-11-27 4 views
3

ExecuteScalar() 쿼리 메서드에 대한 SQLite ADO .Net (sqlite.phxsoftware.com) 설명서에서 "명령을 실행하고 결과 집합의 첫 번째 행의 첫 번째 열을 반환합니다 (if 현재), 또는 결과 집합이 반환되지 않은 경우 null입니다. " 나는 테이블을 만들었습니다SQLite ADO .NET 및 ExecuteScalar()

create table users (id integer primary key, name text) 

을 그리고 ExecuteScalar는()와 큐를 실행 :

select (id) from users where name = @name 

하지만, 아주 이상한 - 내가에만, 'INT'로 retur 값을 캐스팅 할 수 없습니다 ' 긴'! 왜 그런가요? 'id'필드는 'bigint'가 아닌 'integer'로 데이터베이스에 정의되어 있습니까?

답변

5

이것은 SQLite는 "INTEGER PRIMARY 키"때문에 실제로는 정수가 아니라 long (64 비트 정수)입니다. documentation에서 :

모든 SQLite는 테이블의 모든 행은 동일한 테이블 내에서 고유 하는 64 비트 부호있는 정수 키가 있습니다. 이 정수는 일반적으로 "ROWID"라고합니다. rowid는 SQLite 테이블을 구현하는 B- 트리에서 사용되는 실제 키입니다. 행은 rowid 순서로 저장됩니다. rowid 값은 "ROWID", "OID"또는 "ROWID"과 같은 특수한 이름 중 하나를 사용하여 액세스 할 수 있습니다. 열이 INTEGER PRIMARY KEY, 그 열 가 "진짜"데이터베이스 열이 아니라 대신 ROWID의 별칭하게 선언하는 경우

. 일반적인 SQLite 열과 달리 rowid는 NULL이 아닌 정수 값이어야합니다. rowid는 부동 소수점 값, 문자열, BLOB, 또는 NULL을 보유 할 수 없습니다.

INTEGER PRIMARY KEY 열은64 비트 부호있는 정수 rowid에 대한 별칭입니다.

이것은 SQLite의 dynamic typing mechanism의 부작용입니다.

실제로 질문에 대답하기 위해, 값을 32 비트로 맞추면 캐스팅 연산자 나 변환 클래스 만 사용하여 가능하면 값을 검색해야합니다. ID이기 때문에 32 비트 정수로 변환하거나 캐스팅 할 필요가 없습니다.

2

나는 그것을 행동의에 그렇게 언급 할 수 SQLite는 익숙하지 않다, 그러나 이것은 32 비트에서 한 값이 적합으로 작동합니다 :

Convert.ToInt32(...) 
관련 문제