C# Microsoft.Data.Sqlite でdataadapterを使いたい SQLiteのINTEGER型はInt64に注意

Microsoft.Data.SqliteにはDataAdapterがない

DbDataAdapter は、Microsoft.Data.Sqlite ではまだ実装されていません。 つまり、ADO.NET の DataSet と DataTable はデータの読み込むのみに使用でき、更新には使用できません。

ADO.NET の制限事項

Microsoft.Data.Sqliteを利用してパスワード保護をしています。データテーブルにDataAdapterを利用してfillしたいのですが、これができない、、、。

テーブル読込とDataAdapterを使いたい

Microsoft.Data.Sqliteを利用していると、DataAdapter,DataTableが使えないのですが、DataAdapter,DataTableを使う方法があります。

ここでSystem.Data.SQLiteを使ってDataAdapter,DataTableを拝借します。

System.Data.SQLiteをNuGETします。

private void B_DBRead_Click(object sender, RoutedEventArgs e)
{
    System.Data.Common.DbProviderFactory factory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SQLite");

    using (SqliteConnection con = new SqliteConnection(connectionString))
    {
        // DataTableを生成します。
        var dataTable = new DataTable();

        // コマンドを作る
        System.Data.Common.DbCommand command = con.CreateCommand();
        command.CommandText = "SELECT * FROM t_product";
        command.CommandType = CommandType.Text;
        command.Connection = con;

        // SQLの実行
        var adapter = factory.CreateDataAdapter();
        adapter.SelectCommand = command;
        adapter.Fill(dataTable);

        dataGrid.DataContext = dataTable;
    }
}

 

データ型に注意

datatableに取得した値を、表示させようと思ったらエラーがでるところがありました。

どうも、SQLiteで取り扱われるINTEGER型をDataTableに取り込むと Int64になるようです。

C#では、intはSystem.Int32で、System.Int64はlongであることに注意

C#でDataTableのカラムのデータ型を読んでみた

なかなか一筋縄ではいきませんでした。

DataTable型変換 longからIntへ

datatableに取得する際に、long型からInt型に変換できないものかと探したところ、こちらに記載があり、うまくいきました。

//SQLiteのINTEGER型はSystem.Int64になっているので、Sysmtem.Int32に変更
adapter.FillSchema(dataTable, SchemaType.Source);
dataTable.Columns["cd"].DataType = typeof(Int32);
adapter.Fill(dataTable);

 

FillSchemaでスキーマを呼び出して、Int型にしておきたいフィールドのタイプをInt型に指定したあと、Fill します。すると、データ型は指定された型でFillされます。

dataTable.Columns["cd"].DataType
{Name = "Int32" FullName = "System.Int32"}