Linux下ODBC安裝配置

lhrbest發表於2019-05-13


Linux下ODBC安裝配置


ODBC 原理

ODBC Open Database Connect 即開放資料庫互連的簡稱,它是由 Microsoft 公司於 1991 年提出的一個用於訪問資料庫的統一介面標準,是應用程式和資料庫系統之間的中介軟體。它透過使用相應應用平臺上和所需資料庫對應的驅動程式與應用程式的互動來實現對資料庫的操作,避免了在應用程式中直接呼叫與資料庫相關的操作,從而提供了資料庫的獨立性。

ODBC 主要由驅動程式和驅動程式管理器組成。驅動程式是一個用以支援 ODBC 函式呼叫的模組,每個驅動程式對應於相應的資料庫,當應用程式從基於一個資料庫系統移植到另一個時,只需更改應用程式中由 ODBC 管理程式設定的與相應資料庫系統對應的別名即可。驅動程式管理器可連結到所有 ODBC 應用程式中,它負責管理應用程式中 ODBC 函式與 DLL 中函式的繫結。

ODBC 使用層次的方法來管理資料庫,在資料庫通訊結構的每一層,對可能出現依賴資料庫產品自身特性的地方, ODBC 都引入一個公共介面以解決潛在的不一致性,從而很好地解決了基於資料庫系統應用程式的相對獨立性,這也是 ODBC 一經推出就獲得巨大成功的重要原因之一。

從結構上分, ODBC 分為單束式和多束式兩類。

1.  單束式驅動程式
單束式驅動程式介於應用程式和資料庫之間,像中介驅動程式一樣資料提供一個統一的資料訪問方式。當使用者進行資料庫操作時,應用程式傳遞一個 ODBC 函式呼叫給 ODBC 驅動程式管理器,由 ODBC API 判斷該呼叫是由它直接處理並將結果返回還是送交驅動程式執行並將結果返回。由上可見,單束式驅動程式本身是一個資料庫引擎,由它直接可完成對資料庫的操作,儘管該資料庫可能位於網路的任何地方。

2.  多束式驅動程式
多束式驅動程式負責在資料庫引擎和客戶應用程式之間傳送命令和資料,它本身並不執行資料處理操作而用於遠端操作的網路通訊協議的一個介面。前端應用程式提出對資料庫處理的請求,該請求轉給 ODBC 驅動程式管理器,驅動程式管理器依據請求的情況,就地完成或傳給多束驅動程式,多束式驅動程式將請求翻譯為特定廠家的資料庫通訊介面(如 Oracle SQLNet )所能理解的形式並交於介面去處理,介面把請求經網路傳送給伺服器上的資料引擎,伺服器處理完後把結果發回給資料庫通訊介面,資料庫介面將結果傳給多束式 ODBC 驅動程式,再由驅動程式將結果傳給應用程式。

很多程式設計師已經體會到了在 Windows 平臺下的 ODBC 的益處,而在 Linux/Unix 下進行資料庫程式設計的時候卻不得不根據不同的資料庫來選擇特有的 API 進行程式設計,一旦資料庫發生了改變,所有與這些 API 相關的程式都必須進行修改。其實在 Linux/Unix 下現在也有了自己的 ODBC ,可以使我們的資料庫程式設計就像在 Windows 平臺下一樣簡單。

下面我們開始介紹 Linux/Unix 下的 ODBC

 


Linux/Unix ODBC 的安裝

方法一:
先下載最新的 unixODBC 原始碼包( )放到 /usr/local 下,然後執行下述命令:

tar zxvf unixODBC-2.2.1.tar.gz

cd unixODBC-2.2.1

./configure --prefix=/usr/local/unixODBC-2.2.1 --includedir=/usr/include  --libdir=/usr/lib -bindir=/usr/bin --sysconfdir=/etc

make &&  make install

安裝成功後, unixODBC 所需的標頭檔案都被安裝到了 /usr/inlucde 下,編譯好的庫檔案安裝到了 /usr/lib 下,與 unixODBC 相關的可執行檔案安裝到了 /usr/bin 下,配置檔案放到了 /etc 下。

方法二:
下載 rpm 包進行安裝,我們這裡以 Red Hat 7.3 為例:
unixODBC-2.2.0-5 RPM for i386 (安裝包及原始碼包)

unixODBC-devel-2.2.0-5 RPM for i386
ftp://speakeasy.rpmfind.net/linux/redhat/7.3/en/os/i386/RedHat/RPMS/unixODBC-devel-2.2.0-5.i386.rpm
直接將 unixODBC-2.2.0-5.i386.rpm unixODBC-devel-2.2.0-5.i386.rpm 裝入系統就可以了,命令如下:

