1. 程式人生 > >C#中使用SQLite資料庫簡介(下)

C#中使用SQLite資料庫簡介(下)

【SQLite管理工具簡介】

推薦以下2款:

Navicat for SQLite:功能非常強大,幾乎包含了資料庫管理工具的所有必需功能,操作簡單,容易上手。唯一的缺點是不能開啟由System.Data.SQLite.dll加密過的資料庫。

Database.Net:臺灣人用.net開發的全能資料庫管理工具,可以管理多種資料庫,包括MSSQL、MYSQL、IBM DB2、Oracle、Access、Excel、OleDb、Odbc等十多種資料庫(或資料介面),功能沒有Navicat那麼多,只包含最基本功能。對SQLite而言,Database.Net最大的優點是支援開啟由System.Data.SQLite.dll加密過的資料庫,且可以隨時對資料庫設定密碼,是.net下開發SQLite必備的小工具。下載地址:

http://fishcodelib.com/Database.htm

建議以Navicat for SQLite為主,Database.Net為輔,只要涉及到資料庫加密時才用後者。

【操作SQLite例項】

操作SQlite的方法基本同其他資料庫相同,但有一些區別:

『例1』整數似乎都是Int64的。

查詢出網站App_Data目錄下“省市.db”資料庫中city表的總記錄數

		SQLiteConnection cn = new SQLiteConnection("Data Source=|DataDirectory|省市.db;Version=3");
		SQLiteCommand cmd = new SQLiteCommand("select count(*) from city", cn);
		cn.Open();
		int recordCount = (int)(Int64)cmd.ExecuteScalar();
		cn.Close();
		Response.Write(recordCount);

SQLite中count函式返回的是一個Int64的整數,這一點同MSSQL、Access等不同。實際上,經過有限的使用發現,似乎所有INTEGER欄位的返回值都是Int64,這一點未經過有效證實。ExecuteScalar方法返回一個object例項,按照C#規定,拆箱時進行標準轉換,必須轉換成該object例項實際儲存的格式,因此分兩步,先轉換成Int64,再轉換成int。當然用.net中某些高階轉換器如Convert.ToInt32方法只要一步就可以了。

『例2』批量增刪改時需要用事務,否則效率很低。

批量插入1000條記錄,每條記錄只有簡單的id、name、password三個欄位:

		SQLiteConnection cn = new SQLiteConnection("Data Source=c:\\測試.db3;Version=3;password=12345");
		SQLiteCommand cmd = new SQLiteCommand("select count(*) from test", cn);
		cn.Open();
		int recordCount = (int)(Int64)cmd.ExecuteScalar();
		Response.Write("當前的總記錄數:" + recordCount + "<br/>");		
		for (int i = 0; i < 1000; i++)
		{
			cmd.CommandText = "insert into test values(@id,@name,@password)";
			cmd.Parameters.AddWithValue("@id", i);
			cmd.Parameters.AddWithValue("@name", "姓名" + i);
			cmd.Parameters.AddWithValue("@password", (i * 2).ToString());
			cmd.ExecuteNonQuery();
		}
		cmd.CommandText = "select count(*) from test";
		recordCount = (int)(Int64)cmd.ExecuteScalar();
		cn.Close();
		Response.Write("當前的總記錄數:" + recordCount + "<br/>");

經過測試,這段程式碼中的for迴圈花費了70000~90000毫秒,一分鐘多!

改用事務執行:

		SQLiteConnection cn = new SQLiteConnection("Data Source=c:\\測試.db3;Version=3;password=12345");
		SQLiteCommand cmd = new SQLiteCommand("select count(*) from test", cn);
		cn.Open();
		int recordCount = (int)(Int64)cmd.ExecuteScalar();
		Response.Write("當前的總記錄數:" + recordCount + "<br/>");
		SQLiteTransaction tran = cn.BeginTransaction();
		cmd.Transaction = tran;
		try
		{
			for (int i = 0; i < 1000; i++)
			{
				cmd.CommandText = "insert into test values(@id,@name,@password)";
				cmd.Parameters.AddWithValue("@id", i);
				cmd.Parameters.AddWithValue("@name", "姓名" + i);
				cmd.Parameters.AddWithValue("@password", (i * 2).ToString());
				cmd.ExecuteNonQuery();
			}
			tran.Commit();
		}
		catch
		{
			tran.Rollback();
			Response.Write("執行出錯!");
		}
		finally
		{
			cmd.CommandText = "select count(*) from test";
			recordCount = (int)(Int64)cmd.ExecuteScalar();
			cn.Close();
			Response.Write("當前的總記錄數:" + recordCount + "<br/>");
		}

經過測試,這段程式碼中的try部分只用了100~150毫秒!開啟事務後,效率非常高!

『例3』一般開發中可以編寫自己的資料庫通用操作類,進一步封裝ADO.NET。

如上面用事務操作的程式碼,改用資料庫通用操作類後:

		SQLiteData md = new SQLiteData("Data Source=c:\\測試.db3;Version=3;password=12345");
		int recordCount = (int)(Int64)md.ExecuteScalar("select count(*) from test");
		Response.Write("當前的總記錄數:" + recordCount + "<br/>");
		md.CreateTransaction();
		try
		{
			for (int i = 0; i < 1000; i++)
				md.ExecuteNonQuery("insert into test values(@id,@name,@password)", "@id", i, "@name", "姓名" + i, "@password", (i * 2).ToString());
			md.CommitTransaction();
		}
		catch
		{
			md.RollBack();
			Response.Write("執行出錯!");
		}
		finally
		{
			recordCount = (int)(Int64)md.ExecuteScalar("select count(*) from test");
			md.Close();
			Response.Write("當前的總記錄數:" + recordCount + "<br/>");
		}

可以看到程式碼精簡了很多。

【SQLite相關有用的連結地址】