2014-12-10 3 views
2

Oracle 데이터베이스에 연결하여 쿼리를 수행하고 출력을 QTableView에 표시하는 QT GUI 응용 프로그램을 작성했습니다.기존 테이블의 설명을 입력으로 데이터베이스에 새 테이블 만들기

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); 
} 

프로그램을 실행 한 후, I는 ---합니다 (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에서이 정보를 사용하여 동일한 열 이름과 데이터 형식으로 다른 테이블을 만들 수 있습니까 ??? (기본적으로 쿼리 된 테이블 테이블의 복사본 만들기).

복제에 대한 EDIT 내가 함께 ---

지금
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(); 
} 

이 오류를 던지고없이, 두 번 근무하고 오라클 데이터베이스의 복제 된 복사본을 만들어 수정 시도 제안 후

는 (나는 다른 이름을 사용 테이블).

하지만 두 번 성공적으로 실행 한 후 복제를 포착했습니다. 상황은 완전히 우둔합니다. 빌드/컴파일하는 동안 오류가 발생하지 않습니다.

답변

3

당신은 AS SELECT CREATE TABLE을 사용하여이 작업을 수행 할 수 있습니다

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"변수의 이름으로, 새로운 테이블을 만들고 새 테이블로 선택 쿼리에서 데이터를 복사합니다.

코드 업데이트 :

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 오류를 사용해야합니다.

+0

여기에 필요한 인수는 무엇입니까 ??? QString sql = ...... 선언의 마지막 구문입니까? – RicoRicochet

+0

QString query_to_replicate; query_to_replicate = QString ("CREATE TABLE % 1 AS % 2"). arg (AJ_REPLICATED) .arg (ui-> lineEdit-> text()); QSqlQuery query2 (query_to_replicate, db); 이 /home/aj/MY_QT_WORK/replicate_populate/mainwindow.cpp:95에 오류가 표시되고 : 오류 : 'AJ_REPLICATED'는 문자열이어야합니다이 범위 – RicoRicochet

+0

AJ_REPLICATED에 선언되지 않았다가, 새 테이블 이름을 포함, 즉 QString AJ_REPLICATED = "myNewTable"; – k0l0b0k

관련 문제