rpm -ivh unixODBC-2.2.0-5.i386.rpm

rpm -ivh unixODBC-devel-2.2.0-5.i386.rpm

安裝好以後,所需的各個部分與上面所列的位置相同。

 



Linux/Unix ODBC 的配置

執行 ODBCConfig 程式(在 /usr/bin 下),如下圖:

圖一: ODBCConfig 主視窗

 

Windows 下的 ODBC 設定視窗是不是很像?我想大家都能看懂吧。

第一步:安裝資料庫的 ODBC 驅動程式
Drivers 這一欄中用來設定資料庫的驅動程式,點選 Add 按鈕,會出現下圖:

圖二: ODBCConfig Driver Properties 視窗

 

Name 一欄填入資料庫驅動的名稱, Description 是資料庫驅動的描述, Driver 是用來選擇資料庫驅動程式的, Setup 是用來選擇資料庫驅動安裝程式的,如果你是按照上述安裝方法安裝的,這些程式都放在 /usr/lib 下,下面是資料庫驅動程式的列表:

資料庫

資料庫驅動程式

資料庫驅動安裝程式

TXT

libodbctxt.so

libodbctxtS.so

NNTP

libnn.so

libodbcnnS.so

MiniSQL

libodbcmini.so

libodbcminiS.so

PostgreSQL

libodbcpsql.so

libodbcpsqlS.so

MySQL

(註釋)

libodbcmyS.so

Sybase/MS SQL

(註釋)

libtdsS.so

Oracle

(註釋)

liboraodbcS.so

註釋:
MySQL Sybase/MS SQL Oracle 的資料庫驅動可以在下列網址找到:
MySQL          
Sybase/MS SQL      
Oracle          

MySQL 的驅動程式 MyODBC-2.50.39-4 RPM for i386 以及原始碼包:

選擇好驅動程式之後,點選 "√" 儲存退出。

第二步:設定 DSN
DSN 分為 User DSN System DSN File DSN 三種,我們以 System DSN 為例。選中 System DSN 一欄以後,點選 Add… 按鈕就會見到下圖:

圖三:建立 DSN 選擇資料庫驅動

 

列表中會列出你已經安裝好的資料庫驅動程式,我這裡只裝了 MySQL PostgreSQL ,然後選擇你所要使用的驅動程式,然後點選 OK 就會出現下圖:

圖四: DSN 的設定

 

我這裡使用的是 MySQL 的資料庫驅動,不同的資料庫,這個視窗的內容會有所不同。 Name 是資料來源的名稱, Description 是描述, Server 可以選擇伺服器,如果本機啟動了 MySQL 就可以選擇 localhost ,如果 Port Socket 有特殊要求,再根據實際情況進行修改, Database 是用來選擇資料庫的,下拉選單不一定包含所有的資料庫,你可以把自己已經建立好的資料庫名稱填寫在這裡。都配置好之後,點選 "√" 儲存退出。

這樣 Linux/Unix 下的 ODBC 資料來源就已經設定好了,大家還可以在 ODBCConfig 程式的 Status 欄中檢視 ODBC 的使用情況,在 Advanced 欄中設定是否做日誌或者啟動連線池,在 About 欄中,有一個 Linux/Unix ODBC 的示意圖,在 Credits 按鈕中可以看到所有開發者的名字的列表。 ODBCConfig 程式中所有有關資料庫驅動程式的資訊被放在 odbcinst.ini (在 /etc 下)檔案中,有關 DSN 的資訊被放在 odbc.ini (在 /etc 下)檔案中,大家有興趣的話,可以自己去觀察一下。

第三步:使用 DataManager 程式瀏覽資料庫
執行 DataManager 程式之後就可以檢視 Drivers System DSN User DSN 這幾項內容,,在瀏覽資料庫的時候,可以在右面的 SQL 欄中輸入 SQL 語句,然後點選人形按鈕就可以執行 SQL 語句,執行結果會在 Results 一欄中顯示出來,具體情況可以見下圖:

圖五:使用 DataManager 瀏覽資料庫

 

第四步:使用 isql 程式檢視資料庫
unixODBC 還提供了命令臺下檢視資料庫的程式,這就是 isql ,用法如下:

isql DSN [UID [PWD]] [options]

DSN   資料來源名稱

UID   使用者 ID

PWD   使用者密碼

Options

-b   批處理,沒有提示符的模式

-dx   設定列之間的分隔符為 x

-w   將查詢結果輸出為 HTML 格式

-c   第一行輸出列名

--version             輸出 isql 的版本號

 



Linux/Unix ODBC 的程式設計

1 、使用 unixODBC 提供的 ODBC API 進行程式設計:
在進行程式設計之前,我們來看一下 ODBC API 中的常用資料型別與我們在 C 語言中使用的資料型別的對應關係:

型別識別符號

ODBC資料型別

C資料型別

SQL_C_CHAR

SQLCHAR *

unsigned char *

SQL_C_SSHORT

SQLSMALLINT

short int

SQL_C_USHORT

SQLUSMALLINT

unsigned short int

SQL_C_SLONG

SQLINTEGER

long int

SQL_C_FLOAT

SQLREAL

float

SQL_C_DOUBLE

SQLDOUBLE, SQLFLOAT

double

SQL_C_BINARY

SQLCHAR *

unsigned char *

SQL_C_TYPE_DATE

SQL_DATE_STRUCT

struct tagDATE_STRUCT {SQLSMALLINT year; SQLUSMALLINT month; SQLUSMALLINT day; } DATE_STRUCT;

SQL_C_TYPE_TIME

SQL_TIME_STRUCT

struct tagTIME_STRUCT {SQLUSMALLINT hour; SQLUSMALLINT minute; SQLUSMALLINT second; } TIME_STRUCT;

我們這裡使用的資料庫名稱為 test DSN ),這個 DSN 使用的使用者名稱是 root ,密碼為空,表的名稱是 web ,欄位情況如下:

欄位名

資料型別

id

integer

name

char(40)

size

integer

第一:設定 ODBC 環境控制程式碼並設定引數
首先我們需要宣告一個 ODBC 環境控制程式碼( SQLHENV ),它可以用來獲得有關的 ODBC 環境資訊,我們需要呼叫 SQLAllocHandle ( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &V_OD_Env ) 來獲得這個控制程式碼, V_OD_Env 就是要分配的 SQLHENV 型別的環境控制程式碼。分配好控制程式碼之後,你給它需要設定所使用的 ODBC 版本,你可以呼叫 SQLSetEnvAttr ( V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0 ) SQL_ATTR_ODBC_VERSION 是存放你定義的 ODBC 版本號的變數, SQL_OV_ODBC3 則說明你的程式使用的是 ODBC 3.0

第二:設定連線控制程式碼並設定超時引數
我們需要宣告一個連線控制程式碼( SQLHDBC ),用來存放資料庫連線資訊的,呼叫 SQLAllocHandle ( SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc ) 獲得連線控制程式碼, V_OD_hdbc 就是要分配的 SQLHDBC 型別的連線控制程式碼。分配好之後,我們可以呼叫 SQLSetConnectAttr ( V_OD_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0 ) 來設定連線超時引數。

第三:連線資料庫
呼叫 SQLConnect ( V_OD_hdbc, (SQLCHAR*) "Test", SQL_NTS, (SQLCHAR*) "root", SQL_NTS, (SQLCHAR*) "", SQL_NTS ) 連線我前面提到的資料庫,需要設定三個引數,就是資料庫名稱、使用者名稱和密碼(因為我的資料庫密碼為空,所以這裡的密碼也為空),後面的 SQL_NTS 的位置應該寫入這些引數的長度,如果寫的是 SQL_NTS 就是讓 SQLConnect 來決定引數的長度。

第四:分配 SQL 語句的控制程式碼並進行查詢:
需要宣告一個 SQL 語句的控制程式碼( SQLHSTMT ),用來存放 SQL 語句資訊的,呼叫 SQLAllocHandle ( SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt ) 來獲得這個控制程式碼, V_OD_hstmt 就是我們要分配的 SQLHSTMT 型別的 SQL 語句控制程式碼。

我們的查詢語句是:

SELECT name, id FROM web ORDER BY id

執行這條查詢語句之後,查詢結果可能有很多行,但每行只有兩列,分別對應 name id ,它們的資料型別為 integer char* ,在 ODBC 中的資料型別識別符號為 SQL_C_ULONG SQL_C_CHAR 。我們需要先宣告這樣的兩個變數來存貯查詢結果:

SQLINTEGER   V_OD_id;

char   V_OD_buffer[200];

然後我們需要使用 SQLBindCol 函式把查詢結果和我們定義的變數進行繫結:

SQLBindCol(V_OD_hstmt,1,SQL_C_CHAR, &V_OD_buffer,150,&V_OD_err);

SQLBindCol(V_OD_hstmt,2,SQL_C_ULONG,&V_OD_id,150,&V_OD_err);

