在数据库中创建一个新表,并将现有表中的描述作为输入

时间:2014-12-10 07:04:40

标签: c++ sql oracle qt qt4

我编写了一个QT GUI应用程序,它连接到Oracle数据库并执行查询并在QTableView中显示输出。

QString host_name=ui->lineHostName->text();
QString db_name=ui->lineDatabaseName->text();
QString user_name=ui->lineUserName->text();
QString pass_word=ui->linePassword->text();
QString port_no=ui->linePortNumber->text();

QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");

db.setHostName(host_name);
db.setDatabaseName(db_name);
db.setUserName(user_name);
db.setPassword(pass_word);
db.setPort(port_no.toInt());

QString MyQuery = ui->lineQuery->text();
db.open();
QSqlQuery query(MyQuery,db);

if(query.exec())
{
    this->model=new QSqlQueryModel();
    model->setQuery(MyQuery);

    ui->tableViewOra->setModel(model);
}

运行程序后,我尝试使用它(作为DESC的替代品)---

SELECT
column_name "Name",
nullable "Null?",
concat(concat(concat(data_type,'('),data_length),')') "Type"
FROM user_tab_columns
WHERE table_name='my_table_number_one';

列名,空参数和数据类型显示在QTableView

现在我的问题是,我可以在QTableView中使用此信息来创建具有相同列名和数据类型的另一个表吗? (基本上创建我查询的表格的副本)。

修改

建议我尝试修改---

QString query_to_replicate;
query_to_replicate=QString("CREATE OR REPLACE TABLE %1 AS %2").arg("AJ_REPLACEMENT_TESTING").arg(ui->lineEdit->text());
QSqlQuery query_second(query_to_replicate,db);

if(query_second.exec())
{
    ui->r_pop_Button->setStyleSheet("QPushButton {background-color: rgb(0, 255, 0);}");

    this->model_relocate=new QSqlQueryModel();
    model_relocate->setQuery(query_second);
    ui->tableView2->setModel(model_relocate);
    while (model_relocate->canFetchMore())
        model_relocate->fetchMore();
    qDebug()<<QDateTime::currentDateTime()<<"Query SUCCESS ";
    db.close();
}

现在它工作了两次,没有抛出错误并在oracle数据库中创建了复制副本(我在构建之前为复制表使用了不同的名称)。

但在成功运行两次后,它抓住了复制。情况完全无能为力。我在构建/编译期间没有收到任何错误。

1 个答案:

答案 0 :(得分:3)

您可以使用CREATE TABLE AS SELECT:

来完成此操作
QString sql = "CREATE TABLE %1 AS %2"
    .arg(yourNewTableName)
    .arg(ui->lineQuery->text());
// and execute this sql code on your QSqlDatabase as you do it above

它将创建一个新表,名称来自“yourNewTableName”变量,并将数据从select查询复制到新表。

代码更新:

QString query_to_replicate;
query_to_replicate=QString("CREATE OR REPLACE TABLE %1 AS %2").arg("AJ_REPLACEMENT_TESTING").arg(ui->lineEdit->text());
QSqlQuery query_second(query_to_replicate,db); // query will be executed there! weird, but...

if (query_second.lastError().isValid())
{
    qDebug() << query_second.lastError().text(); // error happens
}
else
{
    qDebug() << "Table created successfully";
}

此外,您必须在文件顶部#include <QSqlError>使用QtSql错误。