2020年12月13日日曜日

mssql, asp.net core // c# and sqlite

dotnet ef dbcontext scaffold "Server=localhost\SQLEXPRESS;Database=blazordb;Trusted_connection=True" Microsoft.EntityFrameworkCore.SqlServer -o Models

文字列はsqlサーバインスト時以外に確認むつかしい

--------------------------------------------------------------------------------------

tuyano shoda の asp.net core 3.0入門の第四章から最新のasp.net core 5.0 に

置き換えてスキャホールディングに成功(core,design,sqlserver....sqlite not ye)

--------------------------------------------------------------https://3ryupg.hatenablog.com/entry/2018/03/12/2000002018-03-12 

原文を数か所変更したら成功した

(.Net,SQLite)データベースにSQLiteを使ってみた

.Net開発 ADO.Net SQLite C#

.Netアプリでスタンドアロンデータベースを使うときはいつもMDBを使ってたんですが、

今回はじめてSQLiteを使ってみました。

.Netアプリケーションから SQLite にアクセスする方法はいくつかあるらしいですが、

今回はVB.NETから組み込みデータベースのSQLiteを操作する方法 

| ラシカル開発記 を参考にさせてもらい System.Data.SQLite を使ってみました。


環境設定

System.Data.SQLite は http://sourceforge.net/projects/sqlite-dotnet2/files/から

ダウンロードできます。

setup版と、バイナリ版がありますが、バイナリ版をダウンロードし、System.Data.SQLite.DLL と System.Data.SQLite.XML を 

VisualStudioのプロジェクトフォルダに置けばOKです。(System.Data.SQLite.Linq.dllも]あるので、これを使えばLINQでアクセスできるのかもしれません)


VS側では、System.Data.SQLite.DLL を参照設定してやります。


ローカルのSQLiteの中身をWindowsPC上で編集したりデータ覗いたりするのはPupSQLite、もしくはTkSQLiteが便利です。

(WEBだと、SQLiteManagerが定番らしいですが。。)


なお、Windows用のコマンドは、http://www.sqlite.org/download.htmlからダウンロードできます。

接続

System.Data.SQLite はよくできており他のデータプロバイダとほぼ同じ感覚で使うことができます。接続は以下のような感じで出来ます。

using System.Data.SQLite;

//コネクションオブジェクト生成

SQLiteConnection sqlite_con = new SQLiteConnection();

//SQLite接続文字列定義

sqlite_con.ConnectionString = "Version=3;Data Source=test.sqlite;Compress=True;";

//DB接続

sqlite_con.Open();


//クエリ実行


//DBクローズ

sqlite_con.Close();

接続文字列についてです。


"Data Source=":SQLiteのデータベーファイルへのパスを指定。

"New=":Trueを入れると、新規データベーファイルを作成。(既にファイルが存在するとエラーになります) Falseなら既に存在するデータベーファイルを開くことになる。

"Version=":3固定。

"Password=":データベースのパスワードを指定。

"Synchronous=": 同期の設定。Normalだとディスク書き込み中にクラッシュした場合確率は低いがデータベースが壊れる可能性有り。 

Fullだと最も安全だが低速。Offだと高速だけどクラッシュすると壊れる可能性高い。

"Max Pool Size=":接続プールの最大接続数。この値を超えた接続要求があると、接続が空くまで待ち状態。

"Read Only=": Trueだと読み取り専用で開く。

詳しくは、System.Data.SQLiteの接続文字列で使用できる引数の説明 | ラシカル開発記で詳しく説明されています。


データベースファイル、テーブル作成::データベースファイルを新規に作成し、テーブルを作るサンプルはこんな感じです。


using System.Data.SQLite;

using System.Data; // DbTypeが定義されている

//コネクションオブジェクト生成

SQLiteConnection sqlite_con = new SQLiteConnection();

//SQLite接続文字列定義

sqlite_con.ConnectionString = "Version=3;Data Source=test.sqlite;New=True;Compress=True;";

//DB接続

sqlite_con.Open();

//コマンドオブジェクト生成

SQLiteCommand sqlite_cmd = sqlite_con.CreateCommand();


//テーブル作成クエリ

sqlite_cmd.CommandText  = "CREATE TABLE hoge (  id INTEGER , name TEXT , value  REAL)";

//クエリ実行

sqlite_cmd.ExecuteNonQuery();


//データ挿入

sqlite_cmd.CommandText = "INSERT INTO hoge ( id , name , value ) VALUES ( @id , @name , @value  )"

//クエリのパラメータ設定

sqlite_cmd.Parameters.Add("id", DbType.Int32);

sqlite_cmd.Parameters["id"].Value = 1;

sqlite_cmd.Parameters.Add("name", DbType.String);

sqlite_cmd.Parameters["name"].Value = "test";

sqlite_cmd.Parameters.Add("value", DbType.Double);

sqlite_cmd.Parameters["value"].Value = 0.002;


//挿入処理実行。戻り値は影響を受けた行数

int ret = sqlite_cmd.ExecuteNonQuery();


//DBクローズ

sqlite_con.Close(); 

----------------------------------------------------------------ここまで成功

データ参照クエリ

selectする場合はこんな感じ。


SQLiteConnection sqlite_con = new SQLiteConnection();

//SQLite接続文字列定義

sqlite_con.ConnectionString = "Version=3;Data Source=test.sqlite;Compress=True;";

//DB接続

sqlite_con.Open();

SQLiteCommand sqlite_cmd = sqlite_con.CreateCommand();

sqlite_cmd.CommandText = "SELECT id , name , value FROM hoge WHERE name LIKE @nameparam ";

//クエリのパラメータ設定

sqlite_cmd.Parameters.Add("nameparam", DbType.String);

sqlite_cmd.Parameters["nameparam"].Value = "test%";

//クエリ実行 結果はDataReaderで取得

SQLiteDataReader reader = sqlite_cmd.ExecuteReader();


 DataReaderでループして読み込む場合は以下のようにする。

while (reader.Read())

{

    Console.WriteLine(reader["id"] + "," + reader["name"] + "," + reader["value"] );

}


//接続終了

sqlite_con.Close();

------------------------------------------------------------------ これも成功

使ってみた感想としては十分MDBの代わりになるんじゃないかと思います。ただ、今回DLLを直接参照しただけなので、

VisualStudioのデータセットデザイナのウィザードからデータベースを参照することは出来ませんでした。インストール版であればいけるのかもしれません。

------------------------------------------------------------------- 以下は参考程度

https://codezine.jp/article/detail/2823 :: mono and sqlite 1

https://codezine.jp/article/detail/2851 :: mono and sqlite 2