C#操作SQLite方法实例详解

  • A+
所属分类:C#

C#操作SQLite方法实例详解_C#教程_脚本之家

C#操作SQLite方法实例详解

这篇文章主要介绍了C#操作SQLite方法,以实例形式详细分析了C#操作SQLite的连接、查询、插入、修改等相关技巧,需要的朋友可以参考下

本文实例讲述了C#操作SQLite方法。分享给大家供大家参考。具体分析如下:
地址:
System.Data.Sqlite入手。。。
首先import/using:
复制代码 代码如下:
using System.Data.SQLite;

Connection和Command:
private SQLiteConnection conn;
private SQLiteCommand cmd;
连接db:
conn = new SQLiteConnection("Data Source=c:\test.db");
 conn.Open();
INSERT/UPDATE:
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:
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));
  }
}
模板程序:
using System;
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
namespace SQLiteQueryBrowser
{
   /// 

   /// 说明:这是一个针对System.Data.SQLite的数据库常规操作封装的通用类。
   /// 

   public class SQLiteDBHelper
   {
     private string connectionString = string.Empty;
     /// 

     /// 构造函数
     /// 

     /// SQLite数据库文件路径      public SQLiteDBHelper(string dbPath)
     {
       this.connectionString = "Data Source=" + dbPath;
     }
     /// 

     /// 创建SQLite数据库文件
     /// 

     /// 要创建的SQLite数据库文件路径      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();
         }
       }
     }
     /// 

     /// 对SQLite数据库执行增删改操作,返回受影响的行数。
     /// 

     /// 要执行的增删改的SQL语句      /// 执行增删改语句所需要的参数,参数必须以它们在SQL语句中的顺序为准      /// 
     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;
     }
     /// 

     /// 执行一个查询语句,返回一个关联的SQLiteDataReader实例
     /// 

     /// 要执行的查询语句      /// 执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准      /// 

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);
     }
     /// 

     /// 执行一个查询语句,返回一个包含查询结果的DataTable
     /// 

     /// 要执行的查询语句      /// 执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准      /// 

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;
         }
       }
     }
     /// 

     /// 执行一个查询语句,返回查询结果的第一行第一列
     /// 

     /// 要执行的查询语句      /// 执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准      /// 
     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;
         }
       }
     }
     /// 

     /// 查询数据库中的所有数据类型信息
     /// 

     /// 
     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;
       }
     }
   }
}
完整的程序例子:
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,它或许是一个不错的选择。
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));

}
 }
}
希望本文所述对大家的C#程序设计有所帮助。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin