本 IDE 内置 sqlite 数据库为默认数据库。下面将着重讲解如何通过代码进行创建,以及如何对表进行增删改查
。
每项工程,都会创建一个名为default.db
的 sqlite 数据库,里面包含系统文件库,非自创表谨慎操作。下面所有的操作流程都是以默认数据库为案例讲解的。
如果手头上有DB Browser for SQLite
或者navicat
等专业数据库操作工具,可以将项目中的default.db
拖拽至软件中打开,在里面按照数据库建表流程进行建表即可。
hmiApp->db
来调用,以下代码将描写一个全局的数据库指针。HmiApp.h 文件
/*CUSTOM_CODE_BEGIN*/
IDatabase * db = nullptr;
/*CUSTOM_CODE_END*/
HmiApp.c 文件
void HmiApp::onReady(){
db = DBMgr::getdb();
if (db == nullptr){
cout<<"连接失败"<<endl;
return;
}
}
如果想换成其他的数据库,可以根据 getdb 函数的解析进行修改。
/**
* @LEVEL0
* @brief 动态加载对应的动态库后,打开并连接数据库。如dbid已经存在,则直接已经存在的数据库类指针
* 若dbid已存在,则取相应的数据库连接。若不存在,先根据后面的参数连接,再取该连接
* 全部为默认值时,即getdb(),取系统的sqlite数据库(default.db)
* @param dbid 自定义的id。不为空时其他(MYSQL,PG,MSSQL,REDIS)数据库,为空时,取系统的默认sqlite数据库default.db
* @param dbtype 数据库类型,见常量DBTYPE(支持sqlite,mysql,mssql,postgre,redis)
* @param url 数据库服务器ip。其中:当dbtype==T_SQLITE时,为文件路径。
* 当dbtype==T_POSTGRESQL时为连接串,如("host=127.0.0.1 port=5432 dbname=msdf user=postgres password=123456)
* @param port 端口号。当dbtype==T_SQLITE时,无效。(mysql 3306, mssql 1433, postger 5432, redis 6379)
* @param uid 用户名。当dbtype==T_SQLITE时,无效。注意MySQL服务器的用户验证方式要设为标准
* @param pwd 密码。当dbtype==T_SQLITE时,无效。
* @param dbname 数据库系统中的数据库名称。
* @return 连接成功,返回数据库指针;连接失败,返回NULL
*
* @warning getdb会产生一个指针,在close后,需用delete清理
*/
static IDatabase* getdb(string dbid = "", uint8_t dbtype = DBTYPE::SQLITE3
, string url = "", int port = 3306, string uid = "", string pwd = "", string dbname = "") ;
string SQL;
bool res = false;
TTable tb;
// 创建自动测量时间值表
SQL = util::StringUtil::snprintf("CREATE TABLE IF NOT EXISTS warninglog("
"id INTEGER PRIMARY KEY DEFAULT(1),"
"beginTime varchar(64) DEFAULT('') NOT NULL," // 开始时间
"endTime varchar(64) DEFAULT('') NOT NULL," // 结束时间
"errorMessage varchar(64) DEFAULT('') NOT NULL" //报警内容
");");
res = db->execute(SQL);
if (!res){
cout<<"warninglog create false"<<endl;
return;
}
使用 execute 进行执行语句操作。注意:创建表语句时,表的内容为 sql 语句内容,写错则执行不成功。
使用 execute 函数
// 增加1
string SQL = StringUtil::snprintf("insert into warninglog(id) values(1);");
bool res = db->execute(SQL);
// 增加2
string sql = StringUtil::snprintf("insert into db_test(name,type,age,country,number) values ('%s',%d,%d,'%s','%s')",name.c_str(),type,age,country.c_str(),number.c_str());
bool ret = hmiApp->db->execute(sql);
注意:由于 StringUtil::snprintf 需要传入 c 风格的字符串,因此字符串的格式为'%s',值表达为 name.c_str()。
string SQL = StringUtil::snprintf("delete from home where id=%d",id);
bool res = db->execute(SQL);
// 该句为查询,将home表查询为封装的tbl中
TTable tbl = hmiApp->db->query("select * from home");
// 这里获取到所有的行数(不包括标题行)
vector<TTable::Row> rows = tbl.m_rows;
int rsize = rows.size();
int id = -1;
if (rsize>=1){
for (int i = 0;i<rsize;i++){
// 在这个home表中,第一列为id,下标从0开始
id = StringUtil::safeStoi(rows[i].values[0]);
}
}
如果想进入画面时,不使用默认添加的查询语句,想使用自己设计的查询语句,可以参考以下代码
// 通用方法 可以进行任何条件的拼接 如:(select id,name,type,age,country from db_test order by id asc) Vx
newsql = StringUtil::snprintf("(select id,name,type,age,country,number from db_test where type=%d and age=%d) Vx",type,age);
tv_wMSqliteTable1->refine(newsql);
注意:使用的数据库字段必须为表格设计中的选中的数据库字段,字段必须是表中原字段,不可用as进行别名绑定。Vx为新表的别名(新表为括号里面的查询语句),可以设置任意表名作为别名
下面是导出到 u 盘的示例
// 获取表
TTable tbl = hmiApp->db->query("select * from db_test");
vector<string> res;
// 获取u盘路径
res =SysInfo::getUdisks();
// 编辑导出文件的路径
string path = res[0]+"/BATCD_12121.csv";
// 导出表
bool ret = FileUtil::exportTableToFile(tbl, path, 0);
如果想删除表中某个被点击的选中行,并删除对应的数据库语句,可以进行如下操作
void Frm03::wMButton10_clk_cb(uint16 t code, LvEvent e){
/*删除*/
IDatabase* db = db::DBMgr::getdb("");
intr=tv_wMSqliteTable3->getSelectedIndex();
int mld =tv_wMSqliteTable3->getValue(r, 0);
string sql= "delete from rptDatas where mld=" + mld;
db->execute(sql);
tv_wMSqliteTable3->drawData(true);
}
该表字段中必须有一个字段作为唯一标识