深爱那片海 发表于 2015-1-16 22:50:57

MYSQL网页设计Linux/Unix下ODBC的安装、设置与编程

使用DBaaS能让收入损失从其他业务上得到弥补,如软件更新和硬件管理。也许决定走DBaaS之路的客户可能会跳过解决方案提供商,尽管这个决策看起来有点短视。odbc|unix|编程
Linux/Unix下ODBC的安装、设置与编程

齐亮(cavendish@eyou.com)
2002年7月


本文次要内容是先容ODBC的复杂道理,和怎样在Linux/Unix下举行ODBC的安装、设置与编程。

1、ODBC道理

ODBC是OpenDatabaseConnect即开放数据库互连的简称,它是由Microsoft公司于1991年提出的一个用于会见数据库的一致界面尺度,是使用程序和数据库体系之间的两头件。它经由过程利用响应使用平台上和所需数据库对应的驱动程序与使用程序的交互来完成对数据库的操纵,制止了在使用程序中间接挪用与数据库相干的操纵,从而供应了数据库的自力性。

ODBC次要由驱动程序和驱动程序办理器构成。驱动程序是一个用以撑持ODBC函数挪用的模块,每一个驱动程序对应于响应的数据库,当使用程序从基于一个数据库体系移植到另外一个时,只需变动使用程序中由ODBC办理程序设定的与响应数据库体系对应的别号便可。驱动程序办理器可链接到一切ODBC使用程序中,它卖力办理使用程序中ODBC函数与DLL中函数的绑定。

ODBC利用条理的办法来办理数据库,在数据库通讯布局的每层,对大概呈现依附数据库产物本身特征的中央,ODBC都引进一个大众接口以办理潜伏的纷歧致性,从而很好地办理了基于数据库体系使用程序的绝对自力性,这也是ODBC一经推出就取得伟大乐成的主要缘故原由之一。

从布局上分,ODBC分为单束式和多束式两类。
单束式驱动程序
单束式驱动程序介于使用程序和数据库之间,像中介驱动程序一样数据供应一个一致的数据会见体例。
当用户举行数据库操纵时,使用程序传送一个ODBC函数挪用给ODBC驱动程序办理器,由ODBCAPI判别该挪用是由它间接处置并将了局前往仍是送交驱动程序实行并将了局前往。
由上可见,单束式驱动程序自己是一个数据库引擎,由它间接可完成对数据库的操纵,只管该数据库大概位于收集的任何中央。多束式驱动程序
多束式驱动程序卖力在数据库引擎和客户使用程序之间传送死令和数据,它自己其实不实行数据处置操纵而用于远程操纵的收集通讯协定的一个界面。
前端使用程序提出对数据库处置的哀求,该哀求转给ODBC驱动程序办理器,驱动程序办理器根据哀求的情形,当场完成或传给多束驱动程序,多束式驱动程序将哀求翻译为特定厂家的数据库通讯接口(如Oracle的SQLNet)所能了解的情势并交于接口去向理,接口把哀求经收集传送给服务器上的数据引擎,服务器处置完后把了局发还给数据库通讯接口,数据库接口将了局传给多束式ODBC驱动程序,再由驱动程序将了局传给使用程序。
良多程序员已体味到了在Windows平台下的ODBC的好处,而在Linux/Unix下举行数据库编程的时分却不能不依据分歧的数据库来选择独有的API举行编程,一旦数据库产生了改动,一切与这些API相干的程序都必需举行修正。实在在Linux/Unix下如今也有了本人的ODBC,可使我们的数据库编程就像在Windows平台下一样复杂。

上面我们入手下手先容Linux/Unix下的ODBC:

2、Linux/Unix下ODBC的安装:

