Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. building ODBC plugin on Linux
Forum Updated to NodeBB v4.3 + New Features

building ODBC plugin on Linux

Scheduled Pinned Locked Moved Solved General and Desktop
11 Posts 5 Posters 7.5k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #2

    Hi and welcome to devnet,

    What if you remove -lodbc ?

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    B 1 Reply Last reply
    0
    • hskoglundH Offline
      hskoglundH Offline
      hskoglund
      wrote on last edited by
      #3

      Hi, I've tried and indeed got the same error, also when just doing an empty 'qmake'. Think you've been hit by this bug :-(

      1 Reply Last reply
      2
      • SGaistS SGaist

        Hi and welcome to devnet,

        What if you remove -lodbc ?

        B Offline
        B Offline
        bdfyy
        wrote on last edited by
        #4

        @SGaist

        I installed:

        sudo apt-get install mdbtools unixodbc libmdbodbc1
        

        Described the driver in /etc/odbcinst.ini:

        [MDBTools]
        Description     = MDBTools Driver
        Driver          = libmdbodbc.so
        Setup           = libmdbodbc.so
        FileUsage       = 1
        UsageCount      = 1
        

        Added a description of the database in /etc/odbc.ini:

        [testdb]
        Description = test
        Driver      = MDBTools
        Database    = /home/rootuser/testdb.accdb
        

        Tested with utilite isql:

        isql testdb
        select * from objects
        

        Works correctly.

        Edited the file /opt/Qt/5.9/Src/qtbase/src/plugins/sqldrivers/odbc/odbc.pro:

        TARGET = qsqlodbc
        
        HEADERS += $$PWD/qsql_odbc_p.h
        SOURCES += $$PWD/qsql_odbc.cpp $$PWD/main.cpp
        
        #QMAKE_USE += odbc
        unix: DEFINES += UNICODE
        
        OTHER_FILES += odbc.json
        
        PLUGIN_CLASS_NAME = QODBCDriverPlugin
        include(../qsqldriverbase.pri)
        

        Commented the line:

        QMAKE_USE += odbc
        

        Builded and installed the plugin with the following commands:

        cd /opt/Qt/5.9/Src/qtbase/src/plugins/sqldrivers/odbc
        sudo /opt/Qt/5.9/gcc_64/bin/qmake "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib -lodbc"
        sudo make
        sudo make install
        

        Created a test application:

        #include <QApplication>
        #include <QSqlDatabase>
        #include <QDebug>
        #include <QFileInfo>
        #include <QSqlError>
        #include <QSqlQuery>
        
        int main(int argc, char *argv[])
        {
            QApplication a(argc, argv);
        
            QString dbFilePath = "/home/rootuser/testdb.accdb";
            QString connectionName = "OdbcConnection";
        
            QFileInfo fileInfo(dbFilePath);
            if (fileInfo.exists())
            {
                QSqlDatabase m_dbConnection = QSqlDatabase::addDatabase("QODBC", connectionName);
                m_dbConnection.setDatabaseName(QString("Driver={MDBTools};FIL={MS Access};DBQ=%1").arg(dbFilePath));
                if (m_dbConnection.open())
                {
                    QSqlQuery query(m_dbConnection);
                    query.setForwardOnly(true);
                    if (query.exec("select * from objects"))
                    {
                        while (query.next())
                        {
                            qDebug() << query.value(1).toString();
                        }
                    }
                    else
                    {
                        qDebug() << "Can not exec query" << m_dbConnection.lastError().text();;
                    }
        
                }
                else
                {
                    qDebug() << "Can not open database: " << m_dbConnection.lastError().text();;
                }
            }
            else
            {
                qDebug() << "File not exist";
            }
        
            return 0;
        }
        

        And received the message:

        Starting /home/rootuser/Documents/Qt/build-TestODBC-Desktop_Qt_5_9_0_GCC_64bit2-Debug/TestODBC...
        Error at Line : syntax error near 'test'
        syntax error near 'test'
        Got no result for 'select 'test'' command
        QODBCDriver::checkHasSQLFetchScroll: Warning - Driver doesn't support scrollable result sets, use forward only mode for queries
        Can not exec query " "
        /home/rootuser/Documents/Qt/build-TestODBC-Desktop_Qt_5_9_0_GCC_64bit2-Debug/TestODBC exited with code 0
        

        SQL query is not execute. What is wrong?
        In Windows this test application work correctly.

        1 Reply Last reply
        0
        • hskoglundH Offline
          hskoglundH Offline
          hskoglund
          wrote on last edited by
          #5

          Hi, I very much suspect this is because MDBTools does not handle Unicode very well.

          Long time ago I had a similar problem using the ODBC plugin in Qt to read Visual Foxpro .dbf files. After some searching, I found a patch that neuters the Unicode support in the ODBC plugin, and that solved it for me.

          You could try it, change a few lines in qsql_odbc.cpp and rebuild the plugin with "make" and "make install". If you are lazy, I've uploaded a freshly patched version (from Qt 5.9), you can download it here.

          B W 2 Replies Last reply
          1
          • hskoglundH hskoglund

            Hi, I very much suspect this is because MDBTools does not handle Unicode very well.

            Long time ago I had a similar problem using the ODBC plugin in Qt to read Visual Foxpro .dbf files. After some searching, I found a patch that neuters the Unicode support in the ODBC plugin, and that solved it for me.

            You could try it, change a few lines in qsql_odbc.cpp and rebuild the plugin with "make" and "make install". If you are lazy, I've uploaded a freshly patched version (from Qt 5.9), you can download it here.

            B Offline
            B Offline
            bdfyy
            wrote on last edited by
            #6

            @hskoglund
            Thank you.
            Data readed. But I received the message:

            Starting /home/rootuser/Documents/Qt/build-TestODBC-Desktop_Qt_5_9_0_GCC_64bit2-Debug/TestODBC...
            QODBCDriver::checkHasSQLFetchScroll: Warning - Driver doesn't support scrollable result sets, use forward only mode for queries
            "qMakeField: Unable to get column attributes for column 0" 	Error: ""
            "qMakeField: Unable to get autovalue attribute for column 0" 	Error: ""
            "qMakeField: Unable to get column attributes for column 1" 	Error: ""
            "qMakeField: Unable to get autovalue attribute for column 1" 	Error: ""
            "qMakeField: Unable to get column attributes for column 2" 	Error: ""
            "qMakeField: Unable to get autovalue attribute for column 2" 	Error: ""
            "06CDA01/A1/A1-12\u0000"
            "06CDA01/A2/A2-17\u0000"
            "06CDA01/A2/A2-17\u0000"
            /home/rootuser/Documents/Qt/build-TestODBC-Desktop_Qt_5_9_0_GCC_64bit2-Debug/TestODBC exited with code 0
            

            Is message normal?

            "qMakeField: Unable to get column attributes for column 0" 	Error: ""
            "qMakeField: Unable to get autovalue attribute for column 0" 	Error: ""
            

            And in test application I added update command:

            if (m_dbConnection.open())
            {
                QSqlQuery query(m_dbConnection);
                query.setForwardOnly(true);
                if (query.exec("select * from objects"))
                {
                    while (query.next())
                    {
                        qDebug() << query.value(1).toString();
                    }
                }
                else
                {
                    qDebug() << "Can not exec query" << m_dbConnection.lastError().text();;
                }
                QSqlQuery query_update(m_dbConnection);
                if (query_update.exec("update objects set F_Name = 'TEST_UPDATE' where ID = 330"))
                {
                    m_dbConnection.commit();
                    qDebug() << "record updated";
                }
                else
                {
                    qDebug() << "can not update record";
                }
            }
            

            And received the message:

            Starting /home/rootuser/Documents/Qt/build-TestODBC-Desktop_Qt_5_9_0_GCC_64bit2-Debug/TestODBC...
            QODBCDriver::checkHasSQLFetchScroll: Warning - Driver doesn't support scrollable result sets, use forward only mode for queries
            "qMakeField: Unable to get column attributes for column 0" 	Error: ""
            "qMakeField: Unable to get autovalue attribute for column 0" 	Error: ""
            "qMakeField: Unable to get column attributes for column 1" 	Error: ""
            "qMakeField: Unable to get autovalue attribute for column 1" 	Error: ""
            "qMakeField: Unable to get column attributes for column 2" 	Error: ""
            "qMakeField: Unable to get autovalue attribute for column 2" 	Error: ""
            "06CDA01/A1/A1-12\u0000"
            "06CDA01/A2/A2-17\u0000"
            "06CDA01/A2/A2-17\u0000"
            Error at Line : syntax error near update
            syntax error near update
            Got no result for 'update objects set F_Name = 'TEST_UPDATE' where ID = 330' command
            can not update record
            /home/rootuser/Documents/Qt/build-TestODBC-Desktop_Qt_5_9_0_GCC_64bit2-Debug/TestODBC exited with code 0
            

            What could be the problem?

            1 Reply Last reply
            0
            • hskoglundH Offline
              hskoglundH Offline
              hskoglund
              wrote on last edited by
              #7

              Hi, I downloaded and installed MDBTools and tested it on a simple Access file using isql:

              select * from ... works fine (same as in your example above)

              but
              select count(*) ...
              update ...
              insert ...
              all returns the same error as "Error at Line : syntax error near..." as in your program above.

              So it seems MDBTools is very rudimentary, indeed if you look at the README it says:
              ....
              The initial goal of these tools is to be able to extract data structures and
              data from mdb files. ...

              I.e. MDBTools is most likey only read-only :-(

              B 1 Reply Last reply
              1
              • hskoglundH hskoglund

                Hi, I downloaded and installed MDBTools and tested it on a simple Access file using isql:

                select * from ... works fine (same as in your example above)

                but
                select count(*) ...
                update ...
                insert ...
                all returns the same error as "Error at Line : syntax error near..." as in your program above.

                So it seems MDBTools is very rudimentary, indeed if you look at the README it says:
                ....
                The initial goal of these tools is to be able to extract data structures and
                data from mdb files. ...

                I.e. MDBTools is most likey only read-only :-(

                B Offline
                B Offline
                bdfyy
                wrote on last edited by
                #8

                @hskoglund
                Thank you.

                1 Reply Last reply
                0
                • hskoglundH hskoglund

                  Hi, I very much suspect this is because MDBTools does not handle Unicode very well.

                  Long time ago I had a similar problem using the ODBC plugin in Qt to read Visual Foxpro .dbf files. After some searching, I found a patch that neuters the Unicode support in the ODBC plugin, and that solved it for me.

                  You could try it, change a few lines in qsql_odbc.cpp and rebuild the plugin with "make" and "make install". If you are lazy, I've uploaded a freshly patched version (from Qt 5.9), you can download it here.

                  W Offline
                  W Offline
                  wxzxg1804
                  wrote on last edited by
                  #9

                  @hskoglund :hi,i have the same problem with Mr bdfyy. Could you give me the Patch qsql_odbc.cpp? Thanks a lot! E_Mail:843576957@qq.com.

                  hskoglundH 1 Reply Last reply
                  0
                  • W wxzxg1804

                    @hskoglund :hi,i have the same problem with Mr bdfyy. Could you give me the Patch qsql_odbc.cpp? Thanks a lot! E_Mail:843576957@qq.com.

                    hskoglundH Offline
                    hskoglundH Offline
                    hskoglund
                    wrote on last edited by
                    #10

                    @wxzxg1804 Hi, just emailed you, I've uploaded a 5.13.0 version in the same place, here

                    L 1 Reply Last reply
                    0
                    • hskoglundH hskoglund

                      @wxzxg1804 Hi, just emailed you, I've uploaded a 5.13.0 version in the same place, here

                      L Offline
                      L Offline
                      levy_rii
                      wrote on last edited by
                      #11

                      @hskoglund said in building ODBC plugin on Linux:

                      @wxzxg1804 Hi, just emailed you, I've uploaded a 5.13.0 version in the same place, here
                      hi,i have the same problem with Mr bdfyy. But the "http://tungware.com/qsql_odbc.cpp" become 404 not found. Could you give me the Patch qsql_odbc.cpp? Thanks a lot! E_Mail:liweixxxx1990@163.com.

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved