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