SQLite Int64 vs Int32 Проблема и SubSonic ActiveRecord - PullRequest
3 голосов
/ 26 августа 2009

Я думал, что это было покрыто в другом месте, но я не вижу этого сейчас. Во всяком случае, возникли проблемы с простым запросом v3. Использование SQLite ADO.NET провайдера 1.0.65.0. Моя структура таблицы выглядит следующим образом:

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

Файл My Structs1.cs содержит:

        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, который выглядит следующим образом:

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

Точка останова, установленная для отображения значения sqlsql, показывает это:

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

Затем код выдает:

{"Объект типа 'System.Int64' нельзя преобразовать в тип 'System.Int32'."}

«Найти» в Visual Studio не показывало, где происходило преобразование Int64. Я понимаю, что SQLite использует Int64 для столбцов идентификаторов, но не то, почему / как SubSonic обрабатывает преобразование, когда Structs в любом случае делает его Int32.

Помощь?!

Спасибо ..

Ответы [ 2 ]

9 голосов
/ 26 августа 2009

Мы исправили это в последней версии - файл SQLite.tt неправильно переводил целое число PK в long (int 64). Если вы захватите последние биты в Github, это должно быть решено. Убедитесь, что вы взяли из проекта шаблонов.

4 голосов
/ 26 августа 2009

Я не знаю много о SubSonic, но клиент ADO.NET для sqlite использует int64 для всех целочисленных столбцов. Не зная SubSonic, это всего лишь предположение, но вы можете изменить столбцы DbType.Int32 на DbType.Int64.

Скорее всего, запрос на самом деле выполняется нормально, но возвращаемые значения (изначально нетипизированные в ADO.NET) распаковываются в некоторые структуры данных SubSonic - структуры, которые, по его мнению, должны быть 32-разрядными целыми числами, основанными на вашем DbType .32 Заявление. Вы не можете распаковать long в int (то есть (int)(object)(long)0 вызовет исключение) - поэтому вы должны указать SubSonic ожидать 64-битные целые числа, поскольку это то, что SQLite даст вам.

...