sqlite数据库方法类使用说明-检查列字段是否存在、添加列、删除列

本文主要演示sqlite开源项目中的数据库方法类使用说明。本项目旨在分享知识和经验,欢迎广大网友一起加入到开源项目中一起分享贡献知识和经验。

线上测试代码:

/******************************************************************************
  > File Name		: samples_addfield.cpp
  > Author			: Wseldom
  > Mail			: 3235459847@qq.com
  > Created Time	: Fri 01 Dec 2023 03:06:27 PM CST
******************************************************************************/
#include "./samples_addfield.hpp"
#include "sqlite/sqlite.h"

#define	RUN_TO_HERE printf ("run to here(%d)\n", __LINE__);



int samples_addfield (int argc, char** argv)
{
	if (argc < 2) {
		printf ("请输入一个参数以指定数据库文件名!\n");
		return -1;
	}
	sql::sqlite db(argv[1]);
	db.exec ("create table if not exists employee("
		"ID INTEGER PRIMARY KEY  AUTOINCREMENT, "
		"NAME           TEXT    NOT NULL UNIQUE, "
		"AGE            INT     NOT NULL, "
		"ADDRESS        CHAR(50)"
	");");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS) VALUES(1, '张三', 18, '珠海');");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS) VALUES(NULL, '李四', 21, '广州');");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS) VALUES(NULL, '啊五', 32, '深圳');");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS) VALUES(NULL, '小哀', 23, '珠海');");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS) VALUES(NULL, '刘五', 18, '深圳');");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS) VALUES(NULL, '柯南', 43, '广州');");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS) VALUES(NULL, '苏周', 51, '广州');");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS) VALUES(NULL, '啊二', 21, '珠海');");
	printf ("检查表中字段。\n");
	if (db.check_field ("employee", "SALARY") == E_SQLITE_FALSE) {
		printf ("表employee中不存在字段SALARY,添加字段SALARY,并设置默认值为10000.\n");
		db.exec (SQLCMD_ADD_COLUMN ("employee","SALARY REAL DEFAULT 10000"));
	} else {
		printf ("表employee中已存在字段SALARY.\n");
	}
	RUN_TO_HERE
	printf ("再次检查表中字段。\n");
	RUN_TO_HERE
	if (db.check_field ("employee", "SALARY") == E_SQLITE_FALSE) {
		printf ("表employee中不存在字段SALARY.\n");
	} else {
		printf ("表employee中已存在字段SALARY.\n");
	}
	RUN_TO_HERE
	sql::query* query;
	query = db.query ("select * from employee limit 1;");
	RUN_TO_HERE
	if (query) {
		query->begin ();
		do {
			printf ("ID=%ld,NAME=%s,AGE=%ld,ADDRESS=%s,SALARY=%f\n"
				, query->get_number ("ID", 0)
				, query->get_string ("NAME", "未知")
				, query->get_number ("AGE", 0)
				, query->get_string ("ADDRESS", "地址")
				, query->get_float ("SALARY", 5000)
			);
		} while (query->next () > 0);
		delete query;
	}
	return 0;
}

首先创建表employee,表中不包含字段SALARY,然后插入一些数据;
然后调用方法check_field检查字段SALARY是否灿在,若不存在则新增此字段,并且设置默认值为10000;若存在则提示已存在。插入后重新检查字段是否存在,并且查询一条记录打印其值,看默认值是否生效。执行结果如下:
在这里插入图片描述
注意“sqlite err info:query aborted”并非查询错误,此日志是因为check_field检查到字段存在时在回调函数中返回非0导致查询终止而形成的日志。

接下来是删除表中字段的例程。

/******************************************************************************
  > File Name		: samples_delfield.cpp
  > Author			: Wseldom
  > Mail			: 3235459847@qq.com
  > Created Time	: Fri 01 Dec 2023 03:59:25 PM CST
******************************************************************************/
#include "./samples_delfield.hpp"
#include "sqlite/sqlite.h"




int samples_delfield (int argc, char** argv)
{
	if (argc < 2) {
		printf ("请输入一个参数以指定数据库文件名!\n");
		return -1;
	}
	sql::sqlite db(argv[1]);
	db.exec ("create table if not exists employee("
		"ID INTEGER PRIMARY KEY  AUTOINCREMENT, "
		"NAME           TEXT    NOT NULL UNIQUE, "
		"AGE            INT     NOT NULL, "
		"ADDRESS        CHAR(50), "
		"SALARY         REAL"
	");");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS,SALARY) VALUES(1, '张三', 18, '珠海', 2500.0);");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '李四', 21, '广州', 6800.0);");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '啊五', 32, '深圳', 16500.0);");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '小哀', 23, '珠海', 13000.0);");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '刘五', 18, '深圳', 4500.0);");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '柯南', 43, '广州', 20500.0);");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '苏周', 51, '广州', 22500.0);");
	db.exec ("INSERT INTO employee(ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '啊二', 21, '珠海', 12500.0);");


	printf ("删除字段SALARY");
	db.exec ("create table temp as select ID,NAME,AGE,ADDRESS from employee where 1 = 1;");
	db.exec ("drop table employee;");
	db.exec (SQLCMD_RENAME_TABLE("temp", "employee"));

	if (db.check_field ("employee", "SALARY") == E_SQLITE_FALSE) {
		printf ("表employee中已不存在字段SALARY.\n");
	} else {
		printf ("表employee中存在字段SALARY.\n");
	}

	sql::query* query = NULL;
	query = db.query ("select * from employee;");
	if (query == NULL) {
		printf ("查询失败或未查询到数据!\n");
		return -1;
	}
	if (query->size () <= 0) {
		delete query;
		printf ("未查询到数据!\n");
		return -1;
	}
	printf ("总共查询到%d条记录,记录如下:\n", query->size ());
	query->begin ();
	do {
		printf ("ID:%ld, name:%s, age:%ld, address:%s, salary:%f\n"
		, query->get_number ("ID", 0)
		, query->get_string ("name", "")
		, query->get_number ("age", 0)
		, query->get_string ("address", "")
		, query->get_float ("salary", 0)
		);
	} while (query->next () > 0);
	delete query;
	return 0;
}

