C#操作SQLite方法實例詳解


用 C# 訪問 SQLite 入門 (1)

 

SQLite 在 VS C# 環境下的開發,網上已經有很多教程。我也是從這些教程開始學習的。而要專門寫下這一篇,是因為按照網上教程的例子,會遇到一些問題,特別是一些細節的設置,沒有具體涉及,往往就讓我這樣的初學者碰壁,明明是全部照搬的卻不斷出錯而不知解決方法。這里就特別記錄和注明我遇到的問題和解決方法,讓其他的初學者可以仿照處理。

 

這里用到的例子和C#語句,都是從網上來的。

 

1. 下載安裝 Sqlite ADO.NET

 

可以從 sourceforge 下載: http://sourceforge.net/projects/sqlite-dotnet2/

安裝則是按提示進行即可

 

2. 建立Sqlite 數據庫文件

 

我是在 Firefox 下,安裝 SQLite Manager 來建立的。例如,建立一個 Books.sqlite 數據庫文件:

 

從 Firefox 菜單 啟動 SQLite Manager, 點 Database -> New Database, 輸入數據庫文件名

 


 

然后選擇保存路徑,例如 把文件保存到 桌面。

 

點 Execute SQL , 在 Enter SQL 區域 輸入建庫語句,如下:

 

Sql代碼   收藏代碼
  1. CREATE TABLE Book  
  2. (  
  3.     ID INTEGER,  
  4.     BookName VARCHAR(50),  
  5.     Price DOUBLE,  
  6.     Rowguid VARCHAR(70),  
  7.     PRIMARY KEY(ID)  
  8. )  
 


 

然后點 Run SQL 即可完成建庫工作。

 

在 SQLite Manager 點 Database -> Close Database, 關閉數據庫並退出 SQLite Manager.

 

 

3. 新建 C# Project, 引用 sqlite

 

新建一個 VC# 的 Windows Form Application, 命名為 dg2 (或其他名)。

 

在 VS 菜單, 點 Project -> Add Reference

 


 

 

在 .NET 下找到 System.Data.SQLite, 點 OK.

 

 

注意了,重點步驟:

 

在 VS 的右邊,Soultion Explor , References, 點 System.Data.SQLite

 


 

然后, 在下面的 Properties 的 Copy Local, 選 True

 

這一步很重要,如果沒有這個設置,以后在Debug 或 Build 后試運行,會提示找不到 System.Data.SQLite

 

4. 加入數據庫文件

 

把數據庫文件放到一個目錄下。先建目錄:

 

在右邊的 Solution Explorer, 在Project名字上點鼠標右鍵,

在彈出選項,選 Add -> New Folder


 

然后,給 New Folder 改個名字, 例如 db

 



 把數據庫文件加入到這個 db 目錄之下。

 

在 db 目錄名上 點鼠標右鍵,在彈出菜單 選 Add -> Existing Item


 

然后,在打開的文件對話框,找到以前建立的數據庫文件。如上面所示的例子,新建的 Books.sqlite 數據庫文件是放在 桌面,我們就從桌面找到和選中這個文件,點 Add,即可把這個文件加入 db 目錄下。

 

點一下 這個數據庫文件,在下面的 Properties 選項 Copy to output Directory , 必須選 Copy always

 

注意: 這個設置很重要。否則就找不到數據庫文件。

 


 

 

5. 建立相關類文件 Class

 

在 VS 菜單, 點 Project -> Add Class, 給個名字 Book.cs , 點 Add, 然后輸入對 Book類 的定義:

 

C#代碼   收藏代碼
  1. public class Book  
  2. {  
  3.     private int id;  
  4.     private string bookName;  
  5.     private decimal price;  
  6.     private string rowguid;  
  7.   
  8.     public int ID  
  9.     {  
  10.         get { return id; }  
  11.         set { id = value; }  
  12.     }  
  13.   
  14.     public string BookName  
  15.     {  
  16.         get { return bookName; }  
  17.         set { bookName = value; }  
  18.     }  
  19.   
  20.     public decimal Price  
  21.     {  
  22.         get { return price; }  
  23.         set { price = value; }  
  24.     }  
  25.   
  26.     public string Rowguid  
  27.     {  
  28.         get { return rowguid; }  
  29.         set { rowguid = value; }  
  30.     }  
  31.   
  32.     public Book()  
  33.     { }  
  34.   
  35.     public Book(int _id, string _bookname, decimal _price, string _rowguid)  
  36.    {  
  37.          id = _id;  
  38.          bookName = _bookname;  
  39.          price = _price;  
  40.          rowguid = _rowguid;  
  41.    }  
  42. }  

 

 

保存。

 

類似步驟,輸入 數據庫操作類: BookDAL.cs

 

C#代碼   收藏代碼
  1. public class BookDAL  
  2. {  
  3.     public static bool CreateBook(Book book)  
  4.     {  
  5.         try  
  6.         {  
  7.             SQLiteConnection conn = new SQLiteConnection("Data Source=db/Books.sqlite;");  
  8.             conn.Open();  
  9.             SQLiteCommand cmd = conn.CreateCommand();  
  10.             cmd.CommandText = "INSERT INTO Book(ID, BookName, Price, Rowguid) VALUES(@ID1, @BookName1, @Price1, @Rowguid1)";  
  11.             cmd.Parameters.Add(new SQLiteParameter("ID1", book.ID));  
  12.             cmd.Parameters.Add(new SQLiteParameter("BookName1", book.BookName));  
  13.             cmd.Parameters.Add(new SQLiteParameter("Price1", book.Price));  
  14.             cmd.Parameters.Add(new SQLiteParameter("Rowguid1", book.Rowguid));  
  15.   
  16.             int i = cmd.ExecuteNonQuery();  
  17.             return i == 1;  
  18.         }  
  19.         catch (SQLiteException se)  
  20.         {  
  21.             MessageBox.Show(se.Message + " \n\n" + se.Source + "\n\n" + se.StackTrace + "\n\n" + se.Data);  
  22.             return false;  
  23.         }  
  24.         catch (ArgumentException ae)  
  25.         {  
  26.             MessageBox.Show(ae.Message + " \n\n" + ae.Source + "\n\n" + ae.StackTrace + "\n\n" + ae.Data);  
  27.             return false;  
  28.         }  
  29.         catch (Exception ex)  
  30.         {  
  31.             //Do any logging operation here if necessary  
  32.             MessageBox.Show(ex.Message + "\n\n" + ex.Source + "\n\n" + ex.StackTrace + "\n\n" + ex.Data);  
  33.             return false;  
  34.         }              
  35.     }  
  36.   
  37.     public static bool UpdateBookByID(Book book)  
  38.     {  
  39.         try  
  40.         {  
  41.             using (SQLiteConnection conn = new SQLiteConnection("Data Source=db/Books.sqlite;"))  
  42.             {  
  43.                 conn.Open();  
  44.                 SQLiteCommand cmd = conn.CreateCommand();  
  45.                 cmd.CommandText = "update Book set BookName=@BookName1,Price=@Price1, Rowguid=@Rowguid1 where ID=@ID1;";  
  46.                 cmd.Parameters.Add(new SQLiteParameter("ID1", book.ID));  
  47.                 cmd.Parameters.Add(new SQLiteParameter("BookName1", book.BookName));  
  48.                 cmd.Parameters.Add(new SQLiteParameter("Price1", book.Price));  
  49.                 cmd.Parameters.Add(new SQLiteParameter("Rowguid1", book.Rowguid));  
  50.                 int i = cmd.ExecuteNonQuery();  
  51.                 return i == 1;  
  52.             }  
  53.         }  
  54.         catch (ArgumentException ae)  
  55.         {  
  56.             MessageBox.Show(ae.Message + " \n\n" + ae.Source + "\n\n" + ae.StackTrace);  
  57.             return false;  
  58.         }  
  59.         catch (Exception ex)  
  60.         {  
  61.             //Do any logging operation here if necessary  
  62.             MessageBox.Show(ex.Message);  
  63.             return false;  
  64.         }  
  65.     }  
  66.   
  67.     public static bool UpdateBookByGuid(Book book)  
  68.     {  
  69.         try  
  70.         {  
  71.             using (SQLiteConnection conn = new SQLiteConnection("Data Source=db/Books.sqlite;"))  
  72.             {  
  73.                 conn.Open();  
  74.                 SQLiteCommand cmd = conn.CreateCommand();  
  75.                 cmd.CommandText = "update Book set ID=@ID1,BookName=@BookName1,Price=@Price1 where Rowguid=@Rowguid1;";  
  76.                 cmd.Parameters.Add(new SQLiteParameter("ID1", book.ID));  
  77.                 cmd.Parameters.Add(new SQLiteParameter("BookName1", book.BookName));  
  78.                 cmd.Parameters.Add(new SQLiteParameter("Price1", book.Price));  
  79.                 cmd.Parameters.Add(new SQLiteParameter("Rowguid1", book.Rowguid));  
  80.                 int i = cmd.ExecuteNonQuery();  
  81.                 return i == 1;  
  82.             }  
  83.         }  
  84.         catch (ArgumentException ae)  
  85.         {  
  86.             MessageBox.Show(ae.Message + " \n\n" + ae.Source + "\n\n" + ae.StackTrace);  
  87.             return false;  
  88.         }  
  89.         catch (Exception ex)  
  90.         {  
  91.             //Do any logging operation here if necessary  
  92.             MessageBox.Show(ex.Message);  
  93.             return false;  
  94.         }  
  95.     }  
  96.   
  97.     public static bool DeleteBook(int ID)  
  98.     {  
  99.         try  
  100.         {  
  101.             using (SQLiteConnection conn = new SQLiteConnection("Data Source=db/Books.sqlite;"))  
  102.             {  
  103.                 conn.Open();  
  104.                 SQLiteCommand cmd = conn.CreateCommand();  
  105.                 cmd.CommandText = "delete from Book where ID=@ID;";  
  106.                 cmd.Parameters.Add(new SQLiteParameter("ID", ID));  
  107.                 int i = cmd.ExecuteNonQuery();  
  108.                 return i == 1;  
  109.             }  
  110.         }  
  111.         catch (ArgumentException ae)  
  112.         {  
  113.             MessageBox.Show(ae.Message + " \n\n" + ae.Source + "\n\n" + ae.StackTrace);  
  114.             return false;  
  115.         }  
  116.         catch (Exception ex)  
  117.         {  
  118.             //Do any logging operation here if necessary  
  119.             MessageBox.Show(ex.Message);  
  120.             return false;  
  121.         }  
  122.     }  
  123.   
  124.     public static Book GetBookByID(int ID)  
  125.     {  
  126.         try  
  127.         {  
  128.             using (SQLiteConnection conn = new SQLiteConnection("Data Source=db/Books.sqlite;"))  
  129.             {  
  130.                 conn.Open();  
  131.                 SQLiteCommand cmd = conn.CreateCommand();  
  132.                 cmd.CommandText = "select * from Book where ID=@ID;";  
  133.                 cmd.Parameters.Add(new SQLiteParameter("ID", ID));  
  134.                 SQLiteDataReader dr = cmd.ExecuteReader();  
  135.                 if (dr.Read())  
  136.                 {  
  137.                     Book book = new Book();  
  138.                     book.ID = dr.GetInt32(0);  
  139.                     book.BookName = dr.GetString(1);  
  140.                     book.Price = dr.GetDecimal(2);  
  141.                     return book;  
  142.                 }  
  143.                 else  
  144.                     return null;  
  145.             }  
  146.         }  
  147.         catch (ArgumentException ae)  
  148.         {  
  149.             MessageBox.Show(ae.Message + " \n\n" + ae.Source + "\n\n" + ae.StackTrace);  
  150.             return null;  
  151.         }  
  152.         catch (Exception ex)  
  153.         {  
  154.             //Do any logging operation here if necessary  
  155.             throw new Exception(ex.Message);  
  156.         }  
  157.     }  
  158.   
  159.     public static DataTable GetAllBook()  
  160.     {  
  161.         DataTable dt = new DataTable();  
  162.         try  
  163.         {  
  164.             SQLiteConnection conn = new SQLiteConnection("Data Source=db/Books.sqlite;");  
  165.             conn.Open();  
  166.             SQLiteCommand cmd = new SQLiteCommand(conn);  
  167.             cmd.CommandText = "SELECT * FROM Book";  
  168.             cmd.CommandType = CommandType.Text;  
  169.             //Console.WriteLine(cmd.CommandText);  
  170.             SQLiteDataReader dr = cmd.ExecuteReader();  
  171.             if (dr.HasRows)  
  172.             {  
  173.                 dt.Load(dr);  
  174.             }  
  175.             else {  
  176.                 //throw new NullReferenceException("No Record Available.");  
  177.             }  
  178.   
  179.             dr.Close();  
  180.             conn.Close();  
  181.                               
  182.         }  
  183.         catch (ArgumentException ae)  
  184.         {  
  185.             MessageBox.Show(ae.Message + " \n\n" + ae.Source + "\n\n" + ae.StackTrace + "\n\n" + ae.Data);  
  186.         }  
  187.         catch (Exception ex)  
  188.         {  
  189.             //throw new Exception(ex.Message);  
  190.             MessageBox.Show(ex.Message + " \n\n" + ex.Source + "\n\n" + ex.StackTrace + "\n\n" + ex.Data);  
  191.         }  
  192.   
  193.         return dt;  
  194.     }  
  195. }  

 

在數據庫操作類,因為涉及數據庫的操作,要在 using 部分,必須加入 using System.Data. SQLite 的引用等語句。

 

C#代碼   收藏代碼
  1. using System.Data;  
  2. using System.Data.SQLite;  
  3. using System.Windows.Forms;  

 

 

注意了:

 

初學者都喜歡用別人的代碼來做練習,拷貝過來,粘貼上去,可減少敲鍵盤的時間。但是,在網頁上拷貝代碼,然后貼到 VS里,會引起很多問題。例如 html 的控制符,空格等等,導致以后程序運行出錯,而且不知道錯誤在哪里。明明在屏幕上看到人家的代碼 與 你的代碼是一樣的,但就是出錯。這個時候,就要仔細看看控制符和代碼的問題。

 

要減少這類問題,在網頁拷貝的代碼, 先粘貼到一個純文本的編輯器,例如 Notepad++ , 然后從 Notepad++ 選擇和復制, 再粘貼到 VS 。

 

對於粘貼過來的代碼,要特別注意其空格。例如, 下面這個就是從粘貼后的代碼:

 


 

可以看到 第14行,18行 等的 空格特別長,當移動光標的時候,它是一個 空格!但實際上它並不是一個空格。一旦運行程序,就會提示記錄記錄為空,實際上是找不到 數據庫文件,或 SQL語句錯誤等等。

 

