转载请注明出处!min20062020@https://www.doczj.com/doc/9017500350.html,。
源码下载:https://www.doczj.com/doc/9017500350.html,/detail/min20062020/5491029
该版本还有需要改进之处,下一版本进行修改。
一、准备工作
1.创建应用,布局界面。
创建C# windows应用程序,名为CSharp_Sqlite,将设计界面上布局groupBox,用于显示学生信息,拖入显示控件dataGridView1和菜单控件bindingNavigator1。另外添加两个button,用于查看学生信息和退出。如下图:
注:bindingNavigator1的默认属性是在界面的上方,习惯性操作在下方,因此修改其Dock 属性,设置为Buttom。
2.添加sqlite运行环境的引用。
由于VS并不自带https://www.doczj.com/doc/9017500350.html,,因此需要自行安装和添加。步骤如下:
1)安装https://www.doczj.com/doc/9017500350.html,
解压后,安装“附加文件”目录下的SQLite-1.0.66.0-setup.exe即可。或到以下链接下载:https://www.doczj.com/doc/9017500350.html,/detail/min20062020/5373079
2)添加sqlite引用
在选项“项目”-> “添加引用”中,找到System.Data.SQLite,确定添加。此时可看到左侧项目的“引用”中,出现System.Data.SQLite。
【注意】选中该引用,在该引用的属性界面上,将“复制本地”设置为“true”,这样运行之后,可将sqlite.dll从引用处拷贝到项目下,防止出现找不到System.Data.SQLite的错误。
3.添加sqlite数据库表
新建项目文件夹DB,添加现有项studentInfo.db3。(需事先创建并插入数据,下载项目中有此文件,若没有,可参考附录中的SQL语句)
【注意】选中该数据库,在其属性界面上,将“复制到输出目录”设置为“始终复制”,为防止出现找不到db文件的错误。
二、数据的显示
在使用数据库相关语句之前,必须在代码文件之前添加引用空间名称:
using System.Data.SQLite;
1.添加数据库查询代码
创建函数获取数据库信息,主要包括三个部分:打开数据库连接、执行sql语句,断开连接。其主要代码为:【可运行代码请查看项目源码】
public DataTable SelectDB()
{
string dbPath = "DB//studentInfo.db3";
/*打开数据库连接*/
string strconn = "Data Source = " + dbPath + ";";
SQLiteConnection sqlconn = new SQLiteConnection(strconn); //创建连接
sqlconn.Open(); //打开连接
/*执行sql命令*/
string strSQL = "select * from studentInfo";
SQLiteDataAdapter sqd = new SQLiteDataAdapter(strSQL, sqlconn);
DataTable dt = new DataTable();
sqd.Fill(dt); //将SQL语句执行结果放入dt中
/*关闭连接*/
sqlconn.Close();
return dt;
}
2.添加查询按钮实现代码
双击设计界面上的“查看”按钮,将自动生成该按钮的事件实现函数,并自动跳转到该函数内。
代码主要包括以下内容:【可运行代码请查看项目源码】
1)调用SelectDB(),并保存其返回值:
DataTable stuDT = new DataTable();
stuDT = SelectDB();
2)处理返回值为空或其他异常情况
/*处理数据库无数据的情况*/
if (stuDT == null || stuDT.Rows.Count == 0)
{
MessageBox.Show("没有学生信息可显示!");
}
3)测试sqlite连接,将结果显示在dataGridView1中。之后还要做修改。
/*为dataGridView1绑定数据源*/
this.dataGridView1.DataSource = stuDT;
运行程序,点击“查看”按钮,即可查看数据库内容:
另外,根据显示内容进行界面的长宽调节。宽度调节到不留下右侧空白即可,长度调节到能显示10行即可,之后的用于分页显示。也可根据实际情况调节。
【注1】若不希望显示左侧的空白列,将其界面属性RowHeadersVisiable设置为false。
【注2】另外,该项目仅显示信息,不希望用户修改内容或格式,因此对以下属性进行设置:
●AllowUserToAddRows:false
●AllowUserToDeleteRows:false
●AllowUserToResizeRows:false
●ReadOnly:true
三、分页设置
1.布局菜单栏
在设计页面选中bindingNavigator1,右键->“编辑项”,进入页面编辑项,删除原有菜单部署,按照下图所示重新部署:
即依次添加以下属性:
另外,可在dataGridView1上方,加入两个Label控件,用于显示总记录条数。
2.初始化页面
首先,添加控件bindingSource1,作为bindingNavigator1和dataGridView1的缓存数据源。
创建函数InitDataSet(),初始化菜单控件bindingNavigator1,并载入信息到显示控件dataGridView1中。
private void InitDataSet()
{
pageSize = 10; //设置页面行数
total = stuDT.Rows.Count;
pageCount = (total / pageSize); //计算出总页数
if ((total % pageSize) > 0)
{
pageCount++;
}
pageCurrent = 1; //当前页数从开始
currentRow = 0; //当前记录数从开始
/*载入DataTable保存的数据库信息*/
LoadData();
}
/*载入DataTable保存的数据库信息*/
private void LoadData()
{
int nStartPos = 0; //当前页面开始记录行
int nEndPos = 0; //当前页面结束记录行
DataTable dtTemp = this.stuDT.Clone(); //克隆DataTable结构框架
if (pageCurrent == pageCount)
{
nEndPos = total;
}
else
{
nEndPos = pageSize * pageCurrent;
}
nStartPos = currentRow;
/*将对应信息显示在菜单栏和总数统计Label中*/
toolStripLabel2.Text = "/ " + pageCount.ToString();
if (stuDT.Rows.Count == 0)
{
toolStripTextBox1.Text = "0";
}
else
{
toolStripTextBox1.Text = Convert.ToString(pageCurrent);
}
https://www.doczj.com/doc/9017500350.html,bel2.Text = total.ToString();
/*从元数据源复制记录行*/
if (stuDT.Rows.Count != 0)
{
for (int i = nStartPos; i < nEndPos; i++)
{
dtTemp.ImportRow(stuDT.Rows[i]);
currentRow++;
}
}
//绑定由需要显示的记录组成的DataTable为bindingNavigator1的数据源
bindingSource1.DataSource = dtTemp;
//将bindingNavigator1设置为bindingNavigator1的数据源
bindingNavigator1.BindingSource = bindingSource1;
//将bindingNavigator1设置为dataGridView1的数据源
dataGridView1.DataSource = bindingSource1;
}
运行程序,点击查看,效果如下:
3.菜单栏的跳转页面实现
主要包括“上一页”、“下一页”和输入框的跳转实现。
在此,只实现前两项。最后一项下一版本实现。
选中bindingNavigator1,在其属性页面上点击“事件”按钮,双击ItemClicked,自动生成事件函数,并跳转到函数中。在函数中实现“上一页”和“下一页”的功能。
/*“上一页”按钮响应*/
if (e.ClickedItem.Text == "上一页")
{
if (pageCurrent >= 0)
{
pageCurrent--;
}
if (pageCurrent <= 0)
{
pageCurrent++;
MessageBox.Show("已经是第一页!");
return;
}
else
{
currentRow = pageSize * (pageCurrent - 1);
}
LoadData(); //重新加载
}
/*“下一页”按钮响应*/
if (e.ClickedItem.Text == "下一页")
{
if (pageCurrent <= pageCount)
{
pageCurrent++;
}
if (pageCurrent > pageCount)
{
pageCurrent--;
MessageBox.Show("已经是最后一页!");
return;
}
else
{
currentRow = pageSize * (pageCurrent - 1);
}
LoadData(); //重新加载
}
运行程序,测试功能:
到此,基本功能已经实现啦!!!
四、界面美化
1.添加界面图标
下面给界面添加一个图标,简单的美化一下吧。
在主界面Form1的属性界面上,点击Icon后的按钮,选择喜欢的图片作为界面。再将其Text属性的“Form1”取个名字吧。
2.添加项目图标
为了将自己的程序与其他程序进行区分,可添加一个项目图标。首先,VS菜单栏,“项目”->“属性”->“应用程序”
点击“图标”后面的按钮,添加图片即可。
五、编译设置
如何让该exe文件在未安装https://www.doczj.com/doc/9017500350.html,的机器上运行?
由于引用了外部的sqlite.dll,因此在未安装https://www.doczj.com/doc/9017500350.html,的机器上运行运行该exe文件则可能出错,这时,可在项目属性“生成”中,将目标平台改为X86,该exe文件就可自动引用其同目录下的System.Data.SQLite.dll文件。
最后运行程序,完成项目!!!
六、附录:sqlite数据库语句
1.创建数据库
CREATE TABLE studentInfo
(
stuNum varchar2(32) not null,
stuName varchar2(32) not null,
stuAge INTEGER not null,
gender varchar2(1) not null,
primary key(stuNum)
)
2.删除一条记录
delete from studentInfo where stuName= "Lucy"
3.插入一条记录
replace into studentInfo values ("001", "李三", 15 , "男")
或者:
insert into studentInfo values ("001", "李三", 15 , "男")
Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解 17_创建数据库与完成数据添删改查--------------------------------------1.SQLite介绍:最大特点是,无数据类型; 除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER n n 、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型 n n 只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不 n n 过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数n n 据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的 n n 字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。n n n 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段 n n 保存除整数以外的数据时,将会产生错误。 另外, SQLite 在解析CREATE TABLE 语句时, n n 会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句会忽略 name字段 n n 的类型信息: CREATE TABLE person (personid integer primary key autoincrement, name varchar n n (20)) SQLite可以解析大部分标准SQL语句,如:查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order byn n n 排序子句如:select * from person n n n n select * from person order by id desc n n n n select name from person group by name having count(*)>1 ---------------------------------------------------------------------------2.a.分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录n n select * from Account limit 5 offset 3 或者 select * from Account limit 3,5 n b.select * from Account limit 3,5,指的是跳过前面的3条记录,然后获取5条记录n c.select * from Account limit 3,5是select * from Account limit 5 offset 3语句 n n 的简写版 -------------------------------------------------------------------------------n 3.常用操作: a.插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person nn n n (name, age) values(‘传智’,3) b.更新语句:update 表名 set 字段名=值where 条件子句。如:update person set name=n n n n'credream ‘where id=10 c.删除语句:delete from 表名 where 条件子句。如:delete from person nwhere id=10 -------------------------------------------------------------------------------2.虽然无数据类型,但是建议加上,这样可以增加可读性,支持标准sql,oracle中的不行 ---------------------------------------------------3.获取添加记录后的自增长的ID值:select last_insert_rowid(); -----------------------------------------------------------4.在android中开发数据库应用: n a.创建数据库:以前在javaee时候,需要手工数据,但是android应用,需要运行在用户的 n n 手机上,所以,android应用,要有自动创建数据库功能,当第一次使用软件的时候 n n 就创建数据库----------------------------------------5.关于数据库自动创建的详细介绍: 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很 n n 多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出 n n 应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据 n n 表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机 n n 上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方 n n 式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我 n n 们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版 n n 本进行管理来实现前面提出的需求。n -----------------------------------------6.SQLite数据库添加,删除,改查操作 n A.创建数据库:SQLiteOpenHelper .getWritableDatabase ()或getReadableDatabase() n n 可以创建数据库7.创建完成以后可以使用SQLITE Expert软件打开生成的数据库n 可以看到除了生成的自己的需要的表之外,还生成了一张:android_metadata表: n 如果在sqlite中使用数据库一定会有一张android_metadata表,用来登记用户的 n 使用语言:zh_cn -----------------------------------------------------n b.数据库自动创建的过程及方法详细介绍: n n我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在 n n 很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建 n n 出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数n n 据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手 n n 机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工 n n 方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为n n 我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库n n 版本进行管理来实现前面提出的需求。n -------------------------------------------8.详细介绍: 为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是 n n onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, intn n n newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结n n 构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获n n 取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生 n n 成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用 n n ,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。 n n onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号, n n 而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数n n 据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为n n 了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如 n n 果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本 n n 升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后 n n 作出相应的表结构及数据更新。 getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的 n n SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库n n 的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就 n n 会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了 n n ,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。 ------------------------------------------------------------------------9.创建数据库的代码: n a.创建项目:DBSQLIte n b./DBSQLIte/src/com/credream/service/DBOpenHelter.java n n package com.credream.service; n n import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; n n public class DBOpenHelter extends SQLiteOpenHelper { //父类没有默认构造器,需要显示调用 public DBOpenHelter(Context context) { super (context, "credream.db", null, 1); //数据库创建完成后,默认会保存在<包>/database/文件夹下 //当修改版本号时候,会触发:onUpgrade方法 //第二个:指定数据库名称, //第三个:游标工厂,用来迭代,查询后的结果集,null代表使用系统默认的 n n 游标工厂//版本号,大于0 n } /** n* 这个方法是在数据库第一次被创建的时候调用的 n*/ @Override public void onCreate(SQLiteDatabase db) { //SQLiteDatabase这个类,封装了增删改查操作,也叫做数据库操作实例 db.execSQL("CREATE TABLE person (personid integer primary keyn n n autoincrement, name varchar(20))"); //这里也可以不写name的数据类型,因为sqlite是数据类型无关的,就是写n n 了varchar(20),也可以写入超过20的内容 n n } /** n* 当数据库的版本号变更的时候被调用 n*/ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("alter table person add phone varchar(12) null"); n n } n n } --------------------------------------------------------2.在清单文件中写入测试环境 n n n
SQLite version 3.7.9 2011-11-01 00:52:41 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table students( ...> id integer primary key, ...> name text not null unique, ...> sex int default 1, ...> bak text); sqlite> .tables students sqlite> .help .backup ?DB? FILE Backup DB (default "main") to FILE .bail ON|OFF Stop after hitting an error. Default OFF .databases List names and files of attached databases .dump ?TABLE? ... Dump the database in an SQL text format If TABLE specified, only dump tables matching LIKE pattern TABLE. .echo ON|OFF Turn command echo on or off .exit Exit this program .explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off. With no args, it turns EXPLAIN on. .header(s) ON|OFF Turn display of headers on or off .help Show this message .import FILE TABLE Import data from FILE into TABLE .indices ?TABLE? Show names of all indices If TABLE specified, only show indices for tables matching LIKE pattern TABLE. .load FILE ?ENTRY? Load an extension library .log FILE|off Turn logging on or off. FILE can be stderr/stdout .mode MODE ?TABLE? Set output mode where MODE is one of: csv Comma-separated values column Left-aligned columns. (See .width) html HTML