办法一:
先下载最新的unixODBC源码包(http://www.unixodbc.org/unixODBC-2.2.1.tar.gz)放到/usr/local下,然后运转下述命令:


tarzxvfunixODBC-2.2.1.tar.gzcdunixODBC-2.2.1./configure--prefix=/usr/local/unixODBC-2.2.1--includedir=/usr/include--libdir=/usr/
lib-bindir=/usr/bin--sysconfdir=/etcmakemakeinstall

安装乐成后,unixODBC所需的头文件都被安装到了/usr/inlucde下,编译好的库文件安装到了/usr/lib下,与unixODBC相干的可实行文件安装到了/usr/bin下,设置文件放到了/etc下。



办法二:
下载rpm包举行安装,我们这里以RedHat7.3为例:
unixODBC-2.2.0-5RPMfori386(安装包及源码包)
(ftp://speakeasy.rpmfind.net/linux/redhat/7.3/en/os/i386/RedHat/RPMS/unixODBC-2.2.0-5.i386.rpm、ftp://ftp.rpmfind.net/linux/redhat/7.3/en/os/i386/SRPMS/unixODBC-2.2.0-5.src.rpm)
unixODBC-devel-2.2.0-5RPMfori386
(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-ivhunixODBC-2.2.0-5.i386.rpmrpm-ivhunixODBC-devel-2.2.0-5.i386.rpm

安装好今后,所需的各个部分与下面所列的地位不异。



3、Linux/Unix下ODBC的设置:

运转ODBCConfig程序(在/usr/bin下),以下图:


图一:ODBCConfig主窗口


和Windows下的ODBC设置窗口是否是很像?我想人人都能看懂吧。

第一步:安装数据库的ODBC驱动程序
Drivers这一栏顶用来设置数据库的驱动程序,点击Add按钮,会呈现下图:


图二:ODBCConfigDriverProperties窗口


Name一栏填进数据库驱动的称号,Description是数据库驱动的形貌,Driver是用来选择数据库驱动程序的,Setup是用来选择数据库驱动安装程序的,假如你是依照上述安装办法安装的,这些程序都放在/usr/lib下,上面是数据库驱动程序的列表:


数据库数据库驱动程序数据库驱动安装程序TXTlibodbctxt.solibodbctxtS.soNNTPlibnn.solibodbcnnS.soMiniSQLlibodbcmini.solibodbcminiS.soPostgreSQLlibodbcpsql.solibodbcpsqlS.soMySQL(正文)libodbcmyS.soSybase/MSSQL(正文)libtdsS.soOracle(正文)liboraodbcS.so
正文:
MySQL、Sybase/MSSQL和Oracle的数据库驱动能够鄙人列网址找到:
MySQL          http://www.unixodbc.org/myodbc.html
Sybase/MSSQL      http://www.freetds.org
Oracle          http://www.easysoft.org

MySQL的驱动程序MyODBC-2.50.39-4RPMfori386和源码包:
ftp://speakeasy.rpmfind.net/linux/redhat/7.3/en/os/i386/RedHat/RPMS/MyODBC-2.50.39-4.i386.rpm
ftp://ftp.redhat.com/pub/redhat/linux/7.3/en/os/i386/SRPMS/MyODBC-2.50.39-4.src.rpm

选择好驱动程序以后,点击"√"保留加入。

第二步:设置DSN
DSN分为UserDSN、SystemDSN和FileDSN三种,我们以SystemDSN为例。选中SystemDSN一栏今后,点击Add…按钮就会晤到下图:


图三:创立DSN选择数据库驱动


列表中会列出你已安装好的数据库驱动程序,我这里只装了MySQL和PostgreSQL,然后选择你所要利用的驱动程序,然后点击OK就会呈现下图:


图四:DSN的设置


我这里利用的是MySQL的数据库驱动,分歧的数据库,这个窗口的内容会有所分歧。Name是数据源的称号,Description是形貌,Server能够选择服务器,假如本机启动了MySQL就能够选择localhost,假如Port和Socket有特别请求,再依据实践情形举行修正,Database是用来选择数据库的,下拉菜单纷歧定包括一切的数据库,你能够把本人已创立好的数据库称号填写在这里。都设置好以后,点击"√"保留加入。

如许Linux/Unix下的ODBC数据源就已设置好了,人人还能够在ODBCConfig程序的Status栏中检察ODBC的利用情形,在Advanced栏中设置是不是做日记大概启动毗连池,在About栏中,有一个Linux/UnixODBC的表示图,在Credits按钮中能够看到一切开辟者的名字的列表。ODBCConfig程序中一切有关数据库驱动程序的信息被放在odbcinst.ini(在/etc下)文件中,有关DSN的信息被放在odbc.ini(在/etc下)文件中,人人有乐趣的话,能够本人往察看一下。

第三步:利用DataManager程序扫瞄数据库
运转DataManager程序以后就能够检察Drivers、SystemDSN和UserDSN这几项内容,,在扫瞄数据库的时分,能够在左面的SQL栏中输出SQL语句,然后点击人形按钮就能够运转SQL语句,运转了局会在Results一栏中显现出来,详细情形能够见下图:


图五:利用DataManager扫瞄数据库


第四步:利用isql程序检察数据库
unixODBC还供应了命令台下检察数据库的程序,这就是isql,用法以下:

isqlDSN]DSN数据源称号UID用户IDPWD用户暗码Options:-b批处置,没有提醒符的形式-dx设置列之间的分开符为x-w将查询了局输入为HTML格局-c第一行输入列名--version输入isql的版本号

4、Linux/Unix下ODBC的编程:

1、利用unixODBC供应的ODBCAPI举行编程:
在举行编程之前,我们来看一下ODBCAPI中的经常使用数据范例与我们在C言语中利用的数据范例的对应干系:
范例标识符ODBC数据范例C数据范例SQL_C_CHARSQLCHAR*unsignedchar*SQL_C_SSHORTSQLSMALLINTshortintSQL_C_USHORTSQLUSMALLINTunsignedshortintSQL_C_SLONGSQLINTEGERlongintSQL_C_FLOATSQLREALfloatSQL_C_DOUBLESQLDOUBLE,SQLFLOATdoubleSQL_C_BINARYSQLCHAR*unsignedchar*SQL_C_TYPE_DATESQL_DATE_STRUCTstructtagDATE_STRUCT{SQLSMALLINTyear;SQLUSMALLINTmonth;SQLUSMALLINTday;}DATE_STRUCT;SQL_C_TYPE_TIMESQL_TIME_STRUCTstructtagTIME_STRUCT{SQLUSMALLINThour;SQLUSMALLINTminute;SQLUSMALLINTsecond;}TIME_STRUCT;
我们这里利用的数据库称号为test(DSN),这个DSN利用的用户名是root,暗码为空,表的称号是web,字段情形以下:
>字段名数据范例idintegernamechar(40)sizeinteger
第一:设定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则申明你的程序利用的是ODBC3.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语句句柄。

我们的查询语句是:


SELECTname,idFROMwebORDERBYid

实行这条查询语句以后,查询了局大概有良多行,但每行只要两列,分离对应name和id,它们的数据范例为integer和char*,在ODBC中的数据范例标识符为SQL_C_ULONG和SQL_C_CHAR。我们必要先声明如许的两个变量来存贮查询了局:


SQLINTEGERV_OD_id;charV_OD_buffer;

然后我们必要利用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,"SELECTdtname,iduserFROMweborderbyiduser",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);



第六:关于上述情形中的毛病信息处置
我们必要界说两个变量:


longV_OD_erg;SQLINTEGERV_OD_err;

SQLAllocHandle、SQLSetEnvAttr、SQLSetConnectAttr、SQLConnect、SQLExecDirect、SQLNumResultCols和SQLRowCount的挪用了局都能够用V_OD_erg来存储,V_OD_err能够取得SQLBindCol中的毛病信息。



第七:取得本机的DSN信息
我们能够在声明SQLHENV句柄以后,利用SQLDataSources函数来取得本机的DSN信息。程序以下:

voidOD_ListDSN(void){charl_dsn,l_desc;shortintl_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)
",l_dsn,l_desc);l_next=SQL_FETCH_NEXT;}}

l_next变量是用来指定我们所要取得的DSN的种别:
SQL_FETCH_FIRST设定SQLDataSources()函数找到第一个可用的数据源(能够是UserDSN,也能够是SystermDSN)SQL_FETCH_FIRST_USER设定SQLDataSources()函数找到第一个UserDSNSQL_FETCH_FIRST_SYSTEM设定SQLDataSources()函数找到第一个SystemDSNSQL_FETCH_NEXT找到下一个数据源,至于数据源范例则要依据后面的界说
到这里,我们在Unix的C言语上面举行ODBC编程已讲完,上述ODBCAPI必要援用以下几个头文件(这些文件已安装到/usr/include下了):


#include#include#include



别的假如人人利用GTK举行编程,因为到今朝为止GTK还没有到场专门处置数据库的部件,以是人人能够在GTK中挪用上述的ODBCAPI便可。

这里附上例程供人人参考进修:

/*odbc.ctestingunixODBC*/#include#include#include#include#includeSQLHENVV_OD_Env;//HandleODBCenvironmentlongV_OD_erg;//resultoffunctionsSQLHDBCV_OD_hdbc;//HandleconnectioncharV_OD_stat;//StatusSQLSQLINTEGERV_OD_err,V_OD_rowanz,V_OD_id;SQLSMALLINTV_OD_mlen,V_OD_colanz;charV_OD_msg,V_OD_buffer;intmain(intargc,char*argv[]){//1.allocateEnvironmenthandleandregisterversionV_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("ErrorAllocHandle
");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("ErrorSetEnv
");SQLFreeHandle(SQL_HANDLE_ENV,V_OD_Env);exit(0);}//2.allocateconnectionhandle,settimeoutV_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("ErrorAllocHDB%d
",V_OD_erg);SQLFreeHandle(SQL_HANDLE_ENV,V_OD_Env);exit(0);}SQLSetConnectAttr(V_OD_hdbc,SQL_LOGIN_TIMEOUT,(SQLPOINTER*)5,0);//3.Connecttothedatasource"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("ErrorSQLConnect%d
",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)
",V_OD_msg,V_OD_err);SQLFreeHandle(SQL_HANDLE_ENV,V_OD_Env);exit(0);}printf("Connected!
");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("FehlerimAllocStatement%d
",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)
",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,"SELECTdtname,iduserFROMweborderbyiduser",SQL_NTS);if((V_OD_erg!=SQL_SUCCESS)&&(V_OD_erg!=SQL_SUCCESS_WITH_INFO)){printf("ErrorinSelect%d
",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)
",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("NumberofColumns%d
",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("NumberofRowCount%d
",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("NumberofRows%d
",V_OD_rowanz);V_OD_erg=SQLFetch(V_OD_hstmt);while(V_OD_erg!=SQL_NO_DATA){printf("Result:%d%s
",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编程
QT3.0供应了DataTable、DataBrowser和DataView三个与数据库相干的控件。你能够在QT的Project设置你要毗连的数据库,Driver一栏当选择QODBC3便可,别的选项你一看就分明了。上述的三个数据库控件的利用办法能够拜见QT中响应文档,也很好利用的。
采用DBaaS解决方案,他们也可以使用同大企业一样的技术。在大型组织中,DBaaS可以提供部门级解决MySQL学习教程,而无需IT部门和采购部门的介入,提供更快和更容易的方法来实现小型解决方案。

精灵巫婆 发表于 2015-1-20 05:40:15

大侠们有推荐的书籍和学习方法写下吧。

冷月葬花魂 发表于 2015-1-28 19:13:37

理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识

小魔女 发表于 2015-2-5 22:35:55

不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关

若天明 发表于 2015-2-13 23:58:38

比如日志传送、比如集群。。。

飘灵儿 发表于 2015-3-4 03:17:01

不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关

不帅 发表于 2015-3-11 15:47:05

你可以简单地认为适合的就是好,不适合就是不好。

小妖女 发表于 2015-3-19 01:33:09

从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。

老尸 发表于 2015-3-27 02:08:08

如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
页: [1]
查看完整版本: MYSQL网页设计Linux/Unix下ODBC的安装、设置与编程