poco的sqlite数据库

一、注册注销数据库连接

        我这里对外这个数据库操作类是单例,所有我这里直接把数据库注销和注册放在析构和构造函数里面了

SqliteDatabase::SqliteDatabase()
{
	//注册连接
	Poco::Data::SQLite::Connector::registerConnector();
}
SqliteDatabase::~SqliteDatabase()
{
	//注销连接
	Poco::Data::SQLite::Connector::unregisterConnector();
}

二、添加一条新的数据

        CREATE TABLE IF NOT EXISTS PATENTINFO 这里是假如没有找到数据库表就直接创建一张

        

bool SqliteDatabase::addNewPatentInfo(PatentInfo& info, std::string& strErro)
{
	try 
	{
		// 创建数据库会话  
		Session session(Poco::Data::SQLite::Connector::KEY, "PatentInfos.db");
		session << "CREATE TABLE IF NOT EXISTS PATENTINFO (CertificateNumber VARCHAR PRIMARY KEY NOT NULL, RightsOwner VARCHAR(30) NOT NULL, PatentName VARCHAR NOT NULL, Note VARCHAR, FilePath VARCHAR, StartTime INTEGER(64) NOT NULL, EndTime INTEGER(64) NOT NULL, PatentStatu INTEGER(8) NOT NULL, MainClass INTEGER(8) NOT NULL, SubClass INTEGER(8) NOT NULL)", now;

		if (isPersonInfoExist(info.strCertificateNumber))
		{
			return false;
		}


		//采用绑定的形式防止SQL注入
		Statement stmt = (session << "INSERT INTO PATENTINFO VALUES(:CertificateNumber, :RightsOwner, :PatentName, :Note, \
			:FilePath, :StartTime, :EndTime, :PatentStatu, :MainClass, :SubClass)",
			bind(info.strCertificateNumber), bind(info.strRightsOwner), bind(info.strPatentName), bind(info.strNote), bind(info.strFilePath),
			bind(info.nStartTime), bind(info.nEndTime), bind(info.ePatentStatu), bind(info.eMainClass), bind(info.eSubClass));

		return (stmt.execute() > 0);
	}
	catch (const Poco::Data::SQLite::SQLiteException& ex) {
		// 捕获 SQLite 异常并输出错误信息  
		strErro = "SQLite Error: " + std::string(ex.what())+ "  Error Code:"+ std::to_string(ex.code());
		return false;
	}
	catch (const Poco::Exception& ex) {
		// 捕获其他 Poco 异常  
		strErro="Poco Error: " + std::string(ex.what());
		return false;
	}
	catch (const std::exception& ex) {
		// 捕获标准异常  
		strErro = "Standard Error: " + std::string(ex.what());
		return false;
	}
}

二 删除主键的一条数据

        这里是支持sql语句的,如果CertificateNumber不是主键的话,就是删除CertificateNumber为strCertificateNumber的所有数据

bool SqliteDatabase::deletePatentInfo(const std::string& strCertificateNumber, std::string& strErro)
{
	try
	{
		Session session(Poco::Data::SQLite::Connector::KEY, "PatentInfos.db");
		Statement stmt = (session << "DELETE FROM PATENTINFO WHERE CertificateNumber = ?", bind(strCertificateNumber));
		if (stmt.execute() == 1)
		{
			return true;
		}
		else
		{
			strErro = "not find CertificateNumber";
			return false;
		}
		
	}
	catch (const Poco::Data::SQLite::SQLiteException& ex) {
		// 捕获 SQLite 异常并输出错误信息  
		strErro = "SQLite Error: " + std::string(ex.what()) + "  Error Code:" + std::to_string(ex.code());
		return false;
	}
	catch (const Poco::Exception& ex) {
		// 捕获其他 Poco 异常  
		strErro = "Poco Error: " + std::string(ex.what());
		return false;
	}
	catch (const std::exception& ex) {
		// 捕获标准异常  
		strErro = "Standard Error: " + std::string(ex.what());
		return false;
	}
}

三、修改一条数据,根据CertificateNumber

bool SqliteDatabase::updatePatentInfo(PatentInfo& info, std::string& strErro)
{
	try
	{
		Session session(Poco::Data::SQLite::Connector::KEY, "PatentInfos.db");
		Statement stmt = (session << "UPDATE PATENTINFO SET RIGHTSOWNER = :RightsOwner, PATENTNAME = :PatentName, NOTE = :Note, FILEPATH = :FilePath  \
			, STARTTIME = :StartTime, ENDTIME = :EndTime, PATENTSTATU = :PatentStatu, MAINCLASS = :MainClass, SUBCLASS = :SubClass\
			WHERE CertificateNumber = :CertificateNumber",
			bind(info.strRightsOwner), bind(info.strPatentName), bind(info.strNote), bind(info.strFilePath), bind(info.nStartTime)
			, bind(info.nEndTime), bind(info.ePatentStatu), bind(info.eMainClass), bind(info.eSubClass));
		return (stmt.execute() == 1);
	}
	catch (const Poco::Data::SQLite::SQLiteException& ex) {
		// 捕获 SQLite 异常并输出错误信息  
		strErro = "SQLite Error: " + std::string(ex.what()) + "  Error Code:" + std::to_string(ex.code());
		return false;
	}
	catch (const Poco::Exception& ex) {
		// 捕获其他 Poco 异常  
		strErro = "Poco Error: " + std::string(ex.what());
		return false;
	}
	catch (const std::exception& ex) {
		// 捕获标准异常  
		strErro = "Standard Error: " + std::string(ex.what());
		return false;
	}
}

四、查询主键为info.strCertificateNumber的一条数据

bool SqliteDatabase::searchPatentInfo(PatentInfo& info, std::string& strErro)
{
	Session session(Poco::Data::SQLite::Connector::KEY, "PatentInfos.db");


	time_t nStartTime = 0;
	time_t nEndTime = 0;
	uint8_t nPatentStatu = STATU_UNKNOWN;
	uint8_t nMainClass = MAIN_CLASS_UNKNO;
	uint8_t nSubClass = SUB_CLASS_UNKNOWN;
	std::string strRightsOwner;
	std::string strPatentName;
	std::string strNote;
	std::string strFilePath;


	Statement stmt = (session << "SELECT RightsOwner, PatentName, Note, FilePath, StartTime, EndTime, PatentStatu,MainClass, SubClass FROM PERSONINFO WHERE CERTIFICATENUMBER = :CertificateNumber",
		into(strRightsOwner), into(strPatentName), into(strNote), into(strFilePath), into(nStartTime), into(nEndTime),
		into(nPatentStatu), into(nMainClass), into(nSubClass), bind(info.strCertificateNumber));
	if (stmt.execute() == 1)
	{
		strErro = "not find data";
		info.strRightsOwner = strRightsOwner;
		info.strPatentName = strPatentName;
		info.strNote = strNote;
		info.strFilePath = strFilePath;
		info.nStartTime = nStartTime;
		info.nEndTime = nEndTime;
		info.ePatentStatu = (PatentStatus)nPatentStatu;
		info.eMainClass = (MainClass)nMainClass;
		info.eSubClass = (SubClass)nSubClass;
		return true;
	}
	return false;
}

五、查询所有数据

        这里需要注意一下数据的转换,很容易引起异常

bool SqliteDatabase::getAllPatentInfo( std::vector<PatentInfo>& vector, std::string& strErro)
{

	try
	{
		Session session(Poco::Data::SQLite::Connector::KEY, "PatentInfos.db");

		// 执行查询并获取结果  
		RecordSet rs(session, "SELECT CertificateNumber,RightsOwner, PatentName, Note, FilePath, StartTime, EndTime, PatentStatu,MainClass, SubClass FROM PATENTINFO");
		rs.moveFirst();
		for (size_t i = 0; i < rs.rowCount(); i++)
		{
			PatentInfo stu;
			stu.strCertificateNumber = rs["CertificateNumber"].toString();
			stu.strRightsOwner = rs["RightsOwner"].toString();
			stu.strPatentName = rs["PatentName"].toString();
			stu.strNote = rs["Note"].toString();
			stu.strFilePath = rs["FilePath"].toString();
			stu.nStartTime= rs["StartTime"].convert<__int64>();
			stu.nEndTime = rs["EndTime"].convert<__int64>();
			stu.ePatentStatu = static_cast<PatentStatus>(rs["PatentStatu"].convert<__int8>());
			stu.eMainClass = static_cast<MainClass>(rs["MainClass"].convert<__int8>());
			stu.eSubClass = static_cast<SubClass>(rs["SubClass"].convert<__int8>());
			vector.push_back(stu);
			rs.moveNext();
		}
		if (0 < vector.size())
			return true;
		else
			return false;
	}
	catch (const Poco::Exception& ex)
	{
		std::cerr << "Error: " << ex.displayText() << std::endl;
		return true;
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雁南1830

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值