天天看點

linux mariadb odbc

mariadb與mysql非常像,甚至安裝mariadb後可以使用mysql指令運作mariadb。

安裝軟體

sudo apt install      

我這裡安裝的是mariadb19。如果是mariadb18,請把下面的mariadb19換成mariadb18。

設定密碼

剛安裝是沒有密碼的。先設定密碼

sudo      
mysql      
UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('a') WHERE User = 'root';
FLUSH PRIVILEGES;      

這裡密碼設定成了​

​a​

以後就可以使用

mysql -u root -p      

登入了

安裝unixodbc

sudo apt install      

測試一下是否安裝成功

odbcinst -j      

成功:

linux mariadb odbc

失敗的話看參考連結。

安裝MariaDB Connector/ODBC

​​https://downloads.mariadb.org/connector-odbc/+releases/​​

這是目前的​​最新版本​​

然後cd到下載下傳目錄

mkdir mariadb-connector-odbc-3.1.6-ga-debian-x86_64
tar -zxvf mariadb-connector-odbc-3.1.6-ga-debian-x86_64.tar.gz -C mariadb-connector-odbc-3.1.6-ga-debian-x86_64
cd mariadb-connector-odbc-3.1.6-ga-debian-x86_64/lib
sudo cp      

編輯/etc/odbcinst.ini

# Example driver definitions
# Driver from the postgresql-odbc package
# Setup from the unixODBC package

# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[mariadb]
Description = ODBC for mariadb
Driver = /usr/lib/x86_64-linux-gnu/mariadb19/libmaodbc.so
Setup = /usr/lib/x86_64-linux-gnu/mariadb19/libmaodbc.so
FileUsage = 1      

這裡實際上是定義了一個叫做mariadb的driver。

編輯/etc/odbc.ini

[dbexp2]
Description = mariadb
Driver = mariadb
Server = 127.0.0.1
Port = 3306
USER = root
Password = a
CHARSET = UTF8      

測試

isql dbexp2 -v      

大機率會出錯。

[01000][unixODBC][Driver Manager]Can't open lib '/usr/lib/x86_64-linux-gnu/mariadb19/libmaodbc.so' : file not found
[ISQL]ERROR: Could not SQLConnect      

其實是因為libmaodbc.so的依賴不滿足。

看看它的依賴:

ldd /usr/lib/x86_64-linux-gnu/mariadb19/libmaodbc.so      

輸出:

linux-vdso.so.1 (0x00007ffe223e4000)
  libodbcinst.so.2 => /lib/x86_64-linux-gnu/libodbcinst.so.2 (0x00007f78c000a000)
  libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f78bfe87000)
  libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f78bfe82000)
  libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f78bfe61000)
  libssl.so.1.0.0 => not found
  libcrypto.so.1.0.0 => not found
  libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f78bfc9e000)
  libltdl.so.7 => /lib/x86_64-linux-gnu/libltdl.so.7 (0x00007f78bfc93000)
  /lib64/ld-linux-x86-64.so.2 (0x00007f78c04d0000)      

可以看到找不到libssl.so.1.0.0和libcrypto.so.1.0.0。 再檢視依賴

linux-vdso.so.1 (0x00007fff634cb000)
  libodbcinst.so.2 => /lib/x86_64-linux-gnu/libodbcinst.so.2 (0x00007fe427f12000)
  libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe427d8f000)
  libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe427d8a000)
  libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe427d69000)
  libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007fe427b08000)
  libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fe42770b000)
  libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe427548000)
  libltdl.so.7 => /lib/x86_64-linux-gnu/libltdl.so.7 (0x00007fe42753d000)
  /lib64/ld-linux-x86-64.so.2 (0x00007fe4283d9000)      

已經滿足了。

再跑一遍

isql dbexp2 -v      

成功:

searchstar@searchstar-debian10-minimum:~/SetupFiles$ isql dbexp2 -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>       

在C/C++中使用

參考:​先安裝頭檔案

sudo apt install      

之後相關頭檔案就在​

​/usr/include/​

​​下了。編譯的時候不需要用​

​-I​

​選項。

如果還需要mysql的頭檔案

sudo apt install      

之後相關頭檔案就在​

​/usr/include/mysql​

​​下了。編譯的時候需要用​

​-I"/usr/include/mysql"​

​​,或者代碼裡頭檔案前加​

​mysql/​

​​,例如​

​#include <mysql/mysql.h>​

建議使用純odbc,以保證可移植性。

示例:

#include <iostream>
#include <sqlext.h>

using namespace std;

int main() {
    sqlhenv serverhenv;
    sqlhdbc serverhdbc;
    sqlhstmt serverhstmt;
    sqlreturn ret;

    static sqlchar dname[45], dno[10];

    sqllen length;

    //配置設定環境句柄
    ret = sqlallochandle(sql_handle_env,sql_null_handle,&serverhenv);

    //設定環境屬性
    ret = sqlsetenvattr(serverhenv,sql_attr_odbc_version,(void*)sql_ov_odbc3,0);
    if(!sql_succeeded(ret))
    {
        cout<<"allocenvhandle error!"<<endl;
        return 0;
    }

    //配置設定連接配接句柄
    ret = sqlallochandle(sql_handle_dbc,serverhenv,&serverhdbc);
    if(!sql_succeeded(ret))
    {
        cout<<"allocdbchandle error!"<<endl;
        return 0;
    }

    //資料庫連接配接
    ret = sqlconnect(serverhdbc,(sqlchar*)"dbexp2",sql_nts,(sqlchar*)"root",sql_nts,(sqlchar*)"a",sql_nts);//第二個參數是之前配置的資料源,後面是資料庫使用者名和密碼
    if(!sql_succeeded(ret))
    {
        cout<<"sql_connect error!"<<endl;
        return 0;
    }

    //配置設定執行語句句柄
    ret = sqlallochandle(sql_handle_stmt,serverhdbc,&serverhstmt);

    //執行sql語句
    ret=sqlexecdirect(serverhstmt,(sqlchar*)"select dname, dno from company.department;",sql_nts);
    if(ret == sql_success || ret == sql_success_with_info){
        //綁定資料
        sqlbindcol(serverhstmt,1, sql_c_char, (void*)dname,sizeof(dname), &length);
        sqlbindcol(serverhstmt,2, sql_c_char, (void*)dno,sizeof(dno), &length);
        //将光标移動到下行,即獲得下行資料
        cout << "dname\t\tdno\n";
        while(sql_no_data != sqlfetch(serverhstmt))
        {
            cout << dname << "\t\t" << dno << endl;
        }
    }

    //釋放語句句柄
    ret=sqlfreehandle(sql_handle_stmt,serverhstmt);
    if(sql_success!=ret && sql_success_with_info != ret)
        cout<<"free hstmt error!"<<endl;
    //斷開資料庫連接配接
    ret=sqldisconnect(serverhdbc);
    if(sql_success!=ret&&sql_success_with_info!=ret)
        cout<<"disconnected error!"<<endl;
    //釋放連接配接句柄
    ret=sqlfreehandle(sql_handle_dbc,serverhdbc);
    if(sql_success!=ret&&sql_success_with_info!=ret)
        cout<<"free hdbc error!"<<endl;
    //釋放環境句柄句柄
    ret=sqlfreehandle(sql_handle_env,serverhenv);
    if(sql_success!=ret&&sql_success_with_info!=ret)
        cout<<"free henv error!"<<endl;

    cout << "done" << endl;

    return 0;
}      

因為之前資料源中已經定義了使用者名和密碼,是以這裡使用者名和密碼可以省掉,即

ret = sqlconnect(serverhdbc,(sqlchar*)"dbexp2",sql_nts,(sqlchar*)"root",sql_nts,(sqlchar*)"a",sql_nts);//第二個參數是之前配置的資料源,後面是資料庫使用者名和密碼      
ret = SQLConnect(serverhdbc,(SQLCHAR*)"dbexp2",SQL_NTS, NULL, 0, NULL, 0);      
g++ main.cpp -lodbc -o main
./main      
dname   dno
Economy Department    000
Sales Department    001
Human Resource Department   010
Produce Department    011
Research Department   100
done      

繼續閱讀