2009-08-26 2 views
3

나는 다른 곳에서 다루어 졌다고 생각했지만 지금은 보지 못했다. 어쨌든 간단한 v3 쿼리에 문제가 있습니다. SQLite ADO.NET 공급자 1.0.65.0 사용. 내 테이블 구조는 다음과 같습니다SQLite Int64 대 Int32 문제 및 SubSonic ActiveRecord

CREATE TABLE "SamplerData" ("RowId" INT PRIMARY KEY NOT NULL ,"SampName" VARCHAR(128),"SampPurpose" VARCHAR(2048),"ActiveState" INTEGER NOT NULL DEFAULT 1) 

내 Structs1.cs 파일이이 있습니다

SqlQuery sqlsql = new Select() 
    .From("SamplerData") 
    .Where("ActiveState") 
    .IsEqualTo(1); 
List<SamplerDatum> sampAll = sqlsql .ExecuteTypedList<SamplerDatum>(); 
:

 Columns.Add(new DatabaseColumn("RowId", this) 
     { 
       IsPrimaryKey = true, 
       DataType = DbType.Int32, 
       IsNullable = false, 
       AutoIncrement = false, 
       IsForeignKey = false 
     }); 

     Columns.Add(new DatabaseColumn("SampName", this) 
     { 
       IsPrimaryKey = false, 
       DataType = DbType.AnsiString, 
       IsNullable = true, 
       AutoIncrement = false, 
       IsForeignKey = false 
     }); 

     Columns.Add(new DatabaseColumn("SampPurpose", this) 
     { 
       IsPrimaryKey = false, 
       DataType = DbType.AnsiString, 
       IsNullable = true, 
       AutoIncrement = false, 
       IsForeignKey = false 
     }); 

     Columns.Add(new DatabaseColumn("ActiveState", this) 
     { 
       IsPrimaryKey = false, 
       DataType = DbType.Int32, 
       IsNullable = false, 
       AutoIncrement = false, 
       IsForeignKey = false 
     }); 

나는이처럼 보이는 WPF의 코드 숨김에서 쿼리를이

sqlsql의 값을 표시하도록 설정된 중단 점은 다음을 표시합니다.

{SELECT * FROM `SamplerData` WHERE ActiveState = @0} 
,451,515,

그런 다음 코드로 던졌습니다 :

{ ". 유형 'System.Int64'의 목적은 '선택 System.Int32'을 입력 변환 할 수 없습니다"}

A "찾기"비주얼 스튜디오에서 '는 didn를 Int64 변환이 발생한 위치를 알려주십시오. 나는 SQLite가 ID 열에 대해 Int64를 사용하지만 Structs가 Int32를 Int32로 만들 때 SubSonic이 변환을 처리하지 않는 이유는 이해하지 않습니다.

도와주세요!

감사합니다 ..

답변

4

나는 음속에 대해 잘 모르지만, SQLite는 대한 ADO.NET 클라이언트는 모든 정수 열의 INT64를 사용합니다. SubSonic을 모른 채로 이것은 추측 일 뿐이지 만 DbType.Int32 열을 DbType.Int64로 변경할 수 있습니다.

대부분 쿼리가 실제로 정상적으로 실행되고 있지만 반환 값 (ADO.NET 형식에서는 처음에 형식이 지정되지 않음)은 일부 하위 음영 데이터 구조에 unboxed되고 있습니다. 구조는 사용자가 정의한 32 비트 정수 여야합니다. DbType.Int32 문 unbox a long을 int로 변환 할 수 없습니다 (즉, (int)(object)(long)0이 예외를 throw합니다). 따라서 64 비트 정수가 필요하다고 SubSonic에 알려야합니다. SQLite가 제공 할 것이기 때문입니다.

9

SQLite.tt 파일이 정수 PK를 long (int 64)으로 올바르게 변환하지 못했습니다. Github에서 최신 비트를 가져 오는 경우 해결해야합니다. 템플릿 프로젝트를 가져와야합니다.

+1

Word up. 감사합니다 롭! – Snowy