C#操作SQLite方法实例详解
本文实例讲述了C#操作SQLite方法。分享给大家供大家参考。具体分析如下:
地址:
System.Data.Sqlite入手。。。
首先import/using:
usingSystem.Data.SQLite;
Connection和Command:
privateSQLiteConnectionconn; privateSQLiteCommandcmd;
连接db:
conn=newSQLiteConnection("DataSource=c:\\test.db");
conn.Open();
INSERT/UPDATE:
cmd=conn.CreateCommand();
cmd.CommandText="INSERTINTOuser(email,name)VALUES('email','name')";
cmd.ExecuteNonQuery();
cmd.CommandText="UPDATEuserSETname='Codelicious'WHEREID=1";
cmd.ExecuteNonQuery();
SELECT:
cmd.CommandText="SELECTID,nameFROMuser";
SQLiteDataReaderreader=cmd.ExecuteReader();
if(reader.HasRows)
{
while(reader.Read())
{
Console.WriteLine("ID:"+reader.GetInt16(0));
Console.WriteLine("name:"+reader.GetString(1));
}
}
模板程序:
usingSystem;
usingSystem.Data;
usingSystem.Data.Common;
usingSystem.Data.SQLite;
namespaceSQLiteQueryBrowser
{
///<summary>
///说明:这是一个针对System.Data.SQLite的数据库常规操作封装的通用类。
///</summary>
publicclassSQLiteDBHelper
{
privatestringconnectionString=string.Empty;
///<summary>
///构造函数
///</summary>
///<paramname="dbPath">SQLite数据库文件路径</param>
publicSQLiteDBHelper(stringdbPath)
{
this.connectionString="DataSource="+dbPath;
}
///<summary>
///创建SQLite数据库文件
///</summary>
///<paramname="dbPath">要创建的SQLite数据库文件路径</param>
publicstaticvoidCreateDB(stringdbPath)
{
using(SQLiteConnectionconnection=newSQLiteConnection("DataSource="+dbPath))
{
connection.Open();
using(SQLiteCommandcommand=newSQLiteCommand(connection))
{
command.CommandText="CREATETABLEDemo(idintegerNOTNULLPRIMARYKEYAUTOINCREMENTUNIQUE)";
command.ExecuteNonQuery();
command.CommandText="DROPTABLEDemo";
command.ExecuteNonQuery();
}
}
}
///<summary>
///对SQLite数据库执行增删改操作,返回受影响的行数。
///</summary>
///<paramname="sql">要执行的增删改的SQL语句</param>
///<paramname="parameters">执行增删改语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param>
///<returns></returns>
publicintExecuteNonQuery(stringsql,SQLiteParameter[]parameters)
{
intaffectedRows=0;
using(SQLiteConnectionconnection=newSQLiteConnection(connectionString))
{
connection.Open();
using(DbTransactiontransaction=connection.BeginTransaction())
{
using(SQLiteCommandcommand=newSQLiteCommand(connection))
{
command.CommandText=sql;
if(parameters!=null)
{
command.Parameters.AddRange(parameters);
}
affectedRows=command.ExecuteNonQuery();
}
transaction.Commit();
}
}
returnaffectedRows;
}
///<summary>
///执行一个查询语句,返回一个关联的SQLiteDataReader实例
///</summary>
///<paramname="sql">要执行的查询语句</param>
///<paramname="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param>
///<returns></returns>
publicSQLiteDataReaderExecuteReader(stringsql,SQLiteParameter[]parameters)
{
SQLiteConnectionconnection=newSQLiteConnection(connectionString);
SQLiteCommandcommand=newSQLiteCommand(sql,connection);
if(parameters!=null)
{
command.Parameters.AddRange(parameters);
}
connection.Open();
returncommand.ExecuteReader(CommandBehavior.CloseConnection);
}
///<summary>
///执行一个查询语句,返回一个包含查询结果的DataTable
///</summary>
///<paramname="sql">要执行的查询语句</param>
///<paramname="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param>
///<returns></returns>
publicDataTableExecuteDataTable(stringsql,SQLiteParameter[]parameters)
{
using(SQLiteConnectionconnection=newSQLiteConnection(connectionString))
{
using(SQLiteCommandcommand=newSQLiteCommand(sql,connection))
{
if(parameters!=null)
{
command.Parameters.AddRange(parameters);
}
SQLiteDataAdapteradapter=newSQLiteDataAdapter(command);
DataTabledata=newDataTable();
adapter.Fill(data);
returndata;
}
}
}
///<summary>
///执行一个查询语句,返回查询结果的第一行第一列
///</summary>
///<paramname="sql">要执行的查询语句</param>
///<paramname="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param>
///<returns></returns>
publicObjectExecuteScalar(stringsql,SQLiteParameter[]parameters)
{
using(SQLiteConnectionconnection=newSQLiteConnection(connectionString))
{
using(SQLiteCommandcommand=newSQLiteCommand(sql,connection))
{
if(parameters!=null)
{
command.Parameters.AddRange(parameters);
}
SQLiteDataAdapteradapter=newSQLiteDataAdapter(command);
DataTabledata=newDataTable();
adapter.Fill(data);
returndata;
}
}
}
///<summary>
///查询数据库中的所有数据类型信息
///</summary>
///<returns></returns>
publicDataTableGetSchema()
{
using(SQLiteConnectionconnection=newSQLiteConnection(connectionString))
{
connection.Open();
DataTabledata=connection.GetSchema("TABLES");
connection.Close();
//foreach(DataColumncolumnindata.Columns)
//{
//Console.WriteLine(column.ColumnName);
//}
returndata;
}
}
}
}
完整的程序例子:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Data;
usingSystem.Data.Common;
usingSystem.Data.SQLite;
usingSQLiteQueryBrowser;
namespaceSQLiteDemo
{
classProgram
{
staticvoidMain(string[]args)
{
//CreateTable();
//InsertData();
ShowData();
Console.ReadLine();
}
publicstaticvoidCreateTable()
{
stringdbPath="D:\\Demo.db3";
//如果不存在改数据库文件,则创建该数据库文件
if(!System.IO.File.Exists(dbPath))
{
SQLiteDBHelper.CreateDB("D:\\Demo.db3");
}
SQLiteDBHelperdb=newSQLiteDBHelper("D:\\Demo.db3");
stringsql="CREATETABLETest3(idintegerNOTNULLPRIMARYKEYAUTOINCREMENTUNIQUE,Namechar(3),TypeNamevarchar(50),addDatedatetime,UpdateTimeDate,Timetime,Commentsblob)";
db.ExecuteNonQuery(sql,null);
}
publicstaticvoidInsertData()
{
stringsql="INSERTINTOTest3(Name,TypeName,addDate,UpdateTime,Time,Comments)values(@Name,@TypeName,@addDate,@UpdateTime,@Time,@Comments)";
SQLiteDBHelperdb=newSQLiteDBHelper("D:\\Demo.db3");
for(charc="A";c<="Z";c++)
{
for(inti=0;i<100;i++)
{
SQLiteParameter[]parameters=newSQLiteParameter[]{
newSQLiteParameter("@Name",c+i.ToString()),
newSQLiteParameter("@TypeName",c.ToString()),
newSQLiteParameter("@addDate",DateTime.Now),
newSQLiteParameter("@UpdateTime",DateTime.Now.Date),
newSQLiteParameter("@Time",DateTime.Now.ToShortTimeString()),
newSQLiteParameter("@Comments","JustaTest"+i)
};
db.ExecuteNonQuery(sql,parameters);
}
}
}
publicstaticvoidShowData()
{
//查询从50条起的20条记录
stringsql="select*fromtest3orderbyiddesclimit50offset20";
SQLiteDBHelperdb=newSQLiteDBHelper("D:\\Demo.db3");
using(SQLiteDataReaderreader=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,它或许是一个不错的选择。
publicstaticvoidCreateTable()
{
stringdbPath="D:\\Demo.db3";
//如果不存在改数据库文件,则创建该数据库文件
if(!System.IO.File.Exists(dbPath))
{
SQLiteDBHelper.CreateDB("D:\\Demo.db3");
}
SQLiteDBHelperdb=newSQLiteDBHelper("D:\\Demo.db3");
stringsql="CREATETABLETest3(idintegerNOTNULLPRIMARYKEYAUTOINCREMENTUNIQUE,Namechar(3),TypeNamevarchar(50),addDatedatetime,UpdateTimeDate,Timetime,Commentsblob)";
db.ExecuteNonQuery(sql,null);
}
publicstaticvoidInsertData()
{
stringsql="INSERTINTOTest3(Name,TypeName,addDate,UpdateTime,Time,Comments)values(@Name,@TypeName,@addDate,@UpdateTime,@Time,@Comments)";
SQLiteDBHelperdb=newSQLiteDBHelper("D:\\Demo.db3");
for(charc="A";c<="Z";c++)
{
for(inti=0;i<100;i++)
{
SQLiteParameter[]parameters=newSQLiteParameter[]{
newSQLiteParameter("@Name",c+i.ToString()),
newSQLiteParameter("@TypeName",c.ToString()),
newSQLiteParameter("@addDate",DateTime.Now),
newSQLiteParameter("@UpdateTime",DateTime.Now.Date),
newSQLiteParameter("@Time",DateTime.Now.ToShortTimeString()),
newSQLiteParameter("@Comments","JustaTest"+i)
};
db.ExecuteNonQuery(sql,parameters);
}
}
}
publicstaticvoidShowData()
{
//查询从50条起的20条记录
stringsql="select*fromtest3orderbyiddesclimit50offset20";
SQLiteDBHelperdb=newSQLiteDBHelper("D:\\Demo.db3");
using(SQLiteDataReaderreader=db.ExecuteReader(sql,null))
{
while(reader.Read())
{
Console.WriteLine("ID:{0},TypeName{1}",reader.GetInt64(0),reader.GetString(1));
}
}
}
希望本文所述对大家的C#程序设计有所帮助。