用 C# 訪問 SQLite 入門(1)


原文:http://kingsz1.iteye.com/blog/1109156

 

用 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語句錯誤等等。

 

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

 


 

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


免責聲明!

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



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