Csharp使用ADO.NET操作SQLite

SQLite是一個簡易的資料庫系統,開放原始碼,可以直接把SQLite綁在程式裡使用,FireFox及Android等軟體也都有內建SQLite。SQLite不需要安裝,看起來就只是一個檔案而已,也可以使用memory模式,讓它存在記憶體中而不需要建立一個檔案存放。

SQLite支援的SQL指令:http://www.sqlite.org/lang_corefunc.html

C#要連接SQLite可以使用open source的System.Data.SQLite,它是一個基於ADO.Net所做與SQLite的溝通介面,目前支援到.net framework 3.5。可於sourceforge下載其dll來使用,就可以了。

下方的範例是介紹如何在Csharp下使用ADO.NET連接與操作SQLite,包含了自動產生SQLite檔案與DataGridView使用class binding datasource方法。

一、建立一個專案,並先將其儲存起來

(需要先建置專案才能使用專案裡的class當做datasource)

01.jpg
02.jpg

二、改變專案使用的Framework

在專案節點上選擇屬性

專案屬性

目標Framework(G):改成.NET Framework 3.5以下

Csharp屬性視窗

告知需要重新啟動專案

告知需要重新啟動專案

三、加入System.Data.SQLite的Dll當做參考

在專案裡的參考節點上按右鍵選加入參考(R)….

06.jpg

找到DLL加入

System.Data.SQLite.dll

參考的節點上可以看到System.Data.SQLite已加入成功

因為原本專案為.NET Framework 4被降為3.5,所以會多出一個無法使用的參考Microsoft CSharp,此時可順便移除掉它。

Microsoft CSharp

四、建立相容模式

SQLite ADO.NET是建立於版本v2.0.50727,所以在比較高的版本會有相容性問題,所以修改app.config或web.config來使其相容使用。

ps.有一說可以在.NET Framework 4.0修改設定則可以使用SQLite ADO.NET

app.config

在startup的tag上加上屬性

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v2.0.50727"/>
  </startup>

在範列裡我們會使用到二種建立SQLite Connection的方法,其中一種為DbProvider,所以需要使用到以下tag內容,放在configuration內就可以了,如果不使用此種DbProvider方法,也可不加。

  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite"/>
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite"/>
    </DbProviderFactories>
  </system.data>
app.config useLegacyV2RuntimeActivationPolicy

五、建立取得Connection的程式與需要使用的class

建立Class

Db.css

以下是使用DbOroviderFactory的方法建立Connection

private static DbProviderFactory fact = DbProviderFactories.GetFactory("System.Data.SQLite");
        public static DbConnection getConnection()

以下是直接使用new SQLiteConnection來建立連線

	public static SQLiteConnection getConnection2()

使用以下語法可以建立SQLite檔案

	SQLiteConnection.CreateFile("db/db.s3db");

SQLite在使用時它的ConnectionString “db/db.s3db”,db為其目錄,而db.s3db為其檔案名稱。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using System.Data.SQLite;
using System.IO;


namespace SQLiteCon
{
    class Db
    {
        private static DbProviderFactory fact = DbProviderFactories.GetFactory("System.Data.SQLite");
        public static DbConnection getConnection()
        {

            if (!Directory.Exists("db"))
            {
                Directory.CreateDirectory("db");
            }
            //檔案不存在時就建立
            if (!File.Exists("db/db.s3db"))
            {
                //自動建立SQLite檔案
                SQLiteConnection.CreateFile("db/db.s3db");
            }
            DbConnection cnn = fact.CreateConnection();
            cnn.ConnectionString = "Data Source=db/db.s3db";
            return cnn;
        }
        public static SQLiteConnection getConnection2()
        {
            if (!Directory.Exists("db"))
            {
                Directory.CreateDirectory("db");
            }
            if (!File.Exists("db/db.s3db"))
                SQLiteConnection.CreateFile("db/db.s3db");
            return new SQLiteConnection("Data Source=db/db.s3db");
        }
    }
}

Class1.cs

提供一個class專門來承載資料內容mytest

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;
using System.Data.Common;

