2

私は SQLite、Dapper、および DapperExtensions を使用しています。これらはすべて NuGet 経由で最新のものです。

これが私のテーブルのスキーマです...

CREATE TABLE `LibraryInfo` (
    `Id`    INTEGER NOT NULL,
    `Name`  TEXT NOT NULL CHECK(length ( Name ) > 0),
    `Description`   TEXT,
    `Version`   TEXT NOT NULL CHECK(length ( Version ) > 0),
    PRIMARY KEY(Id)
);

その中に、次のデータを含む単一の行があります

ID = "0"
名前 = "テスト ライブラリ"
説明 = "これはテスト ライブラリです"
バージョン = "1.2.3.4"

これがそのテーブルのPOCOです...

public class LibraryInfo
{
    public int    Id          { get; set; }
    public string Name        { get; set; }
    public string Description { get; set; }
    public string Version     { get; set; }
}

DapperExtensions を初期化する方法は次のとおりです (私のテーブルは、このテーブルを除いて複数形です)...

DapperExtensions.DapperExtensions.DefaultMapper = typeof(PluralizedAutoClassMapper<>);

public class LibraryInfoMapper : ClassMapper<LibraryInfo>
{
    public LibraryInfoMapper()
    {
        Table(nameof(LibraryInfo));
        AutoMap();
    }
}

これは、データベースから ID が 0 の単一の行を読み取るためのコードです...

var libraryInfo = connection.Get<LibraryInfo>(0);

それはうまくいきます。しかし、これは失敗します...

libraryInfo.Description = "Test";
connection.Update(libraryInfo);

これが例外です...

System.Data.SQLite.SQLiteException が発生しました ErrorCode=1 HResult=-2147467259 Message=SQL 論理エラーまたは "." の近くにデータベースがありません: 構文エラー Source=System.Data.SQLite StackTrace: at System.Data.SQLite.SQLite3.Prepare( SQLiteConnection cnn、String strSql、SQLiteStatement 前、UInt32 timeoutMS、String& strRemain) InnerException:

理由がわからない!それが生成しているSQLを確認する方法を見つけようとしていますが、その方法や可能かどうかさえわかりません。

ヘルプ!!!

4

1 に答える 1

9

問題は、DapperExtensions 内の SQL 生成のデフォルトの方言が SqlServer であることです。これは、内部で生成された SQL が、Sqlite がサポートしていないテーブル エイリアスで作成されることを意味します。コマンドを発行する前に、Dapper Extensions SQL 方言を Sqlite に変更する必要があります。

DapperExtensions.DapperExtensions.SqlDialect = new DapperExtensions.Sql.SqliteDialect();

これが変更されると、Dapper 拡張機能は Sqlite 形式で SQL コマンドを作成します。

于 2016-07-09T16:59:14.510 に答える