应用程序 - 数据库访问层 - 各种数据库访问Helper的总结 - SQLiteHelper
一个应用程序中,数据的存储肯定是有的,可以存储到文件中,可以存储到数据库中,可以存储到缓存中。比如常见的日志存储,一般是存储到日志文件中,有时候为了便于查看管理,也会存储在数据库中。而我们常见的各种数据,比如用户信息,用户数据都会存储在数据库中。而当程序到了一定阶段,为了提高性能,就会将数据存储在缓存中。
数据库多种多样,大的有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个文件放在项目中
引用 System.Data.SQLite.dll 文件。
将 sqlite3.def 、sqlite3.dll 文件放在项目的bin目录下面
编写 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。按之前说过的方法
拷贝 sqlite3.def 、sqlite3.dll、System.Data.SQLite.dll、System.Data.SQLite.XML 到项目中
引用System.Data.SQLite.dll
把sqlite3.def 、sqlite3.dll放到编译后的bin目录下
将上面的SQLiteHelper文件添加到项目中。
这样基本工作完成。
添加一个ArticleRepository来实现Add(Article model) Update(Article model) Remove(int articleId) 方法
*昵称:
*邮箱:
个人站点:
*想说的话: