zoukankan      html  css  js  c++  java
  • 用 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语句错误等等。

    处理的办法很简单, 就是在这些语句,手工逐个把空格删掉,然后按一下空格键加上空格。就可以发现自己加的空格位是比较小的,呵呵。


    这些操作没有任何技术含量,但也值得分享一下,

  • 相关阅读:
    Beta-Scum meeting 2
    项目展示
    发布声明
    [敏杰开发]Beta Scrum Meeting 5
    [敏杰开发]Beta Scrum Meeting 4
    [敏杰开发]Beta Scrum Meeting 3
    [敏杰开发]Beta Scrum Meeting 2
    [敏杰开发]Beta Scrum Meeting 1
    [敏杰开发]团队免转会申请
    [知识路书]项目展示
  • 原文地址:https://www.cnblogs.com/zhuawang/p/2860262.html
Copyright © 2011-2022 走看看