這裡的 V_OD_err 是用來存放錯誤資訊編號的變數,型別也是 SQLINTEGER
接下來,我們呼叫 SQLExecDirect 來進行查詢:

SQLExecDirect ( V_OD_hstmt, "SELECT dtname,iduser FROM web order by iduser", SQL_NTS );

我們可以用 SQLNumResultCols ( V_OD_hstmt, &V_OD_colanz ) 來獲得結果的列數,也可以用 SQLRowCount( V_OD_hstmt, &V_OD_rowanz ) 來獲得結果的條數, V_OD_colanz V_OD_rowanz 分別儲存相應的結果,型別分別為 SQLSMALLINT SQLINTEGER
在讀取結果之前,我們需要呼叫 SQLFetch ( V_OD_hstmt ) 語句,這個語句可以用來獲得第一條結果也可以用來都下一條,有點像 next 的感覺。然後我們就可以在 V_OD_id V_OD_buffer 裡面獲得每條記錄的結果了。

第五:關於關閉連線和釋放控制程式碼
關閉資料庫的連線,呼叫 SQLDisconnect ( V_OD_hdbc ) 就可以了,但在關閉資料庫之前需要先釋放 SQL 語句的控制程式碼,而且在關閉資料庫之後應該釋放連線控制程式碼和 ODBC 環境控制程式碼,語句如下(按正常的順序):

SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);

SQLDisconnect(V_OD_hdbc);

SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);

第六:關於上述情況中的錯誤資訊處理
我們需要定義兩個變數:

long V_OD_erg;

SQLINTEGER V_OD_err;

SQLAllocHandle SQLSetEnvAttr SQLSetConnectAttr SQLConnect SQLExecDirect SQLNumResultCols SQLRowCount 的呼叫結果都可以用 V_OD_erg 來儲存, V_OD_err 可以獲得 SQLBindCol 中的錯誤資訊。

第七:獲得本機的 DSN 資訊
我們可以在宣告 SQLHENV 控制程式碼之後,使用 SQLDataSources 函式來獲得本機的 DSN 資訊。程式如下:

void OD_ListDSN(void)

{

char       l_dsn[100],l_desc[100];

short int  l_len1,l_len2,l_next;

l_next=SQL_FETCH_FIRST;

while( SQLDataSources(V_OD_Env,l_next,l_dsn, sizeof(l_dsn),

&l_len1, l_desc, sizeof(l_desc), &l_len2) == SQL_SUCCESS)

{

printf("Server=(%s) Beschreibung=(%s)\n",l_dsn,l_desc);

l_next=SQL_FETCH_NEXT;

}

}

l_next 變數是用來指定我們所要獲得的 DSN 的類別:

SQL_FETCH_FIRST

設定SQLDataSources()函式找到第一個可用的資料來源(可以是User DSN,也可以是Systerm DSN)

SQL_FETCH_FIRST_USER

設定SQLDataSources()函式找到第一個User DSN

SQL_FETCH_FIRST_SYSTEM

設定SQLDataSources()函式找到第一個System DSN

SQL_FETCH_NEXT

找到下一個資料來源,至於資料來源型別則要根據前面的定義

到這裡,我們在 Unix C 語言下面進行 ODBC 程式設計已經講完,上述 ODBC API 需要引用以下幾個標頭檔案(這些檔案已經安裝到 /usr/include 下了):

#include <sql.h>

#include <sqlext.h>

#include <sqltypes.h>

另外如果大家使用 GTK 進行程式設計,由於到目前為止 GTK 還沒有加入專門處理資料庫的部件,所以大家可以在 GTK 中呼叫上述的 ODBC API 即可。

這裡附上例程供大家參考學習:

/* odbc.c

    testing unixODBC

*/

#include <stdlib.h>

#include <stdio.h>

#include <odbc/sql.h>

#include <odbc/sqlext.h>

#include <odbc/sqltypes.h>

SQLHENV       V_OD_Env;    // Handle ODBC environment

long       V_OD_erg;    // result of functions

SQLHDBC       V_OD_hdbc;                      // Handle connection

char       V_OD_stat[10];    // Status SQL

SQLINTEGER     V_OD_err,V_OD_rowanz,V_OD_id;

SQLSMALLINT     V_OD_mlen,V_OD_colanz;

char             V_OD_msg[200],V_OD_buffer[200];

int main(int argc,char *argv[])

