一、背景介绍
SQLite是一个轻量级的关系型数据库,具有体积小,速度快,操作简便,易于集成等优点,在嵌入式设备,移动设备及桌面应用程序等方面得到广泛使用。C#语言作为一个跨平台的编程语言,在各个领域的应用也十分广泛,同时也提供了SQLite数据库的连接方式,提供SQLite连接C#的API。虽然C#提供了一些SQLite的API,但是操作SQLite数据库仍然比较繁琐,不能像操作SQL SERVER数据库那样简单便捷。因此,我们需要封装SQLite API来减少我们的编码量。
二、实现方法
SQLiteHelper是一个对SQLite ADO.NET的数据库操作类库,提供了很多方便的方法帮助我们完成SQLite的数据操作。它可以极大程度地减少开发者的编码量。
- 导入SQLiteHelper类库
创建一个类库项目,将SQLiteHelper.cs文件拷贝至该项目根目录后添加。在该类库项目中modify AssemblyInfo.cs文件,使该类集合能够被引用到其他项目中。
[assembly: AssemblyTitle("SQLiteHelper")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SQLiteHelper")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("f6a8f27a-a98f-4743-a666-7df67b3acbc0")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
- 创建SQLiteHelper类
为实现C#基于SQLiteHelper类实现存取Sqlite数据库的方法,我们需要新建类SQLiteHelper,来实现SQLite ADO.NET的数据库操作。SQLiteHelper类需要与SQLiteHelper.cs的不同8个方面有所变化,分别是:
·数据库路径不再写死而是动态传入;
·多个线程安全问题,在每个执行线程中都需要独立运行,所以需要每个连接都开一个对象来访问,否则会出现链接不断开的问题;
·增加函数QueryValueSql返回查询结果第一行第一列的值;
·增加函数QueryDataTableSql返回查询结果的DataTable对象;
·增加函数QueryDataSetSql返回查询结果的DataTable对象;
·增加函数UpdateDataTableSql,通过传入DataTable对象进行更新;
·增加函数UpdateDataSetSql,通过传入DataSet对象进行更新;
·修正了SQLiteCommand对象没有释放引起的Application锁死;
·增加SQL注入防范。
修改后的SQLiteHelper核心代码如下:
using System.Data;
using System.Data.SQLite;
namespace SQLiteHelper
{
public class SQLiteHelper
{
string dbPath;
public SQLiteHelper(string dbPath)
{
this.dbPath = dbPath;
}
private int ExecuteNonQuery(SqlCommand cmd)
{
using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath + ";")){
cmd.Connection = conn;
conn.Open();
int result = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return result;
}
}
private object ExecuteScalar(SqlCommand cmd)
{
using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath + ";")){
cmd.Connection = conn;
conn.Open();
object obj = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return obj;
}
}
public int ExecuteNonQuerySql(string sql, params SqlParameter[] parameters)
{
using (SQLiteCommand cmd = new SQLiteCommand(sql)){
if (parameters != null)
cmd.Parameters.AddRange(parameters);
return ExecuteNonQuery(cmd);
}
}
public object ExecuteScalarSql(string sql, params SqlParameter[] parameters)
{
using (SQLiteCommand cmd = new SQLiteCommand(sql)){
if (parameters != null)
cmd.Parameters.AddRange(parameters);
return ExecuteScalar(cmd);
}
}
public DataTable QueryDataTableSql(string sql, params SqlParameter[] parameters)
{
using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath + ";")){
SQLiteDataAdapter adapter = new SQLiteDataAdapter(sql, conn);
if (parameters != null)
adapter.SelectCommand.Parameters.AddRange(parameters);
DataTable table = new DataTable();
adapter.Fill(table);
return table;
}
}
public DataSet QueryDataSetSql(string sql, params SqlParameter[] parameters)
{
using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath + ";")){
SQLiteDataAdapter adapter = new SQLiteDataAdapter(sql, conn);
if (parameters != null)
adapter.SelectCommand.Parameters.AddRange(parameters);
DataSet ds = new DataSet();
adapter.Fill(ds);
return ds;
}
}
public object QueryValueSql(string sql, params SqlParameter[] parameters)
{
using (SQLiteCommand cmd = new SQLiteCommand(sql)){
if (parameters != null)
cmd.Parameters.AddRange(parameters);
return ExecuteScalar(cmd);
}
}
public int UpdateDataTableSql(DataTable table, string tableName)
{
string sql = string.Format("select top 0 * from {0}", tableName);
using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath + ";"))
{
SQLiteDataAdapter adapter = new SQLiteDataAdapter(sql, conn);
SQLiteCommandBuilder cmdBuilder = new SQLiteCommandBuilder(adapter);
adapter.UpdateCommand = cmdBuilder.GetUpdateCommand();
adapter.InsertCommand = cmdBuilder.GetInsertCommand();
adapter.DeleteCommand = cmdBuilder.GetDeleteCommand();
return adapter.Update(table);
}
}
public int UpdateDataSetSql(DataSet ds, string tableName)
{
string sql = string.Format("select top 0 * from {0}", tableName);
using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath + ";"))
{
SQLiteDataAdapter adapter = new SQLiteDataAdapter(sql, conn);
SQLiteCommandBuilder cmdBuilder = new SQLiteCommandBuilder(adapter);
adapter.UpdateCommand = cmdBuilder.GetUpdateCommand();
adapter.InsertCommand = cmdBuilder.GetInsertCommand();
adapter.DeleteCommand = cmdBuilder.GetDeleteCommand();
return adapter.Update(ds);
}
}
}
}
- 调用SQLiteHelper类
调用SQLiteHelper类需要其他程序集引用此类。程序中创建SQLiteHelper实例后,调用SQLiteHelper提供的方法实现SQLite的数据操作。
public partial class Form1 : Form
{
SQLiteHelper.SQLiteHelper sqliteHelper;
public Form1()
{
InitializeComponent();
string dbPath = @"D:\test.db";
sqliteHelper = new SQLiteHelper.SQLiteHelper(dbPath);
}
private void button1_Click(object sender, EventArgs e)
{
string sql = "select * from tb_user";
DataTable dt = sqliteHelper.QueryDataTableSql(sql, null);
dataGridView1.DataSource = dt;
}
private void button2_Click(object sender, EventArgs e)
{
string sql = "insert into tb_user(id,name,age) values (@id,@name,@age)";
SQLiteParameter[] parameters = new SQLiteParameter[]{
new SQLiteParameter("@id","20180316001"),
new SQLiteParameter("@name","Lucy"),
new SQLiteParameter("@age",21)
};
int result = sqliteHelper.ExecuteNonQuerySql(sql, parameters);
if (result > 0)
{
MessageBox.Show("添加成功!");
}
else
{
MessageBox.Show("添加失败!");
}
}
}
三、示例说明
我们在项目中使用SQLite数据库时,只需引用SQLiteHelper类库,以及在需要操作SQLite数据库的类中创建SQLiteHelper对象,即可调用SQLiteHelper的方法,轻松实现数据的操作。下面给出两个示例。
- 查询表数据并显示在DataGridView中。
private void button1_Click(object sender, EventArgs e)
{
string dbPath = @"D:\test.db";
SQLiteHelper.SQLiteHelper sqliteHelper = new SQLiteHelper.SQLiteHelper(dbPath);
string sql = "select * from tb_user";
DataTable dt = sqliteHelper.QueryDataTableSql(sql, null);
dataGridView1.DataSource = dt;
}
- 插入记录至表中并给出提示信息。
private void button2_Click(object sender, EventArgs e)
{
string dbPath = @"D:\test.db";
SQLiteHelper.SQLiteHelper sqliteHelper = new SQLiteHelper.SQLiteHelper(dbPath);
string sql = "insert into tb_user(id,name,age) values (@id,@name,@age)";
SQLiteParameter[] parameters = new SQLiteParameter[]{
new SQLiteParameter("@id","20180316001"),
new SQLiteParameter("@name","Lucy"),
new SQLiteParameter("@age",21)
};
int result = sqliteHelper.ExecuteNonQuerySql(sql, parameters);
if (result > 0)
{
MessageBox.Show("添加成功!");
}
else
{
MessageBox.Show("添加失败!");
}
}
以上两个示例中,我们都是在SQLiteHelper.SQLiteHelper类构造函数中传入了数据库文件的路径,将SQLiteHelper对象实例化后,就能轻松地对数据库进行操作。其中,示例一是查询表数据,示例二是插入记录操作。按需调用SQLiteHelper提供的其他方法即可完成相应的数据操作工作。
四、总结
通过我们的实践,我们发现,使用SQLiteHelper类库实现对SQLite数据库的操作十分便捷,是一个很好的SQLite数据库操作类库。通过SQLiteHelper的封装,我们能够很方便地实现对SQLite数据库的增、删、改、查等常规操作。此外,SQLiteHelper还支持Linq to sqlite语法,让我们更加轻松地处理数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法 - Python技术站