處理的辦法很簡單, 就是在這些語句,手工逐個把空格刪掉,然后按一下空格鍵加上空格。就可以發現自己加的空格位是比較小的,呵呵。

 


 

這些操作沒有任何技術含量,但也值得分享一下,

C#操作SQLite方法實例詳解

作者:方倍工作室 字體:[增加 減小] 類型:轉載 時間:2015-06-05 我要評論

這篇文章主要介紹了C#操作SQLite方法,以實例形式詳細分析了C#操作SQLite的連接、查詢、插入、修改等相關技巧,需要的朋友可以參考下

本文實例講述了C#操作SQLite方法。分享給大家供大家參考。具體分析如下:

地址:

System.Data.Sqlite入手。。。

首先import/using: 

復制代碼 代碼如下:
using System.Data.SQLite;

 

Connection和Command:

?
1
2
private SQLiteConnection conn; 
private SQLiteCommand cmd;

連接db:

?
1
2
conn = new SQLiteConnection( "Data Source=c:\\test.db" ); 
  conn.Open();

INSERT/UPDATE:

?
1
2
3
4
5
6
cmd = conn.CreateCommand(); 
cmd.CommandText = "INSERT INTO user(email,name) VALUES ('email','name')"
cmd.ExecuteNonQuery(); 
   
