1. 程式人生 > >C#使用Sqlite總結

C#使用Sqlite總結

1、下載Sqlite的dll

頁面地址:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

基於本專案的版本,下載Setups for 32-bit Windows (.NET Framework 3.5 SP1)

這個下面有兩個exe,一個帶bundle,一個不帶bundle。

如果要釋出anycpu的應用,應該用不帶bundle的,如果要x86的,應該用帶bundle的。

如果是不帶bundle的,除了System.Data.SQLite.dll還需要SQLite.Interop.dll;如果是帶bundle的,則只需要System.Data.SQLite.dll。

一開始下載的是不帶bundle的,發現SQLite.Interop.dll無法新增引用(注意直接拷貝到當前執行目錄下);另網上有說這個dll需要VC++執行庫支援。因此放棄anycpu改用x86的,在bin下面建立x86資料夾,然後建立Debug資料夾,把System.Data.SQLite.dll放進去。

2、建立專案,對剛才那個dll新增引用

3、連線字串:

"Data Source=xxx.xx;Version=3;Pooling=true;FailIfMissing=false;"

Data Source即資料庫地址,如果只有資料庫名稱,則是在安裝目錄下建立。名稱和字尾都可以任意。

Verion只能是3,即sqlite的版本只能是3。

Pooling即連線池,如果是true即支援連線池,如果有則從連線池獲取,如果沒有則建立,預設這個是true,即預設有連線池存在

FailIfMissing如果(資料庫檔案)丟失則失敗,就是說如果連不到指定的資料庫則失敗,這個值如果是false則如果連不上指定資料庫就建立,預設是false,即預設會自動建立資料庫

4、連線池自動生效

連線池是自動生效的,當資料庫不操作的時候,應該把連線池關閉,才能從外部操作資料庫檔案,比如說使用視覺化軟體開啟資料庫檔案,如果程式有連線池一直連著的話,是操作不了的,釋放連線池:

System.Data.SQLite.SQLiteConnection.ClearAllPools();

5、連線池的概念:

初淺的理解,連線池就是SQLiteConnection本身,事實上並非如此,連線池是比SQLiteConnection更底層的存在。

普通的連線動作是這樣的:

SQLiteConnection.open()->【建立一個數據庫連線】(在這裡面完成邏輯連線+物理連線的建立,非常消耗資源)->連線到實體資料庫

有連線池的連線動作是這樣:

SQLiteConnection.open()->連線池裡有空閒的連線->【使用這個已存在的資料庫連線(可能只需要進行邏輯連線,物理連線本來已完成)】->連線到實體資料庫

SQLiteConnection.open()->連線池裡沒有空閒的連線->【建立一個數據庫連線,並在連線池註冊】->連線到實體資料庫

可見,這個連線池是在背後運作的,並非指SQLiteConnection的例項。而是通過框架背後在自動進行的。

