Page 1 of 2 12 LastLast
Results 1 to 20 of 21

Thread: Switching between two databases

  1. #1
    Join Date
    Apr 2009
    Posts
    206
    Thanks
    34
    Thanked 2 Times in 2 Posts

    Default Switching between two databases

    Hello Friends,

    how could I switch between two databases on different servers when I have two fill two views with two tables from databses. When I add the the two databases the last Database sets itself as default one and one view is not filled up.
    Is there a mechanism two switch between the connections when I have two fire up a sql statement.???

  2. #2
    Join Date
    Aug 2008
    Location
    Ukraine, Krivoy Rog
    Posts
    1,963
    Thanked 370 Times in 336 Posts
    Qt products
    Qt3 Qt4 Qt5
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Switching between two databases

    use this method QSqlDatabase::database.
    Qt Assistant -- rocks!
    please, use tags [CODE] & [/CODE].

  3. #3
    Join Date
    Apr 2009
    Posts
    206
    Thanks
    34
    Thanked 2 Times in 2 Posts

    Default Re: Switching between two databases

    hmm

    Ok I connect my databses like this

    Qt Code:
    1. QString driver= "QODBC";
    2. m_qstrConTrackDB="DRIVER={SQL Server};Server=server1;Trusted_Connection=no;Database=db1;Uid="";Pwd="";";
    3. m_TrackDB = QSqlDatabase::addDatabase(driver);
    4. m_TrackDB.setDatabaseName(m_qstrConTrackDB);
    5. if (!m_TrackDB.open()) {
    6. QSqlError err = m_TrackDB.lastError();
    7. QMessageBox::information(0, QObject::tr("Cannot open database"), err.text());
    8. }
    9.  
    10. m_qstrConDashDB="DRIVER={SQL Server Native Client 10.0};Server2;Trusted_Connection=yes;Database=db2;Uid="";Pwd="";";
    11. m_DashDB = QSqlDatabase::addDatabase(driver);
    12. m_DashDB.setDatabaseName(m_qstrConDashDB);
    13. if (!m_DashDB.open()) {
    14. QSqlError err = m_DashDB.lastError();
    15. QMessageBox::information(0, QObject::tr("Cannot open database"), err.text());
    16. }
    To copy to clipboard, switch view to plain text mode 

    How do I use the method you metioned ???
    Qt Code:
    1. m_TrackDB::database(m_qstrConTrackDB,true);
    To copy to clipboard, switch view to plain text mode 
    thenn fill up the first view
    and then
    Qt Code:
    1. m_TrackDB::database(m_qstrConTrackDB,false);
    2. m_DashDB::database(m_qstrConDashDB,true);
    To copy to clipboard, switch view to plain text mode 
    then fill up the second view

    Is that right??

  4. #4
    Join Date
    Aug 2008
    Location
    Ukraine, Krivoy Rog
    Posts
    1,963
    Thanked 370 Times in 336 Posts
    Qt products
    Qt3 Qt4 Qt5
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Switching between two databases

    when you work with several databases you have to specify connectionName in QSqlDatabase::addDatabase and then you have to specify this parameter in QSqlDatabase::database.
    so, you code should look like
    Qt Code:
    1. QString driver= "QODBC";
    2. m_qstrConTrackDB="DRIVER={SQL Server};Server=server1;Trusted_Connection=no;Database=db1;Uid="";Pwd="";";
    3. m_TrackDB = QSqlDatabase::addDatabase(driver, "db1");//connection name specified
    4. m_TrackDB.setDatabaseName(m_qstrConTrackDB);
    5. if (!m_TrackDB.open()) {
    6. QSqlError err = m_TrackDB.lastError();
    7. QMessageBox::information(0, QObject::tr("Cannot open database"), err.text());
    8. }
    9.  
    10. m_qstrConDashDB="DRIVER={SQL Server Native Client 10.0};Server2;Trusted_Connection=yes;Database=db2;Uid="";Pwd="";";
    11. m_DashDB = QSqlDatabase::addDatabase(driver, "db2");//connection name specified
    12. m_DashDB.setDatabaseName(m_qstrConDashDB);
    13. if (!m_DashDB.open()) {
    14. QSqlError err = m_DashDB.lastError();
    15. QMessageBox::information(0, QObject::tr("Cannot open database"), err.text());
    16. }
    17. ...
    18. m_TrackDB = QSqlDatabase::database("db1");//connection name specified
    19. m_DashDB = QSqlDatabase::database("db2");//connection name specified
    20. ...
    To copy to clipboard, switch view to plain text mode 
    Last edited by spirit; 13th May 2009 at 10:26.
    Qt Assistant -- rocks!
    please, use tags [CODE] & [/CODE].

  5. #5
    Join Date
    Apr 2009
    Posts
    206
    Thanks
    34
    Thanked 2 Times in 2 Posts

    Default Re: Switching between two databases

    The second argument in the method databse have to be a boolean! Or am I wrong??

  6. #6
    Join Date
    Aug 2008
    Location
    Ukraine, Krivoy Rog
    Posts
    1,963
    Thanked 370 Times in 336 Posts
    Qt products
    Qt3 Qt4 Qt5
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Switching between two databases

    from docs
    QSqlDatabase QSqlDatabase::database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true ) [static]
    that means, that third argument is bool.
    Qt Assistant -- rocks!
    please, use tags [CODE] & [/CODE].

  7. #7
    Join Date
    Apr 2009
    Posts
    206
    Thanks
    34
    Thanked 2 Times in 2 Posts

    Default Re: Switching between two databases

    Hard to believe cause I see only one comma between the parantheses and that means only two argument....

    And when I specify a name as second argument as you mentioned

    Qt Code:
    1. m_TrackDB = QSqlDatabase::addDatabase(driver,"db1");
    To copy to clipboard, switch view to plain text mode 

    my DB don´t connects?????

  8. #8
    Join Date
    Aug 2008
    Location
    Ukraine, Krivoy Rog
    Posts
    1,963
    Thanked 370 Times in 336 Posts
    Qt products
    Qt3 Qt4 Qt5
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Switching between two databases

    sorry. yes, the first paremetr is QString, the second is bool.
    I updated code above.
    Qt Assistant -- rocks!
    please, use tags [CODE] & [/CODE].

  9. #9
    Join Date
    Apr 2009
    Posts
    206
    Thanks
    34
    Thanked 2 Times in 2 Posts

    Default Re: Switching between two databases

    I don´t understand it ;o(( hmmm

    Why I have to ovveride my QSqldatabse m_TrackDB with

    Qt Code:
    1. m_TrackDB = QSqlDatabase::database("db1");
    To copy to clipboard, switch view to plain text mode 

    after I make this

    Qt Code:
    1. QString driver= "QODBC";
    2. m_qstrConTrackDB="DRIVER={SQL Server};Server=server1;Trusted_Connection=no;Database=db1;Uid="";Pwd="";";
    3. m_TrackDB = QSqlDatabase::addDatabase(driver);
    To copy to clipboard, switch view to plain text mode 

    both methods returns a QSqlDatabase object....

  10. #10
    Join Date
    Aug 2008
    Location
    Ukraine, Krivoy Rog
    Posts
    1,963
    Thanked 370 Times in 336 Posts
    Qt products
    Qt3 Qt4 Qt5
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Switching between two databases

    this method QSqlDatabase::addDatabase(driver); returns a databse with hard-code connection name which is used under-the-hood in QSqlQuery/QSqlTableModel/QSqlQueryModel and if you add another database in such way old connection will be lost. so, to avoid this you need specify connectionName for correct determination of dtabase connections.
    Qt Assistant -- rocks!
    please, use tags [CODE] & [/CODE].

  11. #11
    Join Date
    Jan 2006
    Location
    Germany
    Posts
    4,380
    Thanks
    19
    Thanked 1,005 Times in 913 Posts
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows Symbian S60
    Wiki edits
    5

    Default Re: Switching between two databases

    By the way: you don't have to store the databases at all. This can cause ugly warning messages when quitting the application. Better use:
    Qt Code:
    1. ::Constructor()
    2. {
    3. QSqlDatabase tempDB;
    4.  
    5. tempDB = QSqlDatabase::addDatabase("QODBC", "Database_01");
    6. tempDB.set//XXX...
    7.  
    8. tempDB = QSqlDatabase::addDatabase("QODBC", "Database_02");
    9. tempDB.set//XXX...
    10. }
    11.  
    12. ::MyFunction()
    13. {
    14. QSqlDatabase usedDB = (ifFancyStuffIsTrue) ? QSqlDatabase::database("Database_01") : QSqlDatabase::database("Database_02");
    15.  
    16. // use usedDB normal...
    17. }
    To copy to clipboard, switch view to plain text mode 

  12. #12
    Join Date
    Aug 2008
    Location
    Ukraine, Krivoy Rog
    Posts
    1,963
    Thanked 370 Times in 336 Posts
    Qt products
    Qt3 Qt4 Qt5
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Switching between two databases

    I missed to post this.
    Qt Assistant -- rocks!
    please, use tags [CODE] & [/CODE].

  13. #13
    Join Date
    Apr 2009
    Posts
    206
    Thanks
    34
    Thanked 2 Times in 2 Posts

    Default Re: Switching between two databases

    Ok when I make it like this
    Qt Code:
    1. QString driver= "QODBC";
    2. m_qstrConTrackDB="DRIVER={SQL Server};Server=server1;Trusted_Connection=no;Database=TrackingDB;Uid="";Pwd="";";
    3. m_TrackDB = QSqlDatabase::addDatabase(driver);
    4. m_TrackDB.setDatabaseName(m_qstrConTrackDB);
    5. if (!m_TrackDB.open()) {
    6. QSqlError err = m_TrackDB.lastError();
    7. QMessageBox::information(0, QObject::tr("Cannot open database"), err.text());
    8. }
    9.  
    10. m_qstrConDashDB="DRIVER={SQL Server Native Client 10.0};Server=server2;Trusted_Connection=yes;Database=Dashboard;Uid="";Pwd="";";
    11. m_DashDB = QSqlDatabase::addDatabase(driver);
    12. m_DashDB.setDatabaseName(m_qstrConDashDB);
    13. if (!m_DashDB.open()) {
    14. QSqlError err = m_DashDB.lastError();
    15. QMessageBox::information(0, QObject::tr("Cannot open database"), err.text());
    16. }
    17.  
    18. mainTab = new QTabWidget(this);
    19. redTab = new QTabWidget();
    20. model = new QSqlTableModel(mainTab);
    21. model2 = new QSqlTableModel(redTab);
    22. QString tableName = "tabel1";
    23. QString tableRed = "table2";
    24. model->setTable(tableName);
    25. model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    26. model->select();
    27.  
    28. //Filling up the columnnames
    29. QStringList colnameList;
    30. QSqlQuery query("SELECT COLUMN_NAME "
    31. "FROM INFORMATION_SCHEMA.Columns "
    32. "where TABLE_NAME = ' " + tableName +" ' ",m_TrackDB);
    33. while (query.next()) {
    34. QString qstrLine = query.value(0).toString();
    35. colnameList << qstrLine;
    36. }
    37. int colCounter(0);
    38. foreach (QString str, colnameList)
    39. {
    40. std::string mystdout = str.toAscii().constData();
    41. std::cout << "ColHeader " << mystdout << std::endl;
    42. QByteArray ba = str.toLatin1();
    43. const char *c_str = ba.data();
    44. model->setHeaderData(colCounter++, Qt::Horizontal, c_str);
    45. }
    46. QStringList redColnameList;
    47.  
    48. //Filling up the List with colNames
    49. QSqlQuery query2("SELECT COLUMN_NAME "
    50. "FROM INFORMATION_SCHEMA.Columns "
    51. "where TABLE_NAME = ' " + tableRed +" ' ",m_DashDB);
    52. while (query2.next()) {
    53. QString qstrLine = query2.value(0).toString();
    54. redColnameList << qstrLine;
    55. }
    56. int colCounter2(0);
    57. foreach (QString str, redColnameList)
    58. {
    59. QByteArray ba = str.toLatin1();
    60. const char *c_str = ba.data();
    61. model2->setHeaderData(colCounter2++, Qt::Horizontal, c_str);
    62. }
    63. model2->setTable(tableRed);
    64. model2->setEditStrategy(QSqlTableModel::OnManualSubmit);
    65. model2->select();
    66.  
    67. //! [0] //! [1]
    68. view = new QTableView;
    69. view->setModel(model);
    70. view->setAlternatingRowColors(true);
    71. view->resizeColumnsToContents();
    72. redView = new QTableView;
    73. redView->setModel(model2);
    74. redView->setAlternatingRowColors(true);
    75. redView->resizeColumnsToContents();
    76.  
    77.  
    78. QGroupBox *groupBox = new QGroupBox(tr("AutoRedress"));
    79. QGroupBox *redressBox = new QGroupBox(tr("Redressen"));
    80. QHBoxLayout *mainLayout = new QHBoxLayout;
    81. QHBoxLayout *redressLayout = new QHBoxLayout;
    82. QSplitter *HSplitter = new QSplitter(Qt::Vertical);
    83. mainTab->addTab(view,tableName);
    84. mainTab->setTabsClosable(true);
    85.  
    86. redTab->addTab(redView,tableRed);
    87. redTab->setTabsClosable(true);
    88. etc.......
    To copy to clipboard, switch view to plain text mode 

    only the redview is filled
    and where comes your method here ????

  14. #14
    Join Date
    Aug 2008
    Location
    Ukraine, Krivoy Rog
    Posts
    1,963
    Thanked 370 Times in 336 Posts
    Qt products
    Qt3 Qt4 Qt5
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Switching between two databases

    QSqlTableModel also has second parameter for setting a database.
    Qt Assistant -- rocks!
    please, use tags [CODE] & [/CODE].

  15. #15
    Join Date
    Apr 2009
    Posts
    206
    Thanks
    34
    Thanked 2 Times in 2 Posts

    Default Re: Switching between two databases

    When I give the argument
    Qt Code:
    1. model = new QSqlTableModel(mainTab,m_TrackDB);
    2. redModel = new QSqlTableModel(redTab,m_DashDB);
    To copy to clipboard, switch view to plain text mode 

    it changes nothing only my second view with the second database are filled with the data from redtable.....?????!!!!!!

  16. #16
    Join Date
    Aug 2008
    Location
    Ukraine, Krivoy Rog
    Posts
    1,963
    Thanked 370 Times in 336 Posts
    Qt products
    Qt3 Qt4 Qt5
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Switching between two databases

    try this example, works fine
    h
    Qt Code:
    1. #ifndef TEST_H
    2. #define TEST_H
    3.  
    4. #include <QWidget>
    5.  
    6.  
    7. class Test: public QWidget
    8. {
    9. Q_OBJECT
    10.  
    11. public:
    12. Test(QWidget *parent = 0);
    13.  
    14. private slots:
    15. void connectToDb1();
    16. void connectToDb2();
    17. void showView1();
    18. void showView2();
    19.  
    20. public:
    21. QPushButton *m_pbConnectToDb1;
    22. QPushButton *m_pbConnectToDb2;
    23. QPushButton *m_pbShowView1;
    24. QPushButton *m_pbShowView2;
    25. };
    26.  
    27. #endif//TEST_H
    To copy to clipboard, switch view to plain text mode 
    cpp
    Qt Code:
    1. #include <QtGui>
    2. #include <QtSql>
    3. #include "test.h"
    4.  
    5. Test::Test(QWidget *parent)
    6. : QWidget(parent)
    7. {
    8. QGridLayout *gl = new QGridLayout(this);
    9. m_pbConnectToDb1 = new QPushButton(tr("Connect to first database"));
    10. m_pbConnectToDb2 = new QPushButton(tr("Connect to second database"));
    11. m_pbShowView1 = new QPushButton(tr("Show first view"));
    12. m_pbShowView2 = new QPushButton(tr("Show first view"));
    13.  
    14. m_pbShowView1->setEnabled(false);
    15. m_pbShowView2->setEnabled(false);
    16.  
    17. gl->addWidget(m_pbConnectToDb1, 0, 0);
    18. gl->addWidget(m_pbConnectToDb2, 0, 1);
    19. gl->addWidget(m_pbShowView1, 1, 0);
    20. gl->addWidget(m_pbShowView2, 1, 1);
    21.  
    22. connect(m_pbConnectToDb1, SIGNAL(clicked()), SLOT(connectToDb1()));
    23. connect(m_pbConnectToDb2, SIGNAL(clicked()), SLOT(connectToDb2()));
    24. connect(m_pbShowView1, SIGNAL(clicked()), SLOT(showView1()));
    25. connect(m_pbShowView2, SIGNAL(clicked()), SLOT(showView2()));
    26. }
    27.  
    28. void Test::connectToDb1()
    29. {
    30. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", QLatin1String("db1"));
    31. db.setDatabaseName("db1");
    32. const bool isOpen = db.open();
    33. m_pbConnectToDb1->setEnabled(!isOpen);
    34. m_pbShowView1->setEnabled(isOpen);
    35. if (!isOpen) {
    36. QMessageBox::critical(this, tr("critical"), db.lastError().text());
    37. return;
    38. }
    39. QSqlQuery query(db);
    40. if (!db.tables().contains("table1") && !query.exec("CREATE TABLE table1 (id INT, name VARCHAR(20))")) {
    41. QMessageBox::critical(this, tr("critical"), query.lastError().text());
    42. return;
    43. }
    44.  
    45. query.prepare("INSERT INTO table1 (id, name) VALUES (?, ?)");
    46.  
    47. QVariantList ints;
    48. ints << 1 << 2 << 3 << 4;
    49. query.addBindValue(ints);
    50.  
    51. QVariantList names;
    52. names << "Harald" << "Boris" << "Trond" << QVariant(QVariant::String);
    53. query.addBindValue(names);
    54.  
    55. if (!query.execBatch()) {
    56. QMessageBox::critical(this, tr("critical"), query.lastError().text());
    57. return;
    58. }
    59. }
    60.  
    61. void Test::connectToDb2()
    62. {
    63. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", QLatin1String("db2"));
    64. db.setDatabaseName("db2");
    65. const bool isOpen = db.open();
    66. m_pbConnectToDb2->setEnabled(!isOpen);
    67. m_pbShowView2->setEnabled(isOpen);
    68. if (!isOpen) {
    69. QMessageBox::critical(this, tr("critical"), db.lastError().text());
    70. return;
    71. }
    72. QSqlQuery query(db);
    73. if (!db.tables().contains("table2") && !query.exec("CREATE TABLE table2 (id INT, name VARCHAR(20))")) {
    74. QMessageBox::critical(this, tr("critical"), query.lastError().text());
    75. return;
    76. }
    77.  
    78. query.prepare("INSERT INTO table2 (id, name) VALUES (?, ?)");
    79.  
    80. QVariantList ints;
    81. ints << 5 << 6 << 7 << 8;
    82. query.addBindValue(ints);
    83.  
    84. QVariantList names;
    85. names << "Tom" << "Jim" << "John" << QVariant(QVariant::String);
    86. query.addBindValue(names);
    87.  
    88. if (!query.execBatch()) {
    89. QMessageBox::critical(this, tr("critical"), query.lastError().text());
    90. return;
    91. }
    92. }
    93.  
    94. void Test::showView1()
    95. {
    96. QSqlDatabase db = QSqlDatabase::database(QLatin1String("db1"));
    97. QSqlTableModel *model = new QSqlTableModel(0, db);
    98. model->setTable("table1");
    99. model->select();
    100.  
    101. QTableView *view = new QTableView();
    102. view->setAttribute(Qt::WA_DeleteOnClose);
    103. view->setModel(model);
    104. view->show();
    105. }
    106.  
    107. void Test::showView2()
    108. {
    109. QSqlDatabase db = QSqlDatabase::database(QLatin1String("db2"));
    110. QSqlTableModel *model = new QSqlTableModel(0, db);
    111. model->setTable("table2");
    112. model->select();
    113.  
    114. QTableView *view = new QTableView();
    115. view->setAttribute(Qt::WA_DeleteOnClose);
    116. view->setModel(model);
    117. view->show();
    118. }
    To copy to clipboard, switch view to plain text mode 
    Qt Assistant -- rocks!
    please, use tags [CODE] & [/CODE].

  17. #17
    Join Date
    Jan 2006
    Location
    Germany
    Posts
    4,380
    Thanks
    19
    Thanked 1,005 Times in 913 Posts
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows Symbian S60
    Wiki edits
    5

    Default Re: Switching between two databases

    Quote Originally Posted by codeman View Post
    When I give the argument
    Qt Code:
    1. model = new QSqlTableModel(mainTab,m_TrackDB);
    2. redModel = new QSqlTableModel(redTab,m_DashDB);
    To copy to clipboard, switch view to plain text mode 

    it changes nothing only my second view with the second database are filled with the data from redtable.....?????!!!!!!
    have you opened m_TrackDB? maybe there was an error while opening this database.

  18. #18
    Join Date
    Apr 2009
    Posts
    206
    Thanks
    34
    Thanked 2 Times in 2 Posts

    Default Re: Switching between two databases

    I think yes see the third post there I create two databases and I open them. But I think my problem is when I create or add the second database it ovverrides the first but my databasename are the connectionsstrings and when I add the databse like this

    Qt Code:
    1. m_TrackDB = QSqlDatabase::addDatabase(driver,"db1");
    2. m_TrackDB.setDatabaseName(m_qstrConTrackDB);
    To copy to clipboard, switch view to plain text mode 

    it don´t connect???? It don´t accepts the second argument from addDatabase!

  19. #19
    Join Date
    Aug 2008
    Location
    Ukraine, Krivoy Rog
    Posts
    1,963
    Thanked 370 Times in 336 Posts
    Qt products
    Qt3 Qt4 Qt5
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Switching between two databases

    did you try my exmaple? did it work? why don't you do in the same way?
    Qt Assistant -- rocks!
    please, use tags [CODE] & [/CODE].

  20. #20
    Join Date
    Apr 2009
    Posts
    206
    Thanks
    34
    Thanked 2 Times in 2 Posts

    Default Re: Switching between two databases

    Cause I have to understand it thatswhy I try to find the problem in my code, but thanx a lot I will try it asap

Similar Threads

  1. Qt4 Databases and Model-View problem...
    By k12yp70n in forum Newbie
    Replies: 3
    Last Post: 21st February 2009, 21:19
  2. dictionary databases
    By rishiraj in forum Newbie
    Replies: 1
    Last Post: 5th January 2009, 08:30
  3. Update menu items on switching MDI subwindows
    By John_P in forum Qt Programming
    Replies: 1
    Last Post: 15th March 2008, 23:48
  4. Dynamic Language Switching
    By Salazaar in forum Newbie
    Replies: 7
    Last Post: 29th June 2007, 12:00
  5. Qt's optimized OpenGL context switching
    By sverhoff in forum Qt Programming
    Replies: 0
    Last Post: 28th March 2006, 16:40

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.