關(guān)于ODBC數(shù)據(jù)源連接文本
2024-07-21 02:05:49
供稿:網(wǎng)友
關(guān)于odbc數(shù)據(jù)源連接文本
在《外部數(shù)據(jù)庫(kù)的連接原理》一講中我們說(shuō)過(guò),odbc提供對(duì)多種數(shù)據(jù)庫(kù)的支持,如dbase、access、ms sql server及oracle,也就是說(shuō)運(yùn)用odbc數(shù)據(jù)源中所提供的連接代碼,我們可以實(shí)現(xiàn)對(duì)多種數(shù)據(jù)庫(kù)的連接。以連接access數(shù)據(jù)庫(kù)為例,odbc數(shù)據(jù)源連接文本的格式是:
“driver={數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序};dbq=數(shù)據(jù)庫(kù)文件;”
在以上連接文本中,如果數(shù)據(jù)庫(kù)跟程序在同一目錄下,或者用變量defaultdir指定了數(shù)據(jù)庫(kù)所在目錄,則數(shù)據(jù)庫(kù)文件可以不用全路徑名,如下即可:
“odbc;dbq=msaccess.mdb;driver={microsoft access driver (*.mdb)};”
如下也可:
“odbc;dbq=msaccess.mdb;defaultdir=d:/downloads/e21;driver={microsoft access driver (*.mdb)};”
如果數(shù)據(jù)庫(kù)跟程序不在同一目錄下,或者沒(méi)有用變量defaultdir指定數(shù)據(jù)庫(kù)所在目錄,則數(shù)據(jù)庫(kù)文件需要用全路徑名,如下:
“odbc;dbq=e:/quake iii arena/msaccess.mdb;driver={microsoft access driver (*.mdb)};”
以上所說(shuō)的是連接access數(shù)據(jù)庫(kù)的格式,那么連接其他數(shù)據(jù)庫(kù)的odbc數(shù)據(jù)源連接文本又是怎樣的?連接不同類(lèi)型的數(shù)據(jù)庫(kù)要使用不同的對(duì)應(yīng)驅(qū)動(dòng)程序,沒(méi)忘記吧!不同的驅(qū)動(dòng)程序當(dāng)然它們的參數(shù)組合也就不同了,每一種不同驅(qū)動(dòng)程序都有其特定的的參數(shù)形式:
⑴、ms access odbc dsnless 連接:
☆、參數(shù):driver 設(shè)置值:{microsoft access driver (*.mdb)}
☆、參數(shù):dbq 設(shè)置值:實(shí)際路徑文件名稱(chēng)
☆、例句:
“driver={microsoft access driver (*.mdb)};dbq=c: omepath/dbname.mdb;uid=admin;pwd=pass; ”
⑵、dbase odbc dsnless 連接:
☆、參數(shù):driver 設(shè)置值:{microsoft dbase driver (*.dbf)}
☆、參數(shù):dbq 設(shè)置值:實(shí)際路徑文件名稱(chēng)
☆、例句:
“driver={microsoft dbase driver (*.dbf)};driverid=277;dbq=c: omepath/dbname.dbf; ”
⑶、oracle odbc dsnless 連接:
☆、參數(shù):driver 設(shè)置值:{microsoft odbc for oracle}
☆、參數(shù):dbq 設(shè)置值:實(shí)際路徑文件名稱(chēng)
☆、例句:
“driver={microsoft odbc for oracle};server=oracleserver.world;uid=admin;pwd=pass; ”
⑷、ms sql server dsnless 連接:
☆、參數(shù):driver 設(shè)置值:{sql server};
☆、參數(shù):server 設(shè)置值:服務(wù)器名稱(chēng)
☆、參數(shù):database 設(shè)置值:數(shù)據(jù)表名稱(chēng)
☆、參數(shù):uid 設(shè)置值:用戶(hù)名稱(chēng)
☆、參數(shù):pwd 設(shè)置值:密碼
☆、例句:
“driver={sql server};server=servername;database=dbname;uid=sa;pwd=pass; ”
⑸、ms text driver dsnless 連接:
☆、參數(shù):driver 設(shè)置值:{microsoft text driver (*.txt; *.csv)}
☆、參數(shù):dbq 設(shè)置值:實(shí)際路徑文件名稱(chēng)
☆、例句:
“driver={microsoft text driver (*.txt; *.csv)};dbq=c: omepath/;extensions=asc,csv,tab,txt;persist security info=false; ”
⑹、visual foxpro dsnless 連接:
☆、參數(shù):driver 設(shè)置值:{microsoft visual foxpro driver}
☆、參數(shù):sourcetype 設(shè)置值:dbc
☆、參數(shù):sourcedb 設(shè)置值:實(shí)際路徑文件名稱(chēng)
☆、例句:
“driver={microsoft visual foxpro driver};sourcetype=dbc;sourcedb=c: omepath/dbname.dbc;exclusive=no;”
⑺、mysql dsnless 連接:
☆、參數(shù):driver 設(shè)置值:{mysql}
☆、參數(shù):database 設(shè)置值:數(shù)據(jù)表名稱(chēng)
☆、參數(shù):uid 設(shè)置值:用戶(hù)名稱(chēng)
☆、參數(shù):pwd 設(shè)置值:密碼
☆、例句:
“driver={mysql}; database=yourdatabase;uid=username;pwd=password;option=16386”
*******************************************************************
sql語(yǔ)言簡(jiǎn)介
在上一講中我們介紹了連接外部數(shù)據(jù)庫(kù)的方法,那么連接之后怎樣對(duì)外部數(shù)據(jù)庫(kù)進(jìn)行讀取、顯示、增刪、更新、查詢(xún)等操作呢?這些操作需要通過(guò)外部數(shù)據(jù)庫(kù)等對(duì)象調(diào)用sql指令才能完成。
㈠、什么是sql語(yǔ)言
sql(structure query languge,結(jié)構(gòu)化查詢(xún)語(yǔ)言)是一種數(shù)據(jù)庫(kù)專(zhuān)用的計(jì)算機(jī)語(yǔ)言,不管是oracle、ms sql 、access、mysql或其他公司的數(shù)據(jù)庫(kù),也不管數(shù)據(jù)庫(kù)建立在大型主機(jī)或個(gè)人計(jì)算機(jī)上,都可以使用sql語(yǔ)言來(lái)訪問(wèn)和修改數(shù)據(jù)庫(kù)的內(nèi)容。雖然不同公司的數(shù)據(jù)庫(kù)軟件多多少少會(huì)增加一些專(zhuān)屬的sql語(yǔ)法,但大體上,它們還是遵循asni(美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì))制定的sql標(biāo)準(zhǔn)。因?yàn)閟ql語(yǔ)言具有易學(xué)習(xí)及閱讀等特性,所以sql逐漸被各種數(shù)據(jù)庫(kù)廠商采用,而成為一種共通的標(biāo)準(zhǔn)查詢(xún)語(yǔ)言。只要你學(xué)會(huì)sql,即可操作各種數(shù)據(jù)庫(kù)如visual foxpro、access、dbase等等。總之,sql語(yǔ)言是各種數(shù)據(jù)庫(kù)都可以使用的數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)言。
sql語(yǔ)言不僅僅具有查詢(xún)數(shù)據(jù)庫(kù)的功能,而且可以對(duì)數(shù)據(jù)庫(kù)完成選取、增刪、更新與跳轉(zhuǎn)等各種操作。
㈡、sql語(yǔ)言的組成
sql語(yǔ)言是由命令(函數(shù))、子句、運(yùn)算符、加總函數(shù)及通配符等組成,分述如下:
1、命令
sql的命令可分成數(shù)據(jù)定義語(yǔ)言與數(shù)據(jù)操作語(yǔ)言,數(shù)據(jù)定義語(yǔ)言可用來(lái)建立新的數(shù)據(jù)庫(kù)、數(shù)據(jù)表、字段及索引等,本教程不予介紹;另一為數(shù)據(jù)操作語(yǔ)言,可用來(lái)建立查詢(xún)表、排序、篩選數(shù)據(jù)、修改、增刪等動(dòng)作。數(shù)據(jù)定義語(yǔ)言命令常用的有選擇、添加、刪除和修改這四種:
⑴、命令:select
中文意思:選擇
說(shuō)明:用于找出合乎條件的記錄
⑵、命令:insert
中文意思:插入
說(shuō)明:用于增加一筆記錄或合并兩個(gè)數(shù)據(jù)表
⑶、命令:update
中文意思:更新
說(shuō)明:用于更正合乎條件的記錄
⑷、命令:delete
中文意思:刪除
說(shuō)明:用于刪除合乎條件的記錄
2、子句
子句是用于設(shè)定命令要操作的對(duì)象(即參數(shù)),sql所用的子句如下:
⑴、子句:from
中文意思:數(shù)據(jù)表
說(shuō)明:用于指定數(shù)據(jù)表
⑵、子句:where
中文意思:條件
說(shuō)明:用于設(shè)定條件
⑶、group by
中文意思:分組(合并)
說(shuō)明:用于設(shè)定分組
⑷、order by
中文意思:排序
說(shuō)明:用于設(shè)定輸出的順序及字段
3、運(yùn)算符
子句參數(shù)中的運(yùn)算符使子句構(gòu)成不同的語(yǔ)法格式,如“字段1=''100''”、“字段1>''100''”等。運(yùn)算符又分邏輯運(yùn)算符與比較運(yùn)算符。
◇邏輯運(yùn)算符如下:
⑴、運(yùn)算符:and
中文意思:并且
說(shuō)明:邏輯且
⑵、運(yùn)算符:or
中文意思:或者
說(shuō)明:邏輯非
⑶、運(yùn)算符:not
中文意思:取反
說(shuō)明:邏輯非或邏輯反
◇比較運(yùn)算符如下:
⑴、運(yùn)算符:< 說(shuō)明:小于
⑵、運(yùn)算符:≤ 說(shuō)明:小于等于
⑶、運(yùn)算符:≥ 說(shuō)明:大于等于
⑷、運(yùn)算符:> 說(shuō)明:大于
⑸、運(yùn)算符:= 說(shuō)明:等于
⑹、運(yùn)算符:<> 說(shuō)明:不等于
⑺、運(yùn)算符:between 說(shuō)明:用于設(shè)定范圍 中文意思:在...之間
⑻、運(yùn)算符:like 說(shuō)明:用于通配設(shè)定 中文意思:如同
⑼、運(yùn)算符:in 說(shuō)明:用于集合設(shè)定 中文意思:在...之內(nèi)
4、加總函數(shù)
加總函數(shù)常常運(yùn)用在命令的參數(shù)中,如:“select sum(數(shù)學(xué)),avg(數(shù)學(xué)) from 成績(jī)單”。
⑴、加總函數(shù):avg
中文意思:平均
說(shuō)明:用于求指定條件的平均
⑵、加總函數(shù):count
中文意思:數(shù)量
說(shuō)明:用于求指定的數(shù)量
⑶、加總函數(shù):sum
中文意思:和
說(shuō)明:用于求指定條件的和
⑷、加總函數(shù):max
中文意思:最大值
說(shuō)明:用于求指定條件的最大值
⑸、加總函數(shù):min
中文意思:最小值
說(shuō)明:用于求指定條件的最小值
5、通配符
⑴、通配符:% 意義:任何長(zhǎng)度的字符串(包括0)
⑵、通配符:_ 意義:下劃線表示任何一個(gè)字符
⑶、通配符:[] 意義:中括號(hào)表示某個(gè)范圍內(nèi)的一個(gè)字符
在下一講將說(shuō)明sql語(yǔ)言是怎樣把命令(函數(shù))、子句、運(yùn)算符、及加總函數(shù)等組合在一起的。
*************************************************************************
嵌入式sql的應(yīng)用
sql語(yǔ)句可以單獨(dú)在數(shù)據(jù)庫(kù)系統(tǒng)本身中執(zhí)行,但如果運(yùn)用在其他編程工具所編制的程序中,一般不能單獨(dú)執(zhí)行,而要把sql語(yǔ)句嵌入到高級(jí)語(yǔ)言(如易語(yǔ)言)中使用,通過(guò)高級(jí)語(yǔ)言的命令和方法來(lái)調(diào)用之,此時(shí)sql稱(chēng)為嵌入式sql。調(diào)用sql語(yǔ)句的程序稱(chēng)為宿主程序,在易語(yǔ)言中一般是把sql語(yǔ)句作為宿主程序的唯一參數(shù)來(lái)直接處理。嵌入式sql在使用上有一些規(guī)定,在易語(yǔ)言中目前的版本規(guī)定如下:
⑴、在程序中要區(qū)分sql語(yǔ)句和宿主語(yǔ)言的語(yǔ)句。在易語(yǔ)言中好區(qū)分,因?yàn)閟ql語(yǔ)句形式是英文的,而易語(yǔ)言是中文的,但在實(shí)際應(yīng)用時(shí)仍然有可能會(huì)混亂,所以易語(yǔ)言要把sql語(yǔ)句轉(zhuǎn)化為文本型才能調(diào)用,即嵌入式sql語(yǔ)句兩邊要用雙引號(hào)來(lái)標(biāo)示。
⑵、允許sql語(yǔ)句使用宿主程序的變量,但使用時(shí)要將宿主程序的變量跟外部數(shù)據(jù)庫(kù)中表格的字段名區(qū)別開(kāi)來(lái),區(qū)別方法如下:
①、在易語(yǔ)言中要將變量類(lèi)型轉(zhuǎn)化為文本型變量才能被sql文本相加使用,比如下面的例子中有一個(gè)叫“數(shù)字1”的整數(shù)類(lèi)型變量,插入到sql文本中是這樣表達(dá):
外部數(shù)據(jù)庫(kù)1.查詢(xún) (“select * from chj where ” + 組合框1.內(nèi)容 + “=” + 到文本 (數(shù)字1))
②、包含字段名的sql文本兩邊加雙引號(hào),變量名不能在雙引號(hào)內(nèi),如上例。
⑶、要將字段名跟字段值區(qū)別開(kāi)來(lái),區(qū)別方法如下:
①、對(duì)于文本類(lèi)型的字段,在其字段值兩邊要加上“''”號(hào)標(biāo)示其文本值,代表語(yǔ)法是:字段名稱(chēng)=‘文本值’。如下:
外部數(shù)據(jù)庫(kù)1.查詢(xún) (“select * from chj where 姓名=''山大王''”)
又如下面“查找編輯框.內(nèi)容”中的字段值是文本型,嵌入式sql語(yǔ)句如下:
外部數(shù)據(jù)庫(kù)1.查詢(xún) (“select * from chj where 姓名==” + “''” + 查找編輯框.內(nèi)容 + “''”)
②、對(duì)于數(shù)字類(lèi)型的字段,在sql語(yǔ)句中表示其字段值,兩邊不加符號(hào)標(biāo)示,代表語(yǔ)法是:字段名稱(chēng)=數(shù)字值。如下兩例:
外部數(shù)據(jù)庫(kù)1.查詢(xún) (“select * from chj where ” + 組合框1.內(nèi)容 + “=” + 查找編輯框.內(nèi)容)
外部數(shù)據(jù)庫(kù)1.查詢(xún) (“select * from chj where 學(xué)號(hào)=17”)
③、對(duì)于日期時(shí)間類(lèi)型的字段,在其字段值兩邊要加上“#”號(hào)標(biāo)示其時(shí)間值,代表語(yǔ)法是:字段名稱(chēng)=#時(shí)間值#。如下兩例:
外部數(shù)據(jù)庫(kù)1.查詢(xún) (“select * from chj where 入學(xué)時(shí)間 between #2001-01-01# and #2002-01-01#”)
外部數(shù)據(jù)庫(kù)1.查詢(xún) (“select * from chj where ” + 組合框1.內(nèi)容 + “=” + “#” + 查找編輯框.內(nèi)容 + “#”)
④、也可以將sql語(yǔ)句中的字段名(尤其是中文名)可用中括號(hào)括住,如:[字段名]。
⑷、sql語(yǔ)句要用半角輸入法輸入,否則可能會(huì)出錯(cuò)。
那么在易語(yǔ)言中怎樣調(diào)用sql語(yǔ)句呢?一般是在外部數(shù)據(jù)庫(kù)對(duì)象(控件)的方法中調(diào)用,試概括如下:
⑴、對(duì)外部數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)的方法。
對(duì)外部數(shù)據(jù)庫(kù)的查詢(xún)就是在對(duì)外部數(shù)據(jù)庫(kù)不加編輯改動(dòng)的前提下,只通過(guò)記錄集來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行顯示、查詢(xún)、篩選、排序和記錄集的合并等操作。
所有查詢(xún)類(lèi)的方法起源于下面這個(gè)語(yǔ)句,其他查詢(xún)類(lèi)語(yǔ)句是對(duì)這個(gè)語(yǔ)句的調(diào)用(將此語(yǔ)句作為唯一的參數(shù)),該語(yǔ)句如下:
外部數(shù)據(jù)庫(kù).查詢(xún) (查詢(xún)類(lèi)sql語(yǔ)句)
也可這樣表達(dá):
外部數(shù)據(jù)庫(kù).查詢(xún) (“select...from...[where]...[group by]...[order by]... ”)
該方法是對(duì)當(dāng)前被打開(kāi)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)查詢(xún),返回的結(jié)果稱(chēng)為“記錄集句柄”(即記錄集的標(biāo)記)。注意當(dāng)不再使用此記錄集時(shí),必須使用“關(guān)閉記錄集”將其關(guān)閉,如果失敗,返回0。在易語(yǔ)言中,將以上語(yǔ)句等同于記錄集句柄以作為其他查詢(xún)類(lèi)語(yǔ)句的參數(shù)。為了使該參數(shù)在所有子程序中都能應(yīng)用,我們一般把它設(shè)置為整數(shù)型全局變量,并將其值設(shè)置如下:
記錄集句柄=外部數(shù)據(jù)庫(kù).查詢(xún) (查詢(xún)類(lèi)sql語(yǔ)句)
由于易語(yǔ)言要把sql語(yǔ)句轉(zhuǎn)化為文本型才能調(diào)用,所以嵌入式sql語(yǔ)句兩邊要有雙引號(hào),例句:
記錄集句柄 = 外部數(shù)據(jù)庫(kù)1.查詢(xún) (“select * from chj ”)
※ “chj”是外部數(shù)據(jù)庫(kù)中一個(gè)表的名稱(chēng)
又如,欲得到排序的記錄集,應(yīng)象下面這樣賦值:
記錄集句柄 = 外部數(shù)據(jù)庫(kù)1.查詢(xún) (“select * from chj order by 語(yǔ)文 desc”)
現(xiàn)將外部數(shù)據(jù)庫(kù)控件中其他的查詢(xún)類(lèi)方法列舉如下:
①、外部數(shù)據(jù)庫(kù).重新查詢(xún) (記錄集句柄) 即:
外部數(shù)據(jù)庫(kù).重新查詢(xún) (外部數(shù)據(jù)庫(kù).查詢(xún) (查詢(xún)類(lèi)sql語(yǔ)句))
例句:外部數(shù)據(jù)庫(kù)1.重新查詢(xún) (外部數(shù)據(jù)庫(kù)1.查詢(xún) (“select * from chj ”))
②、外部數(shù)據(jù)庫(kù).首記錄前 (記錄集句柄) 即:
外部數(shù)據(jù)庫(kù).首記錄前 (外部數(shù)據(jù)庫(kù).查詢(xún) (查詢(xún)類(lèi)sql語(yǔ)句))
例句:外部數(shù)據(jù)庫(kù)1.首記錄前 (記錄集句柄)
③、外部數(shù)據(jù)庫(kù).尾記錄后 (記錄集句柄)
④、外部數(shù)據(jù)庫(kù).到首記錄 (記錄集句柄)
⑤、外部數(shù)據(jù)庫(kù).到尾記錄 (記錄集句柄)
⑥、外部數(shù)據(jù)庫(kù).到前一記錄 (記錄集句柄)
⑦、外部數(shù)據(jù)庫(kù).到后一記錄 (記錄集句柄)
⑧、外部數(shù)據(jù)庫(kù).讀 (記錄集句柄,字段名稱(chēng)或位置)
例句:語(yǔ)文編輯框.內(nèi)容 = 到文本 (外部數(shù)據(jù)庫(kù)1.讀 (記錄集句柄, “語(yǔ)文”))
⑵、對(duì)外部數(shù)據(jù)庫(kù)進(jìn)行編輯的方法。
所謂對(duì)外部數(shù)據(jù)庫(kù)的編輯,就是變更改動(dòng)外部數(shù)據(jù)庫(kù)本身,包括添加、更新、刪除等,對(duì)數(shù)據(jù)庫(kù)進(jìn)行編輯不必通過(guò)記錄集。所有非查詢(xún)類(lèi)sql語(yǔ)句都嵌入下面這個(gè)語(yǔ)句來(lái)執(zhí)行:
外部數(shù)據(jù)庫(kù).執(zhí)行 (非查詢(xún)類(lèi)sql語(yǔ)句)
①、添加記錄,其語(yǔ)法如下:
外部數(shù)據(jù)庫(kù).執(zhí)行 (“insert into 表名稱(chēng)(字段1,字段2...) values (字段值1,字段值2...) ”)
例句:
外部數(shù)據(jù)庫(kù)1.執(zhí)行 (“insert into chj ” + “(學(xué)號(hào),姓名,語(yǔ)文,數(shù)學(xué),英語(yǔ))” + “ values ” + “(” + 學(xué)號(hào)編輯框.內(nèi)容 + “,''” + 姓名編輯框.內(nèi)容 + “'',''” + 語(yǔ)文編輯框.內(nèi)容 + “'',''” + 數(shù)學(xué)編輯框.內(nèi)容 + “'',''” + 英語(yǔ)編輯框.內(nèi)容 + “'')”)
②、更新記錄,其語(yǔ)法如下:
外部數(shù)據(jù)庫(kù).執(zhí)行 (“update 表名稱(chēng) set 字段1=字段值1,字段2=字段值2...where 條件式”)
例句:
外部數(shù)據(jù)庫(kù)1.執(zhí)行 (“update chj set 學(xué)號(hào)=” + “''” + 學(xué)號(hào)編輯框.內(nèi)容 + “'',” + “姓名=” + “''” + 姓名編輯框.內(nèi)容 + “'',” + “語(yǔ)文=” + “''” + 語(yǔ)文編輯框.內(nèi)容 + “'',” + “數(shù)學(xué)=” + “''” + 數(shù)學(xué)編輯框.內(nèi)容 + “'',” + “英語(yǔ)=” + “''” + 英語(yǔ)編輯框.內(nèi)容 + “'' ” + “where 姓名=” + “''” + 姓名1 + “'' ” + “and 語(yǔ)文=” + 語(yǔ)文1 + “and 數(shù)學(xué)=” + 數(shù)學(xué)1 + “and 英語(yǔ)=” + 英語(yǔ)1 + “and 學(xué)號(hào)=” + 學(xué)號(hào)1)
③、刪除記錄,其語(yǔ)法如下:
外部數(shù)據(jù)庫(kù).執(zhí)行 (“delete * from 表名稱(chēng) where 條件式”)
例句:
外部數(shù)據(jù)庫(kù).執(zhí)行 (“外部數(shù)據(jù)庫(kù)1.執(zhí)行 (“delete * from chj ” + “where 姓名=” + “''” + 姓名1 + “'' ” + “and 語(yǔ)文=” + 語(yǔ)文1 + “and 數(shù)學(xué)=” + 數(shù)學(xué)1 + “and 英語(yǔ)=” + 英語(yǔ)1 + “and 學(xué)號(hào)=” + 學(xué)號(hào)1)”)