{

  // 1. allocate Environment handle and register version

  V_OD_erg=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);

  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))

  {

    printf("Error AllocHandle\n");

    exit(0);

  }

  V_OD_erg=SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))

  {

    printf("Error SetEnv\n");

    SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);

    exit(0);

  }

  // 2. allocate connection handle, set timeout

  V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);

  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))

  {

    printf("Error AllocHDB %d\n",V_OD_erg);

    SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);

    exit(0);

  }

  SQLSetConnectAttr(V_OD_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);

  // 3. Connect to the datasource "web"

  V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "Test", SQL_NTS,

                                     (SQLCHAR*) "root", SQL_NTS,

                                     (SQLCHAR*) "", SQL_NTS);

  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))

  {

    printf("Error SQLConnect %d\n",V_OD_erg);

    SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1,

                  V_OD_stat, &V_OD_err,V_OD_msg,100,&V_OD_mlen);

    printf("%s (%d)\n",V_OD_msg,V_OD_err);

    SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);

    exit(0);

  }

  printf("Connected !\n");

  V_OD_erg=SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);

  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))

  {

    printf("Fehler im AllocStatement %d\n",V_OD_erg);

    SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);

    printf("%s (%d)\n",V_OD_msg,V_OD_err);

    SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);

    exit(0);

  }

    SQLBindCol(V_OD_hstmt,1,SQL_C_CHAR, &V_OD_buffer,150,&V_OD_err);

    SQLBindCol(V_OD_hstmt,2,SQL_C_ULONG,&V_OD_id,150,&V_OD_err);

  

    V_OD_erg=SQLExecDirect(V_OD_hstmt,"SELECT dtname,iduser FROM web order by iduser",SQL_NTS);   

    if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))

    {

       printf("Error in Select %d\n",V_OD_erg);

       SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);

       printf("%s (%d)\n",V_OD_msg,V_OD_err);

       SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);

       SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);

       SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);

       exit(0);

    }

    V_OD_erg=SQLNumResultCols(V_OD_hstmt,&V_OD_colanz);

    if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))

    {

        SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);

        SQLDisconnect(V_OD_hdbc);

        SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);

        SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);

        exit(0);

    }

    printf("Number of Columns %d\n",V_OD_colanz);

    V_OD_erg=SQLRowCount(V_OD_hstmt,&V_OD_rowanz);

    if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))

    {

      printf("Number of RowCount %d\n",V_OD_erg);

      SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);

      SQLDisconnect(V_OD_hdbc);

      SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);

      SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);

      exit(0);

    }

    printf("Number of Rows %d\n",V_OD_rowanz);

    V_OD_erg=SQLFetch(V_OD_hstmt);  

    while(V_OD_erg != SQL_NO_DATA)

    {

     printf("Result: %d %s\n",V_OD_id,V_OD_buffer);

     V_OD_erg=SQLFetch(V_OD_hstmt);  

    }  ;

    SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);

    SQLDisconnect(V_OD_hdbc);

    SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);

    SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);

    return(0);

}

2 QT 下進行 ODBC 程式設計
QT 3.0 提供了 Data Table Data Browser Data View 三個與資料庫相關的控制元件。你可以在 QT Project 設定你要連線的資料庫, Driver 一欄中選擇 QODBC3 即可,其它選項你一看就明白了。上述的三個資料庫控制元件的使用方法可以參見 QT 中相應文件,也很好使用的。

 




About Me

........................................................................................................................

● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

● 本文在itpub( http://blog.itpub.net/26736162 )、部落格園( http://www.cnblogs.com/lhrbest )和個人weixin公眾號( xiaomaimiaolhr )上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文部落格園地址: http://www.cnblogs.com/lhrbest

● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:

........................................................................................................................

● QQ群號: 230161599 (滿) 、618766405

● weixin群:可加我weixin,我拉大家進群,非誠勿擾

● 聯絡我請加QQ好友 646634621 ,註明新增緣由

● 於 2019-05-01 06:00 ~ 2019-05-30 24:00 在魔都完成

● 最新修改時間:2019-05-01 06:00 ~ 2019-05-30 24:00

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

........................................................................................................................

小麥苗的微店

小麥苗出版的資料庫類叢書 http://blog.itpub.net/26736162/viewspace-2142121/

小麥苗OCP、OCM、高可用網路班 http://blog.itpub.net/26736162/viewspace-2148098/

小麥苗騰訊課堂主頁 https://lhr.ke.qq.com/

........................................................................................................................

使用 weixin客戶端 掃描下面的二維碼來關注小麥苗的weixin公眾號( xiaomaimiaolhr )及QQ群(DBA寶典)、新增小麥苗weixin, 學習最實用的資料庫技術。

........................................................................................................................

歡迎與我聯絡

 

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2644122/,如需轉載,請註明出處,否則將追究法律責任。

相關文章