Blob
Blob 就像是 Memo 和 Varbinary 的一個(gè)交集:它在一個(gè) FTP 文件中存儲(chǔ)二進(jìn)制數(shù)據(jù)。跟其它數(shù)據(jù)類(lèi)型一樣,Microsoft 給 VFP 9 增加 Blob 就是為了給其它數(shù)據(jù)庫(kù)提供更好的支持。不過(guò),你很快就可以看到,在 VFP 本地表中它也有很大的用處。Blob 的單字符縮寫(xiě)是“W”。
這里是關(guān)于 Blob 的一些細(xì)節(jié):
×× Blob 的功能與 Memo 類(lèi)似:你不能在其上建立索引,它接收 Null 值,在一個(gè)表或者游標(biāo)中的 Blob 字段有一個(gè) 2GB 數(shù)據(jù)的限制(當(dāng)然了,F(xiàn)PT 文件的總大小也只能有2GB)。在一個(gè) BROWSE 窗口或者 Grid 中,一個(gè) Blob 字段中如果是空的,則顯示為 "blob",否則則顯示為“Blob”。
×× 你可以使用一個(gè) editbox 或者 MODIFY MEMO 來(lái)顯示一個(gè) Blob 字段的內(nèi)容。它的二進(jìn)制數(shù)據(jù)以不帶前導(dǎo) 0h 的十六進(jìn)制值的形式顯示。然而,它的內(nèi)容是只讀的。在 Blob 字段中的值必須編程的修改,例如REPLACE 或者 GATHER。
×× 跟 Varbinary 一樣,在 Blob 字段上是不會(huì)進(jìn)行代碼頁(yè)轉(zhuǎn)換的。
×× 對(duì)于 Blob 字段和存儲(chǔ)在內(nèi)存變量中的 Blob 值,TYPE() 和 VARTYPE() 函數(shù)返回的是“Q”而不是你準(zhǔn)備看到的“W”。DISPLAY/LIST STRUCTURE 和 AFIELDS() 則會(huì)正常的為 Blob 字段顯示 “Blob”和“W”。
×× TRIM()、RTRIM()、LTRIM()、ALLTRIM()、ALINES()、TRANSFORM()、ISBLANK()、以及 Empty() 對(duì) Blob 的處理跟它們對(duì)待 Varbinary 字段是一樣的。
×× SQL LIKE 操作符、LIKE()、LIKEC()、BINTOC()、CTOBIN()、以及 APPEND FROM 不支持 Blob 字段。
×× Blob 字段可以被用作包含圖像的 General 字段的替代品。General 字段有許多毛?。汉茈y使用、很難更新、體積太大,等等。在一個(gè) General 字段中存儲(chǔ)圖像需要有一個(gè)關(guān)聯(lián)到一個(gè) ActiveX Server 的文件,而存儲(chǔ)在一個(gè) Blob 字段中就簡(jiǎn)單了,它們很容易去更新,跟使用 APPEND GENERAL 不同,你可以使用象下面這樣的東西來(lái)把一幅圖片放入到一個(gè) Blob 字段中去:狐社
replace Picture with filetostr('BobJones.gif') in Employees
要在一個(gè)表單上顯示存儲(chǔ)在一個(gè) Blob 字段中的圖像,只要簡(jiǎn)單的把一個(gè) Image 控件的 PictureVal 屬性設(shè)置為這個(gè) Blob 字段的內(nèi)容就行了:
Thisform.imgEmployee.PictureVal = Employees.Picture
運(yùn)行 BlobDemo.SCX 可以看到這個(gè)功能的一個(gè)演示。它提供了一個(gè)簡(jiǎn)單的圖像瀏覽器表單。它的 Load 方法會(huì)使用下面的代碼建立一個(gè)用來(lái)放圖像的游標(biāo):
create cursor TEST (FIELD1 Blob) insert into TEST values (filetostr(home() + 'FOX.BMP')) insert into TEST values (filetostr(home() + 'WIZARDS\BANDRPT.BMP')) insert into TEST values (filetostr(home() + 'WIZARDS\WIZFLAX.BMP')) insert into TEST values (filetostr(home() + 'WIZARDS\WIZSTONE.BMP')) insert into TEST values (filetostr(home() + 'WIZARDS\FOXQSTRT.BMP')) go top
表單上的 NEXT 和 Previous 按鈕將 Image 控件的 PictureVal 屬性設(shè)置為游標(biāo)中的 FIELD1。
為變長(zhǎng)的值們指定數(shù)據(jù)類(lèi)型
在過(guò)去版本的 VFP 中,在一個(gè) SQL SELECT 語(yǔ)句中使用一個(gè)表達(dá)式會(huì)導(dǎo)致變長(zhǎng)數(shù)據(jù)出現(xiàn)一下兩種情況中一種:值被填補(bǔ)上空格而不是去掉空格、并且/或所有的值都被剪斷到在結(jié)果的第一條記錄中值的長(zhǎng)度了。
這里是從 TestVarcharMapping.PRG 中拿來(lái)的一個(gè)例子,它演示了這兩種問(wèn)題:
select trim(FirstName) + ' ' + trim(LastName) as FullName ; from Employees ; into cursor Test clear scan ? FullName, len(FullName) endscan use
* 使用一個(gè)函數(shù)來(lái)做,以演示那些字段都被縮放到第一條記錄中值的長(zhǎng)度了
select GetFullName(FirstName, LastName) as FullName ; from Employees ; into cursor Test scan ? FullName, len(FullName) endscan
function GetFullName(tcFirstName, tcLastName) return trim(tcFirstName) + ' ' + trim(tcLastName)
第一個(gè)循環(huán)演示了在結(jié)果集中的所有記錄都被填補(bǔ)空格直到31個(gè)字符的長(zhǎng)度,即使在 SQL SELECT 語(yǔ)句中的表達(dá)式對(duì)字段進(jìn)行過(guò)了 Trim。第二個(gè)循環(huán)演示了所有記錄都被裁減到了13個(gè)字符的長(zhǎng)度,這是因?yàn)檫@個(gè)長(zhǎng)度是該表達(dá)式在第一條記錄上的結(jié)果的長(zhǎng)度;VFP 使用這個(gè)值作為這個(gè)游標(biāo)的結(jié)構(gòu)的模板。
無(wú)論哪一種行為特性都不是你想要的。在第一種情況中,盡管你要求的是去掉空格的值,可結(jié)果還是沒(méi)有被 Trim 過(guò)。在第二種情況中,由于字段的寬度不足以為每條記錄包含正確的值,所以數(shù)據(jù)實(shí)際上被丟失了。
Blob 就像是 Memo 和 Varbinary 的一個(gè)交集:它在一個(gè) FTP 文件中存儲(chǔ)二進(jìn)制數(shù)據(jù)。跟其它數(shù)據(jù)類(lèi)型一樣,Microsoft 給 VFP 9 增加 Blob 就是為了給其它數(shù)據(jù)庫(kù)提供更好的支持。不過(guò),你很快就可以看到,在 VFP 本地表中它也有很大的用處。Blob 的單字符縮寫(xiě)是“W”。
這里是關(guān)于 Blob 的一些細(xì)節(jié):
×× Blob 的功能與 Memo 類(lèi)似:你不能在其上建立索引,它接收 Null 值,在一個(gè)表或者游標(biāo)中的 Blob 字段有一個(gè) 2GB 數(shù)據(jù)的限制(當(dāng)然了,F(xiàn)PT 文件的總大小也只能有2GB)。在一個(gè) BROWSE 窗口或者 Grid 中,一個(gè) Blob 字段中如果是空的,則顯示為 "blob",否則則顯示為“Blob”。
×× 你可以使用一個(gè) editbox 或者 MODIFY MEMO 來(lái)顯示一個(gè) Blob 字段的內(nèi)容。它的二進(jìn)制數(shù)據(jù)以不帶前導(dǎo) 0h 的十六進(jìn)制值的形式顯示。然而,它的內(nèi)容是只讀的。在 Blob 字段中的值必須編程的修改,例如REPLACE 或者 GATHER。
×× 跟 Varbinary 一樣,在 Blob 字段上是不會(huì)進(jìn)行代碼頁(yè)轉(zhuǎn)換的。
×× 對(duì)于 Blob 字段和存儲(chǔ)在內(nèi)存變量中的 Blob 值,TYPE() 和 VARTYPE() 函數(shù)返回的是“Q”而不是你準(zhǔn)備看到的“W”。DISPLAY/LIST STRUCTURE 和 AFIELDS() 則會(huì)正常的為 Blob 字段顯示 “Blob”和“W”。
×× TRIM()、RTRIM()、LTRIM()、ALLTRIM()、ALINES()、TRANSFORM()、ISBLANK()、以及 Empty() 對(duì) Blob 的處理跟它們對(duì)待 Varbinary 字段是一樣的。
×× SQL LIKE 操作符、LIKE()、LIKEC()、BINTOC()、CTOBIN()、以及 APPEND FROM 不支持 Blob 字段。
×× Blob 字段可以被用作包含圖像的 General 字段的替代品。General 字段有許多毛?。汉茈y使用、很難更新、體積太大,等等。在一個(gè) General 字段中存儲(chǔ)圖像需要有一個(gè)關(guān)聯(lián)到一個(gè) ActiveX Server 的文件,而存儲(chǔ)在一個(gè) Blob 字段中就簡(jiǎn)單了,它們很容易去更新,跟使用 APPEND GENERAL 不同,你可以使用象下面這樣的東西來(lái)把一幅圖片放入到一個(gè) Blob 字段中去:狐社
replace Picture with filetostr('BobJones.gif') in Employees
要在一個(gè)表單上顯示存儲(chǔ)在一個(gè) Blob 字段中的圖像,只要簡(jiǎn)單的把一個(gè) Image 控件的 PictureVal 屬性設(shè)置為這個(gè) Blob 字段的內(nèi)容就行了:
Thisform.imgEmployee.PictureVal = Employees.Picture
運(yùn)行 BlobDemo.SCX 可以看到這個(gè)功能的一個(gè)演示。它提供了一個(gè)簡(jiǎn)單的圖像瀏覽器表單。它的 Load 方法會(huì)使用下面的代碼建立一個(gè)用來(lái)放圖像的游標(biāo):
create cursor TEST (FIELD1 Blob) insert into TEST values (filetostr(home() + 'FOX.BMP')) insert into TEST values (filetostr(home() + 'WIZARDS\BANDRPT.BMP')) insert into TEST values (filetostr(home() + 'WIZARDS\WIZFLAX.BMP')) insert into TEST values (filetostr(home() + 'WIZARDS\WIZSTONE.BMP')) insert into TEST values (filetostr(home() + 'WIZARDS\FOXQSTRT.BMP')) go top
表單上的 NEXT 和 Previous 按鈕將 Image 控件的 PictureVal 屬性設(shè)置為游標(biāo)中的 FIELD1。
為變長(zhǎng)的值們指定數(shù)據(jù)類(lèi)型
在過(guò)去版本的 VFP 中,在一個(gè) SQL SELECT 語(yǔ)句中使用一個(gè)表達(dá)式會(huì)導(dǎo)致變長(zhǎng)數(shù)據(jù)出現(xiàn)一下兩種情況中一種:值被填補(bǔ)上空格而不是去掉空格、并且/或所有的值都被剪斷到在結(jié)果的第一條記錄中值的長(zhǎng)度了。
這里是從 TestVarcharMapping.PRG 中拿來(lái)的一個(gè)例子,它演示了這兩種問(wèn)題:
select trim(FirstName) + ' ' + trim(LastName) as FullName ; from Employees ; into cursor Test clear scan ? FullName, len(FullName) endscan use
* 使用一個(gè)函數(shù)來(lái)做,以演示那些字段都被縮放到第一條記錄中值的長(zhǎng)度了
select GetFullName(FirstName, LastName) as FullName ; from Employees ; into cursor Test scan ? FullName, len(FullName) endscan
function GetFullName(tcFirstName, tcLastName) return trim(tcFirstName) + ' ' + trim(tcLastName)
第一個(gè)循環(huán)演示了在結(jié)果集中的所有記錄都被填補(bǔ)空格直到31個(gè)字符的長(zhǎng)度,即使在 SQL SELECT 語(yǔ)句中的表達(dá)式對(duì)字段進(jìn)行過(guò)了 Trim。第二個(gè)循環(huán)演示了所有記錄都被裁減到了13個(gè)字符的長(zhǎng)度,這是因?yàn)檫@個(gè)長(zhǎng)度是該表達(dá)式在第一條記錄上的結(jié)果的長(zhǎng)度;VFP 使用這個(gè)值作為這個(gè)游標(biāo)的結(jié)構(gòu)的模板。
無(wú)論哪一種行為特性都不是你想要的。在第一種情況中,盡管你要求的是去掉空格的值,可結(jié)果還是沒(méi)有被 Trim 過(guò)。在第二種情況中,由于字段的寬度不足以為每條記錄包含正確的值,所以數(shù)據(jù)實(shí)際上被丟失了。