namespace SQLiteCon
{
    //使用SQLiteConnection
    public class mytestnList2
    {
        //利用資料庫查詢把內容查出後存到List的泛型裡
        public List<mytest> getAllList()
        {
            List<mytest> list = new List<mytest>();
            SQLiteConnection conn = Db.getConnection2();

            conn.Open();
            try
            {
                String sql = "select * from mytest";
                SQLiteCommand com = conn.CreateCommand();
                com.CommandText = sql;
                SQLiteDataReader reader = com.ExecuteReader();

                while (reader.Read())
                {
                    mytest idc = new mytest();

                    idc.item_id = reader.GetString(0);
                    idc.item_name = reader.GetString(1);

                    list.Add(idc);

                }




            }
            catch (Exception ex)
            {

                Console.WriteLine(ex);
            }
            finally
            {
                conn.Close();
            }
            return list;
        }
    }

    //使用DbConnection
    public class mytestnList
    {
        //利用資料庫查詢把內容查出後存到List的泛型裡
        public List<mytest> getAllList()
        {
            List<mytest> list = new List<mytest>();
            DbConnection conn = Db.getConnection();

            conn.Open();
            try
            {
                String sql = "select * from mytest";
                DbCommand com = conn.CreateCommand();
                com.CommandText = sql;
                DbDataReader reader = com.ExecuteReader();

                while (reader.Read())
                {
                    mytest idc = new mytest();

                    idc.item_id = reader.GetString(0);
                    idc.item_name = reader.GetString(1);

                    list.Add(idc);

                }

            }
            catch (Exception ex)
            {

                Console.WriteLine(ex);
            }
            finally
            {
                conn.Close();
            }
            return list;
        }
    }

    //資料型態與名稱
    public class mytest
    {
        public String item_id
        {
            set;
            get;
        }
        public String item_name
        {
            set;
            get;
        }
    }
}

六、建立顯示及操作畫面

SQLite操作畫面

把DataGridView的DataSource綁定到bindingSource,二組各自綁定一個bindingSource

DataGridView binding DataSource

建置方案,如此class才會被編譯成dll,在使用資料組態來源精靈時才可以看到

Compiler

把二組的bindingSource都設定其DataSource,利用加入專案資料來源來建立

bindingSource Bind class datasource

類型選擇”物件”

17.jpg

然後選擇先寫好的class myetest

18.jpg
19.jpg

另一組則可直接選取,不需要再使用精靈

20.jpg

畫面已經顯示clas裡所定義的欄位,可以自行修改header的名稱來對應

畫面配置

再來針對四個button建立click event的程式

//移除table
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                using (DbConnection con = Db.getConnection())
                {
                    con.Open();
                    DbCommand cmd = con.CreateCommand();
                    cmd.CommandText = "drop table mytest";
                    cmd.ExecuteNonQuery();
                    con.Close();
                }
            }
            catch (SQLiteException) { };
        }
        //建立table
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                using (DbConnection con = Db.getConnection())
                {
                    con.Open();
                    DbCommand cmd = con.CreateCommand();
                    cmd.CommandText = "create table mytest(item_id TEXT,item_name TEXT);";
                    cmd.ExecuteNonQuery();
                    con.Close();
                }
            }
            catch (SQLiteException) { };
        }
        //新增二筆資料,當測試
        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                using (DbConnection con = Db.getConnection())
                {
                    con.Open();
                    DbCommand cmd = con.CreateCommand();
                    cmd.CommandText = "insert into mytest(item_id ,item_name ) values('111','中文');";
                    cmd.ExecuteNonQuery();
                    cmd.CommandText = "insert into mytest(item_id ,item_name ) values('222','abc');";
                    cmd.ExecuteNonQuery();


                    con.Close();
                }
            }
            catch (SQLiteException) { };
        }
        //載入資料到DataSource,則form的GridView就可以看到資料了
        private void button4_Click(object sender, EventArgs e)
        {
            List<mytest> list = (new mytestnList()).getAllList();
            bindingSource1.DataSource = list;

            List<mytest> list2 = (new mytestnList2()).getAllList();
            bindingSource2.DataSource = list2;
        }

七、執行結果

原本在目錄裡並沒有db/db.s3db的目錄及檔案

22.jpg

由上而下操作後,可以看到GridView裡有了二筆資料

SQLite執行結果

再查看目錄裡已經自動建立SQLite的檔案了

24.jpg

程式碼下載

One thought to “Csharp使用ADO.NET操作SQLite”

發表迴響