2013-09-07 3 views
1

Кто-нибудь успешно использовал System.Data.SQLite.Linq в своем проекте?Неверные операторы SQL, сгенерированные при использовании System.Data.SQLite.Linq

Даже после включения этой DLL в мою ссылку на проект, очевидно, что Linq вызывает неправильный провайдер при создании соответствующих операторов SQL. Он бросает исключение в SQLiteCommand со следующим утверждением:

INSERT INTO [Inbox] 
    ([Sender], [Subject], [Body], [Date], [ConversationID], [RemoteID], [ReplyTo]) 
VALUES 
    (@p0, @p1, @p2, @p3, @p4, @p5, @p6) 

SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value] 

SCOPE_IDENTITY не действует в SQLite. Как я могу направить System.Data.SQLite.DLL на использование SQLite Linq SQL builder при построении операторов SQL?

Мои DbProviderFactories является:

<DbProviderFactories> 
    <remove invariant="System.Data.SQLite"/> 
    <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"/> 
    </DbProviderFactories> 

это правильно?

Дополнительная информация. Я не вижу System.Data.SQLite.Linq.dll в списке модулей VS2012, когда мое приложение загружается, даже если оно находится в папке bin. Это подтверждает мое подозрение, что я пропускаю то, что явно ссылается на него, но я не могу понять, что это такое.

Спасибо!

+0

Какой класс DBconnection вы использовали? –

+0

Я использую SQLiteConnection: string connectionString = @ "Источник данных =" + databasePath + "; поставщик = System.Data.SQLite"; SQLiteConnection db = новый SQLiteConnection (Config.ConnectionString); с использованием (DataContext dc = new DataContext (db)) {// Код идет здесь; } –

ответ

2

на основе дальнейших исследований, представляется, что:

  1. System.Data.SQLite.Linq.dll не могут быть использованы DataContext классов на основе. Возможно использовать его с ObjectContext. Я расследую. Было бы неплохо, если бы люди SQLite.Data прояснили это, но я буду следить за ними отдельно.

  2. DbLinq - альтернатива, но когда я попробовал, ее обработка данных Blob казалась сломанной. В частности, он использует словарь для элементов blob и сохраняет каждый отдельный байт в словаре в качестве значения со смещением в качестве ключа. Это было ужасно медленно. Кроме того, он разбился при обновлении blob с новым значением, которое было больше старого.

  3. Linq2Sql, похоже, не поддерживается, и я не смог заставить его работать вообще из-за некоторой неясной ошибки. Возможно, мои требования немного больше, чем его возможности.

В идеале ObjectContext будет работать. В противном случае я потеряю Linq и вернусь к прямому доступу SQLite. Я по-прежнему приветствую понимание любого, кто смог заставить Linq работать с SQLite. Mine - проект с открытым исходным кодом, поэтому я бы предпочел не использовать коммерческого провайдера.

0

Я нашел System.Data.SQLite.Linq, чтобы быть достаточно глючным.

Используя метод журнального DataContext помогает в просмотре сгенерированного SQL в соответствии с этим ответом https://stackoverflow.com/a/8729736/74585

StringBuilder logBuilder = new StringBuilder(); 
db.Log = new StringWriter(logBuilder); 
string sql = logBuilder.ToString(); 

Например метод LINQ .Первый() будет генерировать SQL с SELECT, TOP (1). .. но TOP (1) не поддерживается в Sqlite. Мне приходилось обнаруживать множество ошибок, подобных этой тропе и ошибкам.

SQLite error when accessing first element in table using LINQ

Смежные вопросы