同理,當執行SQLiteConnection.close()的時候,邏輯連線將會取消,並將該資料庫連線釋放到連線池裡。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SQLite;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace TestSqlite
{
    class MySQLiteHelper
    {

        private static string cString = "";

        private MySQLiteHelper() { }

        // 獲取連線字串
        public static string ConnectionString
        {
            get 
            {
                if (string.IsNullOrEmpty(cString)) 
                {
                    // 在App.config-appSettings裡面配置:
                    // <add key="SQLiteConnectionString" value="Data Source=MyDatabase.db;Version=3;"/>
                    cString = ConfigurationManager.AppSettings["SQLiteConnectionString"];
                }
                return cString;
            }
        }

        // 建立表,建立表連線只需要用一次,所以新建並釋放就可以了
        // 直接傳入要執行的sql語句就可以,因為將來可能涉及新增索引等複雜需求,如果用動態建立的方案,侷限性比較大
        public static int CreateTable(string commandText) 
        {
            SQLiteConnection conn = new SQLiteConnection(ConnectionString);
            conn.Open();

            SQLiteCommand command = new SQLiteCommand();
            command.Connection = conn;
            command.CommandText = commandText;
            int val = command.ExecuteNonQuery();

            command.Dispose();// 釋放command
            conn.Close();
            conn.Dispose();

            return val;
        }

        // 引數裡面標記為params即可以傳0個,也可以傳null

        // SQLiteParameter name = MySQLiteHelper.CreateParameter("name", DbType.String, "SUSAN LI");
        // SQLiteParameter sex = MySQLiteHelper.CreateParameter("sex", DbType.Int16, 1);
        // SQLiteParameter age = MySQLiteHelper.CreateParameter("age", DbType.Int16, 30);
        // SQLiteParameter[] pa = new SQLiteParameter[3] { name, sex, age };
        // MySQLiteHelper.ExecuteNonQuery("INSERT INTO USER6 (NAME,SEX,AGE) values (@name,@sex,@age)",pa);
        public static int ExecuteNonQuery(string commandText, params SQLiteParameter[] commandParameters)
        {
            SQLiteConnection conn = new SQLiteConnection(ConnectionString);
            conn.Open();

            SQLiteCommand command = new SQLiteCommand();
            command.Connection = conn;
            command.CommandText = commandText;
            if (commandParameters != null)
                command.Parameters.AddRange(commandParameters);
            int val = command.ExecuteNonQuery();

            command.Dispose();
            conn.Close();
            conn.Dispose();
            return val;
        }

        // 使用傳入已初始化完成並且配置了conn的command
        // 此函式的作用是重用,即如果一個頻繁的資料庫操作,不要總是關閉及開啟,而是要執行完畢再關閉即可
        // 所以在這裡不要執行關閉了
        // 在呼叫之前先要配置conn和command:

        // SQLiteConnection conn = new SQLiteConnection(ConnectionString);
        // conn.Open();
        // SQLiteCommand command = new SQLiteCommand();
        // command.Connection = conn;
        public static int ExecuteNonQuery(SQLiteCommand command, string commandText,params SQLiteParameter[] commandParameters) 
        {
            if (command.Connection.State == ConnectionState.Closed)
                command.Connection.Open();
            command.CommandText = commandText;
            command.Parameters.Clear();
            if (commandParameters != null)
                command.Parameters.AddRange(commandParameters);
            return command.ExecuteNonQuery();
        }

        // 查詢並返回datatable
        public static DataTable ExecuteDataTable(string commandText, params SQLiteParameter[] commandParameters) 
        {
            SQLiteConnection conn = new SQLiteConnection(ConnectionString);
            conn.Open();

            SQLiteCommand command = new SQLiteCommand();
            command.Connection = conn;
            command.CommandText = commandText;
            if (commandParameters != null)
                command.Parameters.AddRange(commandParameters);
            // 開始讀取
            SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
            DataTable data = new DataTable();
            adapter.Fill(data);
            // dispose
            adapter.Dispose();
            command.Dispose();
            conn.Close();
            conn.Dispose();

            return data;
        }
        
        // 建立引數
        public static SQLiteParameter CreateParameter(string parameterName, System.Data.DbType parameterType, object parameterValue)
        {
            SQLiteParameter parameter = new SQLiteParameter();
            parameter.DbType = parameterType;
            parameter.ParameterName = parameterName;
            parameter.Value = parameterValue;
            return parameter;
        }
    }
}

增加:查詢表是否存在:

        public static int IsTableExists(string tableName) 
        {
            SQLiteConnection conn = new SQLiteConnection(ConnectionString);
            conn.Open();

            SQLiteCommand command = new SQLiteCommand();
            command.Connection = conn;
            command.CommandText = "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='" + tableName + "'";
            int val = Convert.ToInt32(command.ExecuteScalar());

            command.Dispose();
            conn.Close();
            conn.Dispose();
            return val;
        }



相關推薦

C#使用Sqlite總結