执行结果如下:
在这里插入图片描述

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于这个问题,您可以使用 Qt 的 QTableView 和 QSqlTableModel 来将数据从 SQLite 数据库映射到表视图中。然后,您可以编写代码,将此数据以指定格式提交到服务器或其他位置。下面是一个简单的示例: ```cpp #include <QtSql> int main() { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("mydatabase.db"); if (!db.open()) { qWarning("Failed to open database"); return 1; } QSqlTableModel model; model.setTable("mytable"); model.select(); // iterate over rows for (int i = 0; i < model.rowCount(); i++) { QSqlRecord record = model.record(i); QString name = record.value("name").toString(); QString age = record.value("age").toString(); // format data as desired QString data = QString("%1 is %2 years old").arg(name).arg(age); // submit data to server // ... } return 0; } ``` 请注意,该示例仅用于说明如何使用 QTableView 和 QSqlTableModel 来查询数据库并处理数据。要将数据提交到服务器,您需要编写一些额外的代码。 ### 回答2: 在使用Qt中的QTableView控件映射SQLite数据库,并以指定格式提交数据的过程中,需要按照以下步骤进行操作。 首先,我们需要创建一个SQLite数据库,并在数据库中创建一个表格,用于存储相应的数据。例如,在该数据库中创建一个名为"mytable"的表格,该表格包含各个字段)和对应的数据型。 接下来,在Qt中创建一个窗口应用程序,并在窗口中添加一个QTableView控件。通过Qt的数据库驱动程序,可以连接到SQLite数据库,并将该表格的数据显示到QTableView控件中。 在读取数据库数据并显示到QTableView时,可以使用Qt的数据模型(如QSqlTableModel)来实现数据的查询和操作。将该数据模型设置为QTableView的模型,通过设置QSqlTableModel的表明、数据库连接和其他属性,即可实现将数据显示到QTableView中的功能。 接下来,根据需要的指定格式,可以对QTableView中的数据进行编辑和修改。在提交数据之前,可以通过QSqlTableModel的一些方法(如setData())来获取并修改数据。 最后,在用户点击提交按钮时,可以通过QSqlTableModel的submitAll()方法将修改后的数据提交到数据库中。该方法检查模型中的数据,并将其保存到与模型关联的数据库表中。 整个过程中,需要注意在数据库操作中出现的异常和错误的处理,以及对数据的校验和验证。可以根据需要添加适当的信号和槽函数,实现数据的保存、更新和删除等操作。 综上所述,通过以上步骤和相关操作,可以实现在QTableView上映射SQLite数据库并以指定格式提交数据的功能。 ### 回答3: QTableView是一个用于显示和编辑表格数据的控件,而SQLite是一个轻量级的关系型数据库。想要将QTableView与SQLite数据库进行映射并以指定格式提交数据,可以按照以下步骤进行操作: 1. 连接到SQLite数据库使用Qt提供的QSqlDatabase来连接到SQLite数据库。首先,需要添加连接数据库所需的驱动程序,如QSQLITE,然后使用QSqlDatabase::addDatabase()函数创建数据库连接对象。可以设置数据库的名称、主机名、用户名和密码等相关参数。 2. 创建数据模型:使用QSqlTableModel来创建一个与数据库表对应的数据模型。在这个模型上进行操作可以方便地对数据库进行读取和写入。可以指定要操作的数据库表名以及连接的数据库。 3. 设置数据模型为QTableView的模型:使用QTableView的setModel()函数将数据模型设置为QTableView的模型,这样QTableView就可以显示数据库中的数据了。 4. 显示和编辑数据:QTableView会自动根据数据模型中的数据来生成表格。通过QTableView控件,可以浏览数据库中的数据,并在需要的时候进行编辑操作。可以设置QTableView的显示格式、宽、行高等相关属性。 5. 提交数据到数据库:通过调用数据模型的submitAll()函数,可以将在QTableView中编辑过的数据提交到数据库。这样,数据库中相应的数据就会被更新。 6. 按指定格式提交数据:在数据提交之前,可以对数据进行处理,使其符合指定的格式要求。例如,可以使用QString的相关函数进行字符串的格式化操作,或者使用QDateTime进行日期和时间的格式化操作。 以上就是使用QTableView将数据映射到SQLite数据库并以指定格式提交数据的简要步骤。通过这种方式,可以方便地实现对数据库的操作,同时可以保证数据的正确性和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值