cmd.CommandText = "UPDATE userSET name = 'Codelicious' WHERE ID = 1"
cmd.ExecuteNonQuery();

SELECT:

?
1
2
3
4
5
6
7
8
9
10
cmd.CommandText = "SELECT ID, name FROM user"
SQLiteDataReader reader = cmd.ExecuteReader(); 
if (reader.HasRows) 
   while (reader.Read()) 
  
    Console.WriteLine( "ID: " + reader.GetInt16(0)); 
    Console.WriteLine( "name: " + reader.GetString(1)); 
  
}

模板程序:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
using System; 
using System.Data; 
using System.Data.Common; 
using System.Data.SQLite; 
namespace SQLiteQueryBrowser 
    /// <summary> 
    /// 說明:這是一個針對System.Data.SQLite的數據庫常規操作封裝的通用類。 
    /// </summary> 
    public class SQLiteDBHelper 
   
      private string connectionString = string .Empty; 
      /// <summary> 
      /// 構造函數 
      /// </summary> 
      /// <param name="dbPath">SQLite數據庫文件路徑</param> 
      public SQLiteDBHelper( string dbPath) 
     
        this .connectionString = "Data Source=" + dbPath; 
     
      /// <summary> 
      /// 創建SQLite數據庫文件 
      /// </summary> 
      /// <param name="dbPath">要創建的SQLite數據庫文件路徑</param> 
      public static void CreateDB( string dbPath) 
     
        using (SQLiteConnection connection = new SQLiteConnection( "Data Source=" + dbPath)) 
       
          connection.Open(); 
          using (SQLiteCommand command = new SQLiteCommand(connection)) 
         
            command.CommandText = "CREATE TABLE Demo(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE)"
            command.ExecuteNonQuery(); 
            command.CommandText = "DROP TABLE Demo"
            command.ExecuteNonQuery(); 
         
       
     
      /// <summary> 
      /// 對SQLite數據庫執行增刪改操作,返回受影響的行數。 
      /// </summary> 
      /// <param name="sql">要執行的增刪改的SQL語句</param> 
      /// <param name="parameters">執行增刪改語句所需要的參數,參數必須以它們在SQL語句中的順序為准</param> 
      /// <returns></returns> 
      public int ExecuteNonQuery( string sql, SQLiteParameter[] parameters) 
     
        int affectedRows = 0; 
        using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 
       
          connection.Open(); 
          using (DbTransaction transaction = connection.BeginTransaction()) 
         
            using (SQLiteCommand command = new SQLiteCommand(connection)) 
           
              command.CommandText = sql; 
              if (parameters != null
             
                command.Parameters.AddRange(parameters); 
             
              affectedRows = command.ExecuteNonQuery(); 
           
            transaction.Commit(); 
         
       
        return affectedRows; 
     
      /// <summary> 
      /// 執行一個查詢語句,返回一個關聯的SQLiteDataReader實例 
      /// </summary> 
      /// <param name="sql">要執行的查詢語句</param> 
      /// <param name="parameters">執行SQL查詢語句所需要的參數,參數必須以它們在SQL語句中的順序為准</param> 
      /// <returns></returns> 
      public SQLiteDataReader ExecuteReader( string sql, SQLiteParameter[] parameters) 
     
        SQLiteConnection connection = new SQLiteConnection(connectionString); 
        SQLiteCommand command = new SQLiteCommand(sql, connection); 
        if (parameters != null
       
          command.Parameters.AddRange(parameters); 
       
        connection.Open(); 
        return command.ExecuteReader(CommandBehavior.CloseConnection); 
     
      /// <summary> 
      /// 執行一個查詢語句,返回一個包含查詢結果的DataTable 
      /// </summary> 
      /// <param name="sql">要執行的查詢語句</param> 
      /// <param name="parameters">執行SQL查詢語句所需要的參數,參數必須以它們在SQL語句中的順序為准</param> 
      /// <returns></returns> 
      public DataTable ExecuteDataTable( string sql, SQLiteParameter[] parameters) 
     
        using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 
       
          using (SQLiteCommand command = new SQLiteCommand(sql, connection)) 
         
            if (parameters != null
           
              command.Parameters.AddRange(parameters); 
           
            SQLiteDataAdapter adapter = new SQLiteDataAdapter(command); 
            DataTable data = new DataTable(); 
            adapter.Fill(data); 
            return data; 
         
       
     
      /// <summary> 
      /// 執行一個查詢語句,返回查詢結果的第一行第一列 
      /// </summary> 
      /// <param name="sql">要執行的查詢語句</param> 
      /// <param name="parameters">執行SQL查詢語句所需要的參數,參數必須以它們在SQL語句中的順序為准</param> 
      /// <returns></returns> 
      public Object ExecuteScalar( string sql, SQLiteParameter[] parameters) 
     
        using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 
       
          using (SQLiteCommand command = new SQLiteCommand(sql, connection)) 
         
            if (parameters != null
           
              command.Parameters.AddRange(parameters); 
           
            SQLiteDataAdapter adapter = new SQLiteDataAdapter(command); 
            DataTable data = new DataTable(); 
            adapter.Fill(data); 
            return data; 
         
       
     
      /// <summary> 
      /// 查詢數據庫中的所有數據類型信息 
      /// </summary> 
      /// <returns></returns> 
      public DataTable GetSchema() 
     
        using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 
       
          connection.Open(); 
          DataTable data=connection.GetSchema( "TABLES" ); 
          connection.Close(); 
          //foreach (DataColumn column in data.Columns) 
          //{ 
          //  Console.WriteLine(column.ColumnName); 
          //} 
          return data; 
       
     
   
}

完整的程序例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Data; 
using System.Data.Common; 
using System.Data.SQLite; 
using SQLiteQueryBrowser; 
namespace SQLiteDemo 
    class Program 
   
      static void Main( string [] args) 
     
        //CreateTable(); 
        //InsertData(); 
        ShowData(); 
        Console.ReadLine(); 
     
      public static void CreateTable() 
     
        string dbPath = "D:\\Demo.db3"
        //如果不存在改數據庫文件,則創建該數據庫文件 
        if (!System.IO.File.Exists(dbPath)) 
       
          SQLiteDBHelper.CreateDB( "D:\\Demo.db3" ); 
       
        SQLiteDBHelper db = new SQLiteDBHelper( "D:\\Demo.db3" ); 
        string sql = "CREATE TABLE Test3(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,Name char(3),TypeName varchar(50),addDate datetime,UpdateTime Date,Time time,Comments blob)"
        db.ExecuteNonQuery(sql, null ); 
     
      public static void InsertData() 
     
        string sql = "INSERT INTO Test3(Name,TypeName,addDate,UpdateTime,Time,Comments)values(@Name,@TypeName,@addDate,@UpdateTime,@Time,@Comments)"
        SQLiteDBHelper db = new SQLiteDBHelper( "D:\\Demo.db3" ); 
        for ( char c = "A" ; c <= "Z" ; c++) 
       
          for ( int i = 0; i < 100; i++) 
         
            SQLiteParameter[] parameters = new SQLiteParameter[]{ 
              new SQLiteParameter( "@Name" ,c+i.ToString()), 
            new SQLiteParameter( "@TypeName" ,c.ToString()), 
            new SQLiteParameter( "@addDate" ,DateTime.Now), 
            new SQLiteParameter( "@UpdateTime" ,DateTime.Now.Date), 
            new SQLiteParameter( "@Time" ,DateTime.Now.ToShortTimeString()), 
            new SQLiteParameter( "@Comments" , "Just a Test" +i) 
            }; 
            db.ExecuteNonQuery(sql, parameters); 
         
       
     
      public static void ShowData() 
     
        //查詢從50條起的20條記錄 
        string sql = "select * from test3 order by id desc limit 50 offset 20"
        SQLiteDBHelper db = new SQLiteDBHelper( "D:\\Demo.db3" ); 
        using (SQLiteDataReader reader = db.ExecuteReader(sql, null )) 
       
          while (reader.Read()) 
         
            Console.WriteLine( "ID:{0},TypeName{1}" , reader.GetInt64(0), reader.GetString(1)); 
         
       
     
   
  }

在實際情況中,采用通用類大批量插入數據會有些慢,這是因為在System.Data.SQLite中的操作如果沒有指定操作,則會被當做一個事物,如果需要一次性寫入大量記錄,則建議顯式創建一個事物,在這個事務中完成所有的操作比較好,這樣的話比每次操作創建一個事物的效率要提升很多。

最終利用VS2008提供的功能,可以看到里面的數據如下:

需要說明的是在System.Data.SQLite中數據類型的規定不適很嚴格,從創建Test3表的SQL語句來看,表中addDate、UpdateTime、Time分別是DateTime、Date、Time類型字段,但實際上我們插入的時候沒有按照這個規定,最終顯示的結果也是盡量遵循數據庫字段的定義。

總結

System.Data.SQLite確實是一個非常小巧精悍的數據庫,作為對SQLite的封裝(SQLite可以在Android等類型的手機上利用Java訪問),它依然是體較小,同比性能高、內存消耗小、無需安裝僅需一個dll就可以運行的優點(如果在Mobile手機上則需要兩個文件),唯一的一個缺點是沒有比較的GUI(圖形用戶界面),不過正因為如此它才得以體積小。

在實際開發中沒有圖形用戶界面可能有些不便,我們可以使用VS來查看和操作數據,我自己也做了一個小東東,便於管理和維護數據,界面如下:

如果你要開發數據量在10萬條以下的應用,我建議你嘗試使用一下System.Data.SQLite,它或許是一個不錯的選擇。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public static void CreateTable()
{
  string dbPath = "D:\\Demo.db3" ;
  //如果不存在改數據庫文件,則創建該數據庫文件 
  if (!System.IO.File.Exists(dbPath))
  {
   SQLiteDBHelper.CreateDB( "D:\\Demo.db3" );
  }
  SQLiteDBHelper db = new SQLiteDBHelper( "D:\\Demo.db3" );
  string sql = "CREATE TABLE Test3(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,Name char(3),TypeName varchar(50),addDate datetime,UpdateTime Date,Time time,Comments blob)" ;
  db.ExecuteNonQuery(sql, null );
}
public static void InsertData()
{
  string sql = "INSERT INTO Test3(Name,TypeName,addDate,UpdateTime,Time,Comments)values(@Name,@TypeName,@addDate,@UpdateTime,@Time,@Comments)" ;
  SQLiteDBHelper db = new SQLiteDBHelper( "D:\\Demo.db3" );
  for ( char c = "A" ; c <= "Z" ; c++)
  {
   for ( int i = 0; i < 100; i++)
   {
    SQLiteParameter[] parameters = new SQLiteParameter[]{ 
            new SQLiteParameter( "@Name" ,c+i.ToString()), 
          new SQLiteParameter( "@TypeName" ,c.ToString()), 
          new SQLiteParameter( "@addDate" ,DateTime.Now), 
          new SQLiteParameter( "@UpdateTime" ,DateTime.Now.Date), 
          new SQLiteParameter( "@Time" ,DateTime.Now.ToShortTimeString()), 
          new SQLiteParameter( "@Comments" , "Just a Test" +i) 
          };
    db.ExecuteNonQuery(sql, parameters);
   }
  }
}
public static void ShowData()
{
  //查詢從50條起的20條記錄 
  string sql = "select * from test3 order by id desc limit 50 offset 20" ;
  SQLiteDBHelper db = new SQLiteDBHelper( "D:\\Demo.db3" );
  using (SQLiteDataReader reader = db.ExecuteReader(sql, null ))
  {
   while (reader.Read())
   {
    Console.WriteLine( "ID:{0},TypeName{1}" , reader.GetInt64(0), reader.GetString(1));
   }
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM