Механизъм за кръстосани заявки към бази данни за база данни на Oracle, използващ Qt

Разработвам Qt приложение, където искам да заявя данни от таблици в 2 различни бази данни наведнъж. Използвам Oracle като база данни, но работодателят ми иска да постигна това, без да правя връзка между двете бази данни. Затова си помислих да разработя механизъм за кръстосани заявки към бази данни, използвайки Qt sql модулни обекти. Но не трябва да е толкова сложен като sql парсер. Просто искам данни за заявки от таблици в две бази данни и да ги покажа в 1 изглед и да направя тези заявки с помощта на общ интерфейс. Но според моите познания Qt sql модулите могат да се използват за заявки само от 1 база данни. Ако има някой, който е правил този вид програмиране преди или някой, който има представа за това, вашите предложения са много благодарни. Благодаря ти много.


person kasper360    schedule 29.03.2011    source източник
comment
Различни бази данни на Oracle? На отделни физически хостове или отделни инстанции на Oracle? функционалността dblink на Oracle е по-добра идея от самостоятелна настройка.   -  person OMG Ponies    schedule 29.03.2011
comment
Да, двете бази данни са в един и същ физически хост, което означава, че говоря за 2 екземпляра. Причината, поради която работодателят ми иска да не използвам dblink, е, че някои потребители нямат привилегиите да виждат всички таблици в тези случаи, така че ако използвам dblink за заявка и потребител с по-малко права използва моето приложение, те ще бъдат може да прави нежелани заявки.   -  person kasper360    schedule 29.03.2011
comment
Базите данни не са екземпляри - един екземпляр може да съдържа множество бази данни. Може да е въпрос на предоставяне на достъп (въз основа на ролята, надявам се) до другата база данни, няма нужда от dblink, но истинският проблем изглежда е безвъзмездните средства   -  person OMG Ponies    schedule 29.03.2011
comment
Мислете за това по този начин. Потребителите на това приложение ще влизат с помощта на TNS псевдоними. Така че всеки псевдоним има различни привилегии. Използвам тези псевдоними, за да се свържа с 2 схеми на бази данни, наречени ATS и SER. И искам да направя запитвания към таблици и в двете схеми. Това, което направих досега, е, че създадох 2 обекта QSqlDatabase и се свързах към всяка схема, използвайки псевдонима на TNS. Но за да правя кръстосани заявки към бази данни, трябва да го правя ръчно всеки път, което е много натоварена задача. така че искам да разработя общ интерфейс (евентуално API) и да извикам някои методи за извършване на тези заявки   -  person kasper360    schedule 29.03.2011
comment
Няма нужда от две влизания, просто достъп в ATS схемата от SER или обратно.   -  person OMG Ponies    schedule 29.03.2011


Отговори (1)


Направих нещо подобно преди известно време, като отворих множество връзки към бази данни с помощта на QSqlDatabase.

Така, вдъхновени от официалната документация, можете да опитате нещо подобно:

 //Open database 1:
 QSqlDatabase db1 = QSqlDatabase::addDatabase("QOCI","db1");
 db.setHostName("acidalia");
 db.setDatabaseName("tns1");
 db.setUserName("mojito");
 db.setPassword("J0a1m8");
 bool ok = db.open();

 ..
 //Open database 2:
 QSqlDatabase db2 = QSqlDatabase::addDatabase("QOCI","db1");
 ..
 db.setDatabaseName("tns2");
 ..

Сега базите данни са отворени и можете да ги използвате в заявка. Обърнете внимание на обхвата на db променливите според документа:

 {
     QSqlDatabase db = QSqlDatabase::database("db1");
     QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
 }

 {
     QSqlDatabase db = QSqlDatabase::database("db2");
     QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
 }

 //Clean up
 QSqlDatabase::removeDatabase("db1"); 
 QSqlDatabase::removeDatabase("db2"); 

Вижте removeDatabase относно почистването

person Derick Schoonbee    schedule 03.05.2011