C#操作Sqlite数据库,包括创建、增、删、查、改、追加字段内容、实用操作及使用事务批量处理数据库
一、添加引用
创建Sqlite数据库之前首先要把相应的dll放到程序生成目录下,然后在项目中添加引用即可。
①、把System.Data.SQLite.dll和SQLite.Interop.dll相关dll放到程序生成目录下
②、using System.Data.SQLite;//添加引用
③、往程序中添加我提前写好的几个数据库执行方法,以后类似的操作直接调用本方法即可。
private void SqliteExecute(string path, string sql)
{
SQLiteConnection connect = new SQLiteConnection("Data Source = " + path);//创建连接
connect.Open();//打开数据库
SQLiteCommand cmdCreateTable = new SQLiteCommand(sql, connect);
cmdCreateTable.ExecuteNonQuery();//执行语句
cmdCreateTable.Dispose();
connect.Close(); //关闭数据库
}
//获取数据库中某个表的数据并保存到DataTabe中,如果表中有零条记录,就返回false,如果有记录,返回true,代表相应的DataTable是否为空。
private bool GetTable(string path, string sql, out DataTable dataTable)
{
SQLiteConnection connect = new SQLiteConnection("Data Source = " + path);
connect.Open();
SQLiteDataAdapter sQLiteDataAdapter = new SQLiteDataAdapter(sql, connect);
dataTable = new DataTable();
sQLiteDataAdapter.Fill(dataTable);
sQLiteDataAdapter.Dispose();
connect.Dispose();
int count = dataTable.Rows.Count;
if (count > 0)
return true;
else
return false;
}
二、创建Sqlite数据库
创建Sqlite数据库只需要创建相应的表即可,下面以创建学生所在城市数据库为例,程序如下:
①、string fileName = string.format("D://TextSqlite//{0}", Student.db);//注意sqlite数据库文件是以.db为后缀的
②、string sql = "create table if not exists StudentInfo (Name Text char(256) primary key, City Text char(256))";
//创建名字为StudentInfo的表,表中有Name和City两个字段,并指定以Name为主键。也可以不指定主键,单纯创建两个字段,或者可以写成
string sql = "create table if not exists StudentInfo (Name char(256), City char(256))";
③、SqliteExecute(fileName, sql); //调用数据库执行语句,创建数据库成功
三、往数据库插入一条记录
下面往StudentInfo表中增加一条记录,Name为LiMing,City为80,例如:
①、string name = "LiMing";
②、string sql = "insert into StudentInfo (Name, City) values ('"+ name +"', '"+ "Beijing" +"')";
③、SqliteExecute(fileName, sql);
现在已经往数据库相应表中插入一条记录了,需要注意的是在对各个字段赋值的时候,例如上面括号中 '"+ "LiMing" +"' 的格式为:最外面是一层单引号,中间是一层双引号,最里面是两个加号,两个加号中间是字段的值。
四、数据库中删除一条记录
下面以删除StudentInfo表中Name为"Dany"的所有记录,例如:
①、string name = "Dany";
②、string sql = "delete from StudentInfo where Name = '"+ name +"'";
③、SqliteExecute(fileName, sql);
即可实现删除表中符合条件的所有项,如果删除的条件限制较多的话,只需在Where后面加以and为分隔的条件就行,比如:
string sql = "delete from StudentInfo where Name = '"+ name +"' and City = '"+ "Tianjin" +"'";就可以删除表中所有Name为"Dany"并且City为"Tianjin"的所有项。
五、查找操作
数据库查找往往会把结果保存到DataTable中,便于程序方便处理,下面以查找表中所有Name为"Dany"的记录,例如:
①、string name = "Dany";
②、string sql = "select * from StudentInfo where Name = '"+ name +"'";//后面也可以加更多限制条件
③、if (GetTable(fileName, sql, out DataTable dataTable))
{
List<string> citys = new List<string>();//遍历dataTable把所有城市保存在一个列表中
foreach (DataRow dataRow in dataTable.Rows)
{
if(dataRow["City"] != null && dataRow["City"].ToString() != "")
{
//加入前一定要判断表中字段是否为空和对其值做防呆,否则可能导致程序出问题
citys.add(dataRow["City"].ToString());
}
}
}
六、数据库内容修改
修改语句为update,下面把表中Name为"Dany"的City修改为"Shenzhen",例如:
①、string name = "Dany", city = "Shenzhen";
②、string sql = "update StudentInfo set City = '"+ city +"' where Name = '"+ name +"'";
③、SqliteExecute(fileName, sql);
七、追加字段
追加字段语句同update,只在要追加的字段加 || 即可,比如往表中Name为"Dany"的City字段中追加City为"Guangzhou",例如:
①、string name = "Dany", city = "Guangzhou";
②、string sql = "update StudentInfo set City = City || '"+ city +"' where Name = '"+ name +"'";
③、SqliteExecute(fileName, sql);
格式为: set 字段 = 字段 || '"+ city +"' ,即可实现在字段City中追加"Guangzhou"的内容,原来City值为"Shenzhen"的话,现在值为"ShenzhenGuangzhou".
八、实用操作
sql语句中的replace语句很灵活,可以实现插入和更新两个功能,如果有记录则更新,没有则插入。
下面以往StudentInfo表中插入Name为"Dany",City为"Shenzhen"的一条记录,例如:
①、string name = "Dany";
②、string sql = "replace into StudentInfo (Name, City) values ('"+ name +"', '"+ "Shenzhen" +"')";
③、SqliteExecute(fileName, sql);
//程序实现效果为,如果表中存在以Name为"Dany"的记录,则更新其City为"Shenzhen"。如果没有记录,则实现和插入操作一样的功能。
九、利用事务批量处理
批量处理操作中,步骤为只需要开启事务、提交事务、执行即可,操作数据库方法和上面不太一样,在VS中按照提示添加相应的引用即可。下面以往数据库中插入1万条记录为例,展现批量处理的过程。
①、string sql;
②、DbProviderFactory dbFactory = SQLiteFactory.Instance;
③、using (DbConnection conn = dbFactory.CreateConnection())
{
conn.ConnectionString = "Data Source = " + fileName;
conn.Open();//打开数据库
DbCommand cmd = conn.CreateCommand();
DbTransaction trans = conn.BeginTransaction();//开启事务,必要的操作
for(int i = 0; i < 10000; i++)
{
sql = "replace into StudentInfo (Name, City) values ('" + i + "', '" + i + "')";
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
trans.Commit();
conn.Close();
}
程序中每一句具体的意思我还没深究,只需要能出色的实现自己想要的功能即可。如果不用事务的话,要插入10000条记录需要很长的时间,而现在只需眨眼的功夫即可实现。具体快多少倍咱们在这就不深究了,因为效果是显而易见的。如有在工作中遇到新的操作后面还会更新。
十、计算数据库中选择某一列不重复的值。这个问题可以使用简单的方法,即循环遍历数据库的每一行,计算不重复的值。但是C#给我们提供了更好的方法,DataView表示用于排序、筛选、搜索、编辑和导航的 DataTable 的可绑定数据的自定义视图,如下所示:
Select(file, sql, out DataTable dataTable);//把数据库信息放到DataTable里面
DataView dataView = dataTable.DefaultView;
DataTable dataTable1 = new DataTable();
dataTable1 = dataView.ToTable(false, "xxx");//第一个参数设置为True时,是选择不重复的值。设置为False时,得到所有的值,相当于把某一列单独放到了一个DataTable里面。
dataGridView2.DataSource = dataTable1;//可视化显示出来