APP运行环境提供了统一的数据库增删改查访问接口以及辅助的数据表格类型。
1)通过DBMgr获取数据库对象IDatabase;
2)通过IDatabase数据库对象执行增删改查功能;
3)通过数据查询控件显示;
目前支持以下数据库,
标识 | 说明 |
SQLITE3 | |
MYSQL | |
POSTGRESQL | |
MSSQL | |
REDIS |
ApusIDE使用SQLite作为内置数据库引擎,创建时项目会在项目下【数据】文件夹创建default.db数据库文件。
所有组态中创建的配置信息如用户、采样、事件等都会保存到default.db中。
当以上配置信息发生改变时,在下载或导出项目时需要勾选“覆盖旧数据库”选项!!
APP内置Sqlite数据库,默认情况下是打开的内置数据库。
如果需要访问其它数据库,则需要通过传递明确的参数来得到。
目前只支持标准SQL增删改查操作;
对事务的支持有限;
调用接口DBMgr::getdb()函数来得到IDatabase对象实例。
代码:
//获取IDatabase数据库实例
IDatabase *db = DBMgr::getdb();
获取到IDatabase实例对象后,就可以对数据库通过标准SQL语句进行增删改查操作了。
常用方法:
接口 | 说明 |
insert(string sql) | 插入 |
execute(string sql) | 执行单条SQL语句 |
execute(list& sqls) | 执行批量SQL语句 |
TTable query(string sql) | 查询 |
query(string sql, TTable* table) | 查询 |
代码实例:
//数据采集
string sDate = DateUtil::getTimeString("%Y%m%d");
string sHour = DateUtil::getTimeString("%H");
string sTime = DateUtil::getTimeString("%Y-%m-%d %H:%M:%S");
float mRJY, mBHD, mWD, mPH, mYD, mZD, mYW;
vm->getFloat("X溶解氧", mRJY);
vm->getFloat("X饱和度", mBHD);
vm->getFloat("X温度", mWD);
vm->getFloat("XpH值", mPH);
vm->getFloat("X盐度", mYD);
vm->getFloat("X浊度", mZD);
vm->getFloat("X液位", mYW);
string sRJY = StringUtil::snprintf("%.2f", mRJY);
string sBHD = StringUtil::snprintf("%.1f", mBHD);
string sWD = StringUtil::snprintf("%.1f", mWD);
string sPH = StringUtil::snprintf("%.2f", mPH);
string sYD = StringUtil::snprintf("%.2f", mYD);
string sZD = StringUtil::snprintf("%.1f", mZD);
string sYW = StringUtil::snprintf("%.3f", mYW);
string sql;
int mxId = 0;
//获取数据库对象
IDatabase* db = db::DBMgr::getdb("");
sql = "select max(mId) from rptDatas";
//执行查询
TTable tbl = db->query(sql);
if(tbl.size()==1) mxId = StringUtil::safeStoi(tbl.getValue(0, 0).toString());
if(mxId>100000){
mxId = mxId - 100000;
//删除符合条件的数据记录
sql = StringUtil::snprintf("delete from rptDatas where mId < %d", mxId);
db->execute(sql);
}
//插入新数据记录
sql = StringUtil::snprintf("INSERT INTO rptDatas(mDate, mHour, mTime, mRJY, mBHD, mWD, mPH, mYD, mZD, mYW) VALUES('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
sDate.c_str(), sHour.c_str(), sTime.c_str(), sRJY.c_str(), sBHD.c_str(), sWD.c_str(), sPH.c_str(), sYD.c_str(), sZD.c_str(), sYW.c_str());
db->execute(sql);
先要用SQLite数据库工具在default.db中创建rpDatas表,
添加到【数据查询】控件到页面,再点选【数据查询】控件的“查询语句”属性,如下所示,
点击rpDatas,勾选需要显示的字段并设置其表头,再点击【确定】按钮,
在【查询】按钮点击事件中,通过SQL语句条件变化来实现条件输入查询,
/*查询*/
int nY, nM,nD, nH;
vm->getInt("年", nY);
vm->getInt("月", nM);
vm->getInt("日", nD);
vm->getInt("时", nH);
string sM, sD;
sM = to_string(nM);
if(nM<10) sM = "0" + sM;
sD = to_string(nD);
if(nD<10) sD = "0" + sD;
//准备查询语句
string sql;
//使用子查询,确保SQL语句里面的字段与表格设置一致!!
sql = StringUtil::snprintf("(select substr(mTime,6,11) as mTime,mRJY,mBHD,mWD,mPH,mYD,mZD,mYW from rptDatas where mDate='%d%s%s' and mHour='%d' order by mId desc) ABCD", nY, sM.c_str(), sD.c_str(), nH);
//cout << sql << endl;
//传递
tv_wMSqliteTable3->refine(sql);
//刷新表格
tv_wMSqliteTable3->drawData(true);
APP提供变量TTable,是对表格类数据的简单封装,用于接收数据查询返回的数据集和数据显示。
详细API接口请参考TTable类的接口定义。
常用接口
接口 | 说明 |
addColumn(const string& col, const string& value=""); | 添加列并赋初值 |
delColumn(const string& col); | 删除列 |
getColumnName(int col, string& colname); | 获取指定列的名称 |
getColumnCount(); | 获取列数 |
addSimpleRow(vector& row); | 添加行 |
addSimpleRow(const string& str, const string& split=","); | 以字符串格式添加行 |
addRow(vector& row); | 添加行 |
insertSimpleRow(int pos, vector& row); | 以字符串格式插入行 |
insertRow(int pos, vector& row); | 插入行 |
delRow(int rowIndex); | 删除行 |
vector<:row> getRows(); | 获取行集合 |
vector getRow(int rowIndex); | 获取行数据 |
vector getColumnNames(); | 获取列名称集合 |
getValue(int rowIndex, const string& colName, string& res); | 获取指定行列的值 |
setValue(int rowIndex, int colIndex, const string& value); | 设置指定行列的值 |
cellValue(int rowIndex, int colIndex); | 获取指定行列格的值 |
copy(TTable& other); | 从另外一个TTable拷贝数据进来 |
setSelectedIndex(int sel, SttObject* obj=nullptr); | 选中指定行 |
getSelectedIndex(); | 获取选中行序号 |
TTableView是TTable的子类,在TTable的基础上具有以下功能:
支持单表的增删改查;
支持单表的分页功能;
TTableView类增加的接口
接口 | 说明 |
getPageIndex(); | 获取当前分页序号 |
getPageCnt(); | 获取总分页数 |
setPageSize(int size); | 设置分页大小 |
getPageSize(); | 获取每页记录数 |
getRecordCnt(); | 获取总记录数 |
navFirst(); | 跳转第一页 |
navNext(); | 跳转下一页 |
navBack(); | 跳转上一页 |
navLast(); | 跳转最后一页 |
bindPageSize(Ivariable v); | (关联变量)分页记录数 |
bindRecordCnt(Ivariable v); | (关联变量)总记录数 |
bindPageIndex(Ivariable v); | (关联变量)当前页序号 |
bindPageCnt(Ivariable v); | (关联变量)总页数 |
drawData(bool notifiy); | 获取数据 |
drawData(bool notifiy, vector& rowvals); | 用一行新的数据更新(不操作数据库),并根据notify是否刷新控件 |
enWriteDb(bool wr); | 设置是否回写数据库 |
setRealtimeShow(bool b); | 设置是否实时刷新数据 |
refine(const string& tbl); | 重新定义数据源,用于条件查询时改变查询语句 |
getLastRowId(); | 取最后1行(倒序为第1行)的id值 |
配方类TRcp是TTableView的子类,用于配方变量。使用TRcp的数据库访问能力,能实现配方的增、删,举例如下:
TRcp类增加的接口
接口 | 说明 |
setColumnVariant(const string& colId, const string& var); | 设置列的关联变量 |
setColumnVariants(vector& vars); | 设置列的关联变量 |
confirm(); | 配方确认 |