bool MainWindow::setConnectionInfo(bool ifODBC, const QString &host, const QString &port,
const QString &service, const QString &user,
const QString &password, const QString &connectname,
const QString &driver, bool ifDM8)
{
// 检查连接名是否已存在
QList<QTreeWidgetItem*> foundItems = ui->connectionTree->findItems(connectname, Qt::MatchRecursive, 0);
if (!foundItems.isEmpty()) {
MessageDialog::warning(this,
QString::fromLocal8Bit("警告"),
QString::fromLocal8Bit("已存在同名连接"));
return false;
}
if (QSqlDatabase::contains(connectname)) {
QSqlDatabase::removeDatabase(connectname);
}
// 设置连接类型
this->ifDM8 = ifDM8;
m_currentConnectionName = connectname;
if(ifODBC){
if(ifDM8)
connectType[connectname] = 2;
else
connectType[connectname] = 3; // Kingbase 数据库
}
else
connectType[connectname] = 1;
this->ifODBC = ifODBC;
QSqlDatabase m_db;
// 建立数据库连接
if (ifODBC) {
m_db = QSqlDatabase::addDatabase("QODBC", connectname);
QString connStr = QString("DRIVER={%1};"
"SERVER=%2;"
"PORT=%3;"
"DATABASE=%4;"
"UID=%5;"
"PWD=%6")
.arg(driver)
.arg(host)
.arg(port)
.arg(service)
.arg(user)
.arg(password);
m_db.setDatabaseName(connStr);
} else {
m_db = QSqlDatabase::addDatabase("QOCI", connectname);
m_db.setHostName(host);
m_db.setPort(port.toInt());
m_db.setDatabaseName(service);
m_db.setUserName(user);
m_db.setPassword(password);
}
this->host = host;
this->port = port;
this->dbName = service;
this->user = user;
this->password = password;
this->driver = driver;
if (!m_db.open()) {
MessageDialog::warning(this,QString::fromLocal8Bit("警告"), QString::fromLocal8Bit("数据库连接失败!"));
return false;
}
if(!m_first){
MessageDialog::information(this,QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("数据库连接成功!"));
}
// 1. 创建一级节点(用户节点)
QString userDisplayName = QString::fromLocal8Bit("数据库:%1").arg(service) + QString::fromLocal8Bit(" 用户:%1").arg(user);
QTreeWidgetItem *userNode = nullptr;
QList<QTreeWidgetItem*> userItems = ui->connectionTree->findItems(userDisplayName, Qt::MatchExactly, 0);
if (userItems.isEmpty()) {
userNode = new QTreeWidgetItem(ui->connectionTree);
userNode->setText(0, userDisplayName);
userNode->setData(0, Qt::UserRole, user);
if(!ifODBC)
userNode->setToolTip(0, "Oracle");
else
if(ifDM8)
userNode->setToolTip(0, QString::fromLocal8Bit("DM8"));
else
userNode->setToolTip(0, "KingBase R8 V6");
} else {
userNode = userItems.first();
}
// 2. 创建二级节点(连接节点)
QString connectDisplayName = QString::fromLocal8Bit("连接:%1").arg(connectname);
QTreeWidgetItem *connectNode = new QTreeWidgetItem(userNode);
connectNode->setText(0, connectDisplayName);
connectNode->setData(0, Qt::UserRole, connectname);
// 设置连接节点的提示信息
if(ifODBC){
if(ifDM8)
connectNode->setToolTip(0, QString::fromLocal8Bit("DM8连接:%1@%2:%3").arg(user).arg(host).arg(port));
else
connectNode->setToolTip(0, QString::fromLocal8Bit("KingBase R8 V6连接:%1@%2:%3").arg(user).arg(host).arg(port));
}
else
connectNode->setToolTip(0, QString::fromLocal8Bit("Oracle连接:%1@%2:%3").arg(user).arg(host).arg(port));
// 3. 处理不同数据库类型的模式
if (connectType[connectname] == 3) {
// Kingbase 数据库:获取所有模式
handleKingbaseSchemas(m_db, connectname, user, connectNode);
} else if (connectType[connectname] == 2) {
// DM8 数据库:获取所有模式
handleDM8Schemas(m_db, connectname, user, connectNode);
} else {
// Oracle 数据库:单用户模式
handleOracleSingleSchema(m_db, connectname, user, connectNode);
}
// 添加到连接列表
db.append(connectname);
// 保存连接信息到XML
ConnectionInfo info;
info.ifODBC = ifODBC;
info.host = host;
info.port = port;
info.service = service;
info.user = user;
info.password = password;
info.connectname = connectname;
info.driver = driver;
info.ifDM8 = ifDM8;
// 先移除可能存在的旧信息(避免重复)
removeConnectionFromList(connectname);
// 添加新信息
savedConnections.append(info);
// 写入XML文件
if (!m_first) {
saveConnectionsToXml();
}
// 展开所有节点以便查看
ui->connectionTree->expandItem(userNode);
ui->connectionTree->expandItem(connectNode);
return true;
}
// Kingbase 数据库模式处理
void MainWindow::handleKingbaseSchemas(QSqlDatabase &db, const QString &connectname,
const QString &user, QTreeWidgetItem *connectNode)
{
QSqlQuery schemaQuery(db);
schemaQuery.exec("create extension dbms_metadata");
if (schemaQuery.exec("SELECT nspname FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema' ORDER BY nspname")) {
while (schemaQuery.next()) {
QString schemaName = schemaQuery.value(0).toString();
if(schemaName == "sys" || schemaName == "anon")
continue;
// 创建三级节点(模式节点)
QString schemaDisplayName = QString::fromLocal8Bit("模式:%1").arg(schemaName);
QTreeWidgetItem *schemaNode = new QTreeWidgetItem(connectNode);
schemaNode->setText(0, schemaDisplayName);
schemaNode->setData(0, Qt::UserRole, schemaName);
schemaNode->setToolTip(0, QString::fromLocal8Bit("Kingbase模式 - SET search_path TO %1, public").arg(schemaName));
// 创建各类数据库对象的父节点
createSchemaObjectNodes(schemaNode);
// 切换至对应模式
QString turnSql = QString("SET search_path TO %1, public").arg(schemaName);
QSqlQuery turnQuery(db);
if (!turnQuery.exec(turnSql))
{
MessageDialog::warning(this, QString::fromLocal8Bit("警告"), QString::fromLocal8Bit("无法切换至模式:%1").arg(schemaName));
continue;
}
// 加载模式下的所有对象
loadSchemaObjects(db, connectname, user, schemaName, schemaNode);
}
}
}
// DM8 数据库模式处理
void MainWindow::handleDM8Schemas(QSqlDatabase &db, const QString &connectname,
const QString &user, QTreeWidgetItem *connectNode)
{
QSqlQuery schemaQuery(db);
bool ifconnect = true;
// DM8获取所有模式的SQL(排除系统模式)
QString schemaQueryStr = QString(
"SELECT DISTINCT OWNER FROM DBA_OBJECTS "
"WHERE OWNER NOT IN ('SYS','SYSTEM','SYSAUDITOR','SYSSSO','SYSDBO') "
"ORDER BY OWNER"
);
if (!schemaQuery.exec(schemaQueryStr)) {
schemaQueryStr = QString(
"SELECT DISTINCT OWNER FROM ALL_OBJECTS "
"WHERE OWNER NOT IN ('SYS','SYSTEM','SYSAUDITOR','SYSSSO','SYSDBO') "
"ORDER BY OWNER"
);
if(!schemaQuery.exec(schemaQueryStr)) {
ifconnect = false;
MessageDialog::warning(this, QString::fromLocal8Bit("警告"),
QString::fromLocal8Bit("查询DM8模式失败: %1").arg(schemaQuery.lastError().text()));
}
}
if (ifconnect) {
while (schemaQuery.next()) {
QString schemaName = schemaQuery.value(0).toString();
// 创建三级节点(模式节点)
QString schemaDisplayName = QString::fromLocal8Bit("模式:%1").arg(schemaName);
QTreeWidgetItem *schemaNode = new QTreeWidgetItem(connectNode);
schemaNode->setText(0, schemaDisplayName);
schemaNode->setData(0, Qt::UserRole, schemaName);
schemaNode->setToolTip(0, QString::fromLocal8Bit("DM8模式 - ALTER SESSION SET CURRENT_SCHEMA = %1").arg(schemaName));
// 创建各类数据库对象的父节点
createSchemaObjectNodes(schemaNode);
// DM8切换模式
QString turnSql = QString("ALTER SESSION SET CURRENT_SCHEMA = \"%1\"").arg(schemaName);
QSqlQuery turnQuery(db);
if (!turnQuery.exec(turnSql))
{
MessageDialog::warning(this, QString::fromLocal8Bit("警告"),
QString::fromLocal8Bit("无法切换至DM8模式:%1").arg(schemaName));
continue;
}
// 加载模式下的所有对象
loadDM8SchemaObjects(db, connectname, user, schemaName, schemaNode);
}
}
}
// Oracle 数据库单模式处理
void MainWindow::handleOracleSingleSchema(QSqlDatabase &db, const QString &connectname,
const QString &user, QTreeWidgetItem *connectNode)
{
QString schemaName = user; // 使用用户名作为模式名
QString schemaDisplayName = QString::fromLocal8Bit("模式:%1").arg(schemaName);
QTreeWidgetItem *schemaNode = new QTreeWidgetItem(connectNode);
schemaNode->setText(0, schemaDisplayName);
schemaNode->setData(0, Qt::UserRole, schemaName);
schemaNode->setToolTip(0, QString::fromLocal8Bit("Oracle用户模式"));
// 创建各类数据库对象的父节点
createSchemaObjectNodes(schemaNode);
// 加载Oracle用户模式下的所有对象
loadOracleSchemaObjects(db, connectname, user, schemaName, schemaNode);
}
// 创建模式下的对象分类节点
void MainWindow::createSchemaObjectNodes(QTreeWidgetItem *schemaNode)
{
QTreeWidgetItem *tablesItem = new QTreeWidgetItem(schemaNode);
tablesItem->setText(0, QString::fromLocal8Bit("表"));
QTreeWidgetItem *functionsItem = new QTreeWidgetItem(schemaNode);
functionsItem->setText(0, QString::fromLocal8Bit("函数"));
QTreeWidgetItem *proceduresItem = new QTreeWidgetItem(schemaNode);
proceduresItem->setText(0, QString::fromLocal8Bit("过程"));
QTreeWidgetItem *triggersItem = new QTreeWidgetItem(schemaNode);
triggersItem->setText(0, QString::fromLocal8Bit("触发器"));
QTreeWidgetItem *sequencesItem = new QTreeWidgetItem(schemaNode);
sequencesItem->setText(0, QString::fromLocal8Bit("序列"));
QTreeWidgetItem *viewsItem = new QTreeWidgetItem(schemaNode);
viewsItem->setText(0, QString::fromLocal8Bit("视图"));
}
// 加载Kingbase模式对象
void MainWindow::loadSchemaObjects(QSqlDatabase &m_db, const QString &connectname,
const QString &user, const QString &schemaName,
QTreeWidgetItem *schemaNode)
{
// 查找对象分类节点
QTreeWidgetItem *tablesItem = nullptr;
QTreeWidgetItem *viewsItem = nullptr;
QTreeWidgetItem *functionsItem = nullptr;
QTreeWidgetItem *proceduresItem = nullptr;
QTreeWidgetItem *triggersItem = nullptr;
QTreeWidgetItem *sequencesItem = nullptr;
for (int i = 0; i < schemaNode->childCount(); ++i) {
QTreeWidgetItem *child = schemaNode->child(i);
QString text = child->text(0);
if (text == QString::fromLocal8Bit("表")) tablesItem = child;
else if (text == QString::fromLocal8Bit("视图")) viewsItem = child;
else if (text == QString::fromLocal8Bit("函数")) functionsItem = child;
else if (text == QString::fromLocal8Bit("过程")) proceduresItem = child;
else if (text == QString::fromLocal8Bit("触发器")) triggersItem = child;
else if (text == QString::fromLocal8Bit("序列")) sequencesItem = child;
}
// 获取当前模式下的表
QSqlQuery tableQuery(m_db);
tableQuery.prepare("SELECT tablename FROM pg_tables WHERE schemaname = ? ORDER BY tablename");
tableQuery.addBindValue(schemaName);
if (tableQuery.exec()) {
while (tableQuery.next()) {
QString tableName = tableQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "TABLE", tableName, true, schemaName);
if (!ddl.contains(QString::fromLocal8Bit("获取失败"))) {
// 使用新的数据结构存储:tables[用户名][连接名][模式名][表名] = DDL
tables[user][connectname][schemaName].insert(tableName, ddl);
QTreeWidgetItem* tableItem = new QTreeWidgetItem(tablesItem);
tableItem->setText(0, tableName);
}
}
}
// 获取当前模式下的视图
QSqlQuery viewQuery(m_db);
viewQuery.prepare("SELECT viewname FROM pg_views WHERE schemaname = ? ORDER BY viewname");
viewQuery.addBindValue(schemaName);
if (viewQuery.exec()) {
while (viewQuery.next()) {
QString viewName = viewQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "VIEW", viewName, true, schemaName);
if (!ddl.contains(QString::fromLocal8Bit("获取失败"))) {
views[user][connectname][schemaName].insert(viewName, ddl);
QTreeWidgetItem *viewItem = new QTreeWidgetItem(viewsItem);
viewItem->setText(0, viewName);
}
}
}
// 获取当前模式下的函数
QSqlQuery funcQuery(m_db);
funcQuery.prepare("SELECT proname FROM pg_proc WHERE pronamespace = (SELECT oid FROM pg_namespace WHERE nspname = ?) ORDER BY proname");
funcQuery.addBindValue(schemaName);
if (funcQuery.exec()) {
while (funcQuery.next()) {
QString funcName = funcQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "FUNCTION", funcName, true, schemaName);
if (!ddl.contains(QString::fromLocal8Bit("获取失败"))) {
funcs[user][connectname][schemaName].insert(funcName, ddl);
QTreeWidgetItem *funcItem = new QTreeWidgetItem(functionsItem);
funcItem->setText(0, funcName);
}
}
}
// 获取当前模式下的存储过程
QSqlQuery procQuery(m_db);
procQuery.prepare("SELECT proname FROM pg_proc WHERE pronamespace = (SELECT oid FROM pg_namespace WHERE nspname = ?) AND prokind = 'p' ORDER BY proname");
procQuery.addBindValue(schemaName);
if (procQuery.exec()) {
while (procQuery.next()) {
QString procName = procQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "PROCEDURE", procName, true, schemaName);
if (!ddl.contains(QString::fromLocal8Bit("获取失败"))) {
procs[user][connectname][schemaName].insert(procName, ddl);
QTreeWidgetItem *procItem = new QTreeWidgetItem(proceduresItem);
procItem->setText(0, procName);
}
}
}
// 获取当前模式下的触发器
QSqlQuery triggerQuery(m_db);
triggerQuery.prepare("SELECT tgname FROM pg_trigger WHERE tgrelid IN (SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = ?)) ORDER BY tgname");
triggerQuery.addBindValue(schemaName);
if (triggerQuery.exec()) {
while (triggerQuery.next()) {
QString triggerName = triggerQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "TRIGGER", triggerName, true, schemaName);
if (!ddl.contains(QString::fromLocal8Bit("获取失败"))) {
triggers[user][connectname][schemaName].insert(triggerName, ddl);
QTreeWidgetItem *triggerItem = new QTreeWidgetItem(triggersItem);
triggerItem->setText(0, triggerName);
}
}
}
// 获取当前模式下的序列
QSqlQuery seqQuery(m_db);
seqQuery.prepare("SELECT sequencename FROM pg_sequences WHERE schemaname = ? ORDER BY sequencename");
seqQuery.addBindValue(schemaName);
if (seqQuery.exec()) {
while (seqQuery.next()) {
QString seqName = seqQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "SEQUENCE", seqName, true, schemaName);
if (!ddl.contains(QString::fromLocal8Bit("获取失败"))) {
seqs[user][connectname][schemaName].insert(seqName, ddl);
QTreeWidgetItem *seqItem = new QTreeWidgetItem(sequencesItem);
seqItem->setText(0, seqName);
}
}
}
}
// 加载DM8模式对象
void MainWindow::loadDM8SchemaObjects(QSqlDatabase &db, const QString &connectname,
const QString &user, const QString &schemaName,
QTreeWidgetItem *schemaNode)
{
// 查找对象分类节点
QTreeWidgetItem *tablesItem = nullptr;
QTreeWidgetItem *viewsItem = nullptr;
QTreeWidgetItem *functionsItem = nullptr;
QTreeWidgetItem *proceduresItem = nullptr;
QTreeWidgetItem *triggersItem = nullptr;
QTreeWidgetItem *sequencesItem = nullptr;
for (int i = 0; i < schemaNode->childCount(); ++i) {
QTreeWidgetItem *child = schemaNode->child(i);
QString text = child->text(0);
if (text == QString::fromLocal8Bit("表")) tablesItem = child;
else if (text == QString::fromLocal8Bit("视图")) viewsItem = child;
else if (text == QString::fromLocal8Bit("函数")) functionsItem = child;
else if (text == QString::fromLocal8Bit("过程")) proceduresItem = child;
else if (text == QString::fromLocal8Bit("触发器")) triggersItem = child;
else if (text == QString::fromLocal8Bit("序列")) sequencesItem = child;
}
// 加载DM8表
if (tablesItem) {
QSqlQuery tableQuery(db);
QString tableQueryStr = QString(
"SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = '%1' ORDER BY TABLE_NAME"
).arg(schemaName);
if (tableQuery.exec(tableQueryStr)) {
while (tableQuery.next()) {
QString tableName = tableQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "TABLE", tableName, true, schemaName);
if (!ddl.contains(QString::fromLocal8Bit("获取失败"))) {
tables[user][connectname][schemaName].insert(tableName, ddl);
QTreeWidgetItem* tableItem = new QTreeWidgetItem(tablesItem);
tableItem->setText(0, tableName);
}
}
}
}
// 加载DM8视图
if (viewsItem) {
QSqlQuery viewQuery(db);
QString viewQueryStr = QString(
"SELECT VIEW_NAME FROM ALL_VIEWS WHERE OWNER = '%1' ORDER BY VIEW_NAME"
).arg(schemaName);
if (viewQuery.exec(viewQueryStr)) {
while (viewQuery.next()) {
QString viewName = viewQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "VIEW", viewName, true, schemaName);
if (!ddl.contains(QString::fromLocal8Bit("获取失败"))) {
views[user][connectname][schemaName].insert(viewName, ddl);
QTreeWidgetItem *viewItem = new QTreeWidgetItem(viewsItem);
viewItem->setText(0, viewName);
}
}
}
}
// 加载DM8函数
if (functionsItem) {
QSqlQuery funcQuery(db);
QString funcQueryStr = QString(
"SELECT OBJECT_NAME FROM ALL_OBJECTS WHERE OWNER = '%1' AND OBJECT_TYPE = 'FUNCTION' ORDER BY OBJECT_NAME"
).arg(schemaName);
if (funcQuery.exec(funcQueryStr)) {
while (funcQuery.next()) {
QString funcName = funcQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "FUNCTION", funcName, true, schemaName);
if (!ddl.contains(QString::fromLocal8Bit("获取失败"))) {
funcs[user][connectname][schemaName].insert(funcName, ddl);
QTreeWidgetItem *funcItem = new QTreeWidgetItem(functionsItem);
funcItem->setText(0, funcName);
}
}
}
}
// 加载DM8存储过程
if (proceduresItem) {
QSqlQuery procQuery(db);
QString procQueryStr = QString(
"SELECT OBJECT_NAME FROM ALL_OBJECTS WHERE OWNER = '%1' AND OBJECT_TYPE = 'PROCEDURE' ORDER BY OBJECT_NAME"
).arg(schemaName);
if (procQuery.exec(procQueryStr)) {
while (procQuery.next()) {
QString procName = procQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "PROCEDURE", procName, true, schemaName);
if (!ddl.contains(QString::fromLocal8Bit("获取失败"))) {
procs[user][connectname][schemaName].insert(procName, ddl);
QTreeWidgetItem *procItem = new QTreeWidgetItem(proceduresItem);
procItem->setText(0, procName);
}
}
}
}
// 加载DM8触发器
if (triggersItem) {
QSqlQuery triggerQuery(db);
QString triggerQueryStr = QString(
"SELECT TRIGGER_NAME FROM ALL_TRIGGERS WHERE OWNER = '%1' ORDER BY TRIGGER_NAME"
).arg(schemaName);
if (triggerQuery.exec(triggerQueryStr)) {
while (triggerQuery.next()) {
QString triggerName = triggerQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "TRIGGER", triggerName, true, schemaName);
if (!ddl.contains(QString::fromLocal8Bit("获取失败"))) {
triggers[user][connectname][schemaName].insert(triggerName, ddl);
QTreeWidgetItem *triggerItem = new QTreeWidgetItem(triggersItem);
triggerItem->setText(0, triggerName);
}
}
}
}
// 加载DM8序列
if (sequencesItem) {
QSqlQuery seqQuery(db);
QString seqQueryStr = QString(
"SELECT SEQUENCE_NAME FROM ALL_SEQUENCES WHERE SEQUENCE_OWNER = '%1' ORDER BY SEQUENCE_NAME"
).arg(schemaName);
if (seqQuery.exec(seqQueryStr)) {
while (seqQuery.next()) {
QString seqName = seqQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "SEQUENCE", seqName, true, schemaName);
if (!ddl.contains(QString::fromLocal8Bit("获取失败"))) {
seqs[user][connectname][schemaName].insert(seqName, ddl);
QTreeWidgetItem *seqItem = new QTreeWidgetItem(sequencesItem);
seqItem->setText(0, seqName);
}
}
}
}
}
// 加载Oracle模式对象(原有逻辑)
void MainWindow::loadOracleSchemaObjects(QSqlDatabase &m_db, const QString &connectname,
const QString &user, const QString &schemaName,
QTreeWidgetItem *schemaNode)
{
// 创建各类数据库对象的父节点
QTreeWidgetItem *tablesItem = new QTreeWidgetItem(schemaNode);
tablesItem->setText(0, QString::fromLocal8Bit("表"));
QTreeWidgetItem *functionsItem = new QTreeWidgetItem(schemaNode);
functionsItem->setText(0, QString::fromLocal8Bit("函数"));
QTreeWidgetItem *proceduresItem = new QTreeWidgetItem(schemaNode);
proceduresItem->setText(0, QString::fromLocal8Bit("过程"));
QTreeWidgetItem *triggersItem = new QTreeWidgetItem(schemaNode);
triggersItem->setText(0, QString::fromLocal8Bit("触发器"));
QTreeWidgetItem *sequencesItem = new QTreeWidgetItem(schemaNode);
sequencesItem->setText(0, QString::fromLocal8Bit("序列"));
QTreeWidgetItem *viewsItem = new QTreeWidgetItem(schemaNode);
viewsItem->setText(0, QString::fromLocal8Bit("视图"));
// 获取表
QSqlQuery tableQuery(m_db);
if (tableQuery.exec("SELECT table_name FROM user_tables ORDER BY table_name")) {
while (tableQuery.next()) {
QString tableName = tableQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "TABLE", tableName, false);
if(ddl != QString::fromLocal8Bit("获取失败:未找到对象或不允许查询系统定义的内部索引\n-20008: DBMS_METADATA.GET_DDL line 2400 QODBC3: Unable to execute statement")){
tables[user][connectname][schemaName].insert(tableName, ddl);
QTreeWidgetItem* tableItem = new QTreeWidgetItem(tablesItem);
tableItem->setText(0, tableName);
}
}
}
// 获取视图
QSqlQuery viewQuery(m_db);
if (viewQuery.exec("SELECT view_name FROM user_views ORDER BY view_name")) {
while (viewQuery.next()) {
QString viewName = viewQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "VIEW", viewName, false);
views[user][connectname][schemaName].insert(viewName, ddl);
QTreeWidgetItem *viewItem = new QTreeWidgetItem(viewsItem);
viewItem->setText(0, viewName);
}
}
// 获取函数
QSqlQuery funcQuery(m_db);
if (funcQuery.exec("SELECT object_name FROM user_objects WHERE object_type = 'FUNCTION' ORDER BY object_name")) {
while (funcQuery.next()) {
QString funcName = funcQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "FUNCTION", funcName, false);
if(ddl != QString::fromLocal8Bit("获取失败:未找到对象或不允许查询系统定义的内部索引\n-20008: DBMS_METADATA.GET_DDL line 2400 QODBC3: Unable to execute statement")){
funcs[user][connectname][schemaName].insert(funcName, ddl);
QTreeWidgetItem *funcItem = new QTreeWidgetItem(functionsItem);
funcItem->setText(0, funcName);
}
}
}
// 获取存储过程
QSqlQuery procQuery(m_db);
if (procQuery.exec("SELECT object_name FROM user_objects WHERE object_type = 'PROCEDURE' ORDER BY object_name")) {
while (procQuery.next()) {
QString procName = procQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "PROCEDURE", procName, false);
procs[user][connectname][schemaName].insert(procName, ddl);
QTreeWidgetItem *procItem = new QTreeWidgetItem(proceduresItem);
procItem->setText(0, procName);
}
}
// 获取触发器
QSqlQuery triggerQuery(m_db);
if (triggerQuery.exec("SELECT trigger_name FROM user_triggers ORDER BY trigger_name")) {
while (triggerQuery.next()) {
QString triggerName = triggerQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "TRIGGER", triggerName, false);
triggers[user][connectname][schemaName].insert(triggerName, ddl);
QTreeWidgetItem *triggerItem = new QTreeWidgetItem(triggersItem);
triggerItem->setText(0, triggerName);
}
}
// 获取序列
QSqlQuery seqQuery(m_db);
if (seqQuery.exec("SELECT sequence_name FROM user_sequences ORDER BY sequence_name")) {
while (seqQuery.next()) {
QString seqName = seqQuery.value(0).toString().toUpper();
QString ddl = getEntityDDL(connectname, "SEQUENCE", seqName, false);
seqs[user][connectname][schemaName].insert(seqName, ddl);
QTreeWidgetItem *seqItem = new QTreeWidgetItem(sequencesItem);
seqItem->setText(0, seqName);
}
}
}
分析并理解此逻辑