本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^
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"}