应用程序 - 数据库访问层 - 各种数据库访问Helper的总结 - SQLiteHelper

时间 2017/9/7 23:03:40 加载中...

一个应用程序中,数据的存储肯定是有的,可以存储到文件中,可以存储到数据库中,可以存储到缓存中。比如常见的日志存储,一般是存储到日志文件中,有时候为了便于查看管理,也会存储在数据库中。而我们常见的各种数据,比如用户信息,用户数据都会存储在数据库中。而当程序到了一定阶段,为了提高性能,就会将数据存储在缓存中。


数据库多种多样,大的有Oracle,常见的有 MS SQLServer,还有MySql,小的还有Access,Sqlite。我接触过的有MS SQLServer,MySql,SQLite。这三个都是做过项目的。

SQLite比较轻量,数据存储就是一个扩展名为db3的文件。使用时不用安装其它软件,这是我喜欢的地方,在小型项目中可以使用,自已建站买个不太好的服务器,不想安装数据库之类的软件,也可以使用。


那么,SQLite如何在项目中使用呢?(.NET项目)


一般情况下,我们要访问SQLite都会用到4个文件。分别是 sqlite3.def 、sqlite3.dll、System.Data.SQLite.dll、System.Data.SQLite.XML。下载


将这4个文件放在项目中


  1. 引用 System.Data.SQLite.dll 文件。

  2. 将 sqlite3.def 、sqlite3.dll 文件放在项目的bin目录下面

  3. 编写 SQLiteHelper 类


SQLiteHelper中要有基本的执行语句Execute命令,查询命令,事务等。完整代码如下:


public static class SQLiteHelper
{
    public static SQLiteConnection GetSQLiteConnection()
    {
        string dbConnection = String.Format("Data Source={0}.db3", AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["sqliteDB"]);
        //string dbConnection = String.Format("Data Source=d:/AntDemoWeb.db3");   
        //Common.Logger.Log(dbConnection);
        return new SQLiteConnection(dbConnection);
    }

    private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, params object[] p)
    {
        if (conn.State != ConnectionState.Open)
            conn.Open();
        cmd.Parameters.Clear();
        cmd.Connection = conn;
        cmd.CommandText = cmdText;
        cmd.CommandType = CommandType.Text;
        cmd.CommandTimeout = 30;
        if (p != null)
        {
            foreach (var item in p)
                cmd.Parameters.AddWithValue(null, item);
        }
    }

    public static DataSet ExecuteDataset(string cmdText, params object[] p)
    {
        DataSet ds = new DataSet();
        SQLiteCommand command = new SQLiteCommand();
        using (SQLiteConnection connection = GetSQLiteConnection())
        {
            PrepareCommand(command, connection, cmdText, p);
            SQLiteDataAdapter da = new SQLiteDataAdapter(command);
            da.Fill(ds);
        }
        return ds;
    }

    public static DataRow ExecuteDataRow(string cmdText, params object[] p)
    {
        DataSet ds = ExecuteDataset(cmdText, p);
        if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
            return ds.Tables[0].Rows[0];
        return null;
    }

    public static int ExecuteNonQuery(string cmdText, params object[] p)
    {
        SQLiteCommand command = new SQLiteCommand();
        using (SQLiteConnection connection = GetSQLiteConnection())
        {
            PrepareCommand(command, connection, cmdText, p);
            return command.ExecuteNonQuery();
        }
    }

    public static SQLiteDataReader ExecuteReader(string cmdText, params object[] p)
    {
        SQLiteCommand command = new SQLiteCommand();
        SQLiteConnection connection = GetSQLiteConnection();
        try
        {
            PrepareCommand(command, connection, cmdText, p);
            SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
            return reader;
        }
        catch
        {
            connection.Close();
            throw;
        }
    }

    public static object ExecuteScalar(string cmdText, params object[] p)
    {
        SQLiteCommand cmd = new SQLiteCommand();
        using (SQLiteConnection connection = GetSQLiteConnection())
        {
            PrepareCommand(cmd, connection, cmdText, p);
            return cmd.ExecuteScalar();
        }
    }

    public static DataSet ExecutePager(ref int recordCount, int pageIndex, int pageSize, string cmdText, string countText, params object[] p)
    {
        if (recordCount < 0)
            recordCount = int.Parse(ExecuteScalar(countText, p).ToString());
        DataSet ds = new DataSet();
        SQLiteCommand command = new SQLiteCommand();
        using (SQLiteConnection connection = GetSQLiteConnection())
        {
            PrepareCommand(command, connection, cmdText, p);
            SQLiteDataAdapter da = new SQLiteDataAdapter(command);
            da.Fill(ds, (pageIndex - 1) * pageSize, pageSize, "result");
        }
        return ds;
    }

    public static DataTable ExecutePager(int pageIndex, int pageSize, string cmdText,params object[] p)
    {
        if (pageIndex <= 1) pageIndex = 1;
        DataSet ds = new DataSet();
        SQLiteCommand command = new SQLiteCommand();
        using (SQLiteConnection connection = GetSQLiteConnection())
        {
            PrepareCommand(command, connection, cmdText, p);
            SQLiteDataAdapter da = new SQLiteDataAdapter(command);
            da.Fill(ds, (pageIndex - 1) * pageSize, pageSize, "result");
        }
        return ds.Tables[0];
    }

    public static int DropTable(string name)
    {
        return ExecuteNonQuery("DROP TABLE IF EXISTS " + name);
    }

    public static bool Exists(string tableName)
    {
        string sql = "select count(*) as count from sqlite_master where type='table' and name= ?";
        return Convert.ToInt32(ExecuteScalar(sql, tableName)) > 0;
    }

    public static void ExecuteTransaction(IList<string> cmdTexts)
    {
        using (SQLiteConnection myconnection = GetSQLiteConnection())
        {
            myconnection.Open();
            using (SQLiteTransaction mytransaction = myconnection.BeginTransaction())
            {
                using (SQLiteCommand mycommand = new SQLiteCommand(myconnection))
                {
                    for (int i = 0; i < cmdTexts.Count; i++)
                    {
                        mycommand.CommandText = cmdTexts[i];
                        mycommand.ExecuteNonQuery();
                    }
                }
                mytransaction.Commit();
            }
        }
    }
}


SQLiteHelper写完之后,就是对其调用,下面说一下基本的使用情况。假如有一个文章类 Article ,我们要通过SQLiteHelper实现以下方法


 public int Add(Article model)  
 public void Update(Article model)  
 public void Remove(int articleId)


对此,我们还是写一个示例程序

示例程序

我们使用Navicat(下载)来创建SQLite数据库。新建链接到SQLite,创建一个名连接名为demo的SQLite3数据库。

之后创建Artilce表。执行下面的语句:


CREATE TABLE [Article] (
  [ArticleId] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [Title] NVARCHAR(50) NOT NULL,   
  [Enable] INT NOT NULL
);


表创建好之后,使用VS新建一个控制台程序,名为:SqliteDemo。按之前说过的方法


  1. 拷贝 sqlite3.def 、sqlite3.dll、System.Data.SQLite.dll、System.Data.SQLite.XML 到项目中  

  2. 引用System.Data.SQLite.dll  

  3. 把sqlite3.def 、sqlite3.dll放到编译后的bin目录下  

  4. 将上面的SQLiteHelper文件添加到项目中。


这样基本工作完成。

添加一个ArticleRepository来实现Add(Article model) Update(Article model) Remove(int articleId) 方法

扫码分享
版权说明
作者:SQBER
文章来源:http://blog.sqber.com/articles/db-access-sqllitehelper.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。