关于Qt重复创建数据库中的表格的报错以及解决方案
今天在写一段如下测试代码的时候,在多次执行代码之后,会出现一个问题:bool MainWindow::createDatabase(const QString &dbName){QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName(dbName);if (!db.open()){ui->te
·
今天在写一段如下测试代码的时候,在多次执行代码之后,会出现一个问题:
bool MainWindow::createDatabase(const QString &dbName)
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(dbName);
if (!db.open())
{
ui->textEdit->append(db.lastError().text());
return false;
}
ui->textEdit->append("数据库打开成功");
QSqlQuery query(db);
if (!query.exec("CREATE TABLE dbst(id INTEGER PRIMARY KEY AUTOINCREMENT,\
name VARCHAR(256) NOT NULL\
)"))
{
ui->textEdit->append(query.lastError().text());
return false;
}
ui->textEdit->append("创建表格成功");
if (!query.exec("INSERT INTO dbst(name) VALUES('XiaoMing')"))
{
ui->textEdit->append(query.lastError().text());
return false;
}
ui->textEdit->append("添加'xiaoming'成功");
if (!query.exec("INSERT INTO dbst(name) VALUES('Xiao Hong')"))
{
ui->textEdit->append(query.lastError().text());
return false;
}
ui->textEdit->append("添加'xiao hong'成功");
if (!query.exec("SELECT * FROM dbst"))
{
ui->textEdit->append(query.lastError().text());
return false;
}
ui->textEdit->append("查询成功,结果如下:");
while (query.next())
{
ui->textEdit->append(QString::number(query.value(0).toInt()) + "'name:" + query.value("name").toString());
}
return true;
}
错误如下:
显示该数据库已经存在,无法执行再创建的操作。
鉴于此,因为采用的是sqlite数据库,所以可以使用——SELECT COUNT(*) FROM sqlite_master WHERE type=‘table’ AND name=‘dbst’——语句判断该表是否存在,代码如下:
if (query.exec("SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='dbst'"))
{
if (query.next())
{
int iCount = query.value(0).toInt();
if (iCount == 0)
{
if (!query.exec("CREATE TABLE dbst(id INTEGER PRIMARY KEY AUTOINCREMENT,\
name VARCHAR(256) NOT NULL\
)"))
{
ui->textEdit->append(query.lastError().text());
return false;
}
ui->textEdit->append("创建表格成功");
}
else
{
ui->textEdit->append("dbst is exist.");
}
}
}
else
{
ui->textEdit->append(query.lastError().text());
return false;
}
现在就可以正常执行了:
原因:每一个sqlite数据库中都自带一个sqlite_master的表格,它定义数据库的模式,sqlite_master的表结构如下:
CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);
更多推荐


所有评论(0)