1、下載Sqlite的dll 頁面地址:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 基於本專案的版本,下載Setups for 32-bit Windows (.NET Fram

C# sqlite在使用cast(sum(a) as decimal) 時認作int型的問題處理

new clas span eof tro exce datarow foreach val sqlite使用cast(sum(a) as decimal),如果a小數部分都是0,那麽填充到Table時,Table中字段會被認作System.Int64類型。 C# 中Dat

常用C++面試總結

pac 占用 .cn 類型 ++ http 內存 ack 總結 指定對齊值:#pragma pack(n),n=1,2,4,8,16改變系統的對齊系數struct和union都是由多個不同的數據類型成員組成, 但在任何同一時刻, union中只存放了一個被選中的成員, 而s

C#流總結(文件流、內存流、網絡流、BufferedStream、StreamReader/StreamWriter、TextReader/TextWriter)

accept ron 格式 初始 oar listener style ble 流數據 一、文件流FileStream類主要用於讀寫磁盤文件。常用於向磁盤存儲數據或讀取配置文件。讀取文件:復制代碼 //文件流:讀取 FileStream fileStream = F

C++知識點總結(更新中)

如果 知識 修飾 區別 知識點總結 str 運算 必須 初始 1. 指針和引用的區別 本質:指針是地址,引用是別名。 對象綁定:指針可以為空,如果前面不加const修飾,可在運行過程中改變其指向的對象;引用不能為空,必須初始化,一旦與對象綁定則不可改變。 對象訪問:指針是間

9.4 C++ 學習總結

ive 整型 發現 文件輸入 文件的 cin c++ 文件 字符 今天沒有看很多,看了兩個內容還不是看的很仔細打算看仔細了在寫剩下的部分。 C++基本的輸入輸出 1、對屏幕的數據與字符串的輸入輸出 主要是對變量的從屏幕上的讀取,以及運算後的輸出,與C語言的內容沒有區別,

9.5 C++學習總結

linux linu clas 定義 初始化 精簡版 linux下 總結 精簡 1、C++兵器譜 主要講的是在Linux和windows環境下C++開發的IDE linux下的一個形象說法是八國聯軍,就是各種的配合 沒有仔細研究等到用到Linux的時候再去仔細看 wind

9.8 C++學習總結2

方法 系統 返回 關於 當前位置 調用函數 bsp 參數 重復 經過幾天的學習 開始逐漸接觸到C++相對重要的部分。 1、內聯函數和函數重載 內聯函數:在函數前 +inline 在用到此函數的時候,直接將代碼嵌到當前位置,主要是避免函數在調用函數的過程中占用過多時間。 因

C語言總結----數據類型+運算符+表達式

cC語言總結----數據類型+運算符+表達式===========================================================================第一部分 數據類型=================================================

C語言總結報告

規劃 為什麽 body 不用 class 宿舍 寫作 方法 學生 1、當初你是如何做出選擇計算機專業的決定的? 經過一個學期,你的看法改變了麽,為什麽? 你覺得計算機是你喜歡的領域嗎,它是你擅長的領域嗎? 為什麽? 當初報考計算機專業,是看到計算機專業在當今社會有良好的發

C# 爬蟲總結

res com cap next name reg quest int read static void Main(string[] args) { //WebRequest request = WebRequest.Create("h

C++ 語言總結

pub 類型轉換 改變 歷史 ace 字符串 UC peid 提前 蔣貴良課程時間:標準C++(11天)QT(8天)=======================《C++程序設計原理與實現》《C++ Primer》=======================聯系: jia

C#基礎總結(二) —— C#開發工具 Visual Studio(IDE)

暫停 基本上 必備 img 包含 adl 裏的 方案 運行 一、Visual Studio   Visual Studio 是微軟公司的一個開發工具集,是C#開發必備利器。下面附上VS2013簡體中文社區版的下載地址:    鏈接:https://pan.baidu.com

C# sqlite no such table 問題

C# ica class ppa cati sqli pre 由於 pan 一般是由於使用相對路徑造成的,使用絕對路徑即可。 string sqlitepath = Application.StartupPath + "\\sqlite.db"; C#

c++引用總結

ber pro views 普通 過程 com http copy acea 引用做函數參數 struct Teacher { char name[64

C# 集合總結

list linked 叠代 eid 可能 查詢 數據 一個 each 1,Array ,ArrayList,List<類型> 數組, 連續分配的,查詢速度快,但增刪不方便 #region 鏈表 2,LinkedList<類型>,LinkedLi

C語言總結的知識點

對程式設計的理解:對資料的操作 內容:資料型別及對應的內容:運算子:程式結構: 修飾符:函式儲存結構:記憶體管理: Gcc編譯: ++++++++++++++++資料型別及對應內容++++++++++++++++基本資料型別:原子資料型別是最小資料單元: 空型別:是所有資料型別的基礎。 構造資料型

C#知識點總結系列:3、C#中Delegate和Event以及它們的區別

的區別 sent () exit 功能 final 通知 bsp t對象 1.Monitor.Enter(object)方法是獲取鎖,Monitor.Exit(object)方法是釋放鎖,這就是Monitor最常用的兩個方法,當然在使用過程中為了避免獲取鎖之後因為異常,致鎖

C檔案包含.h檔案和包含.c檔案總結

原文連結:http://blog.csdn.net/yangtalent1206/article/details/6830051        很多人對C語言中的 “檔案包含”都不陌生了,檔案包含處理在程式開發中會給我們的模組化程式設計帶來很大的好處

[email protected],c總結

問題0:元素內聯元素,行內元素,行內塊元素.         內聯: 寬高M,P都有效         行內元素:無寬高,內容撐開,M,P左右有效