新的數據和索引類型
上一次 VFP 有新的數據或者索引類型的時候已經是很久以前了。VFP 9 增加了三種新的數據類型和一種新的索引類型。這些新的數據類型使得與其它已經支持這些數據類型的數據庫引擎一起工作變得容易了。新的 binary 索引為象 DELETED() 這樣的邏輯條件增強了 Rushmore 優(yōu)化。
VFP 3 給產品增加了幾個新的數據類型……Double、Currency、Integer 、以及 DateTime……還有兩種新的索引類型 Candidate 和 Primary。然而,從那以后,對數據類型的改動是 VFP 8 里增加的 Integer 字段的自動增長,而它也并非是一個新的數據類型。
由于一些其它的數據庫引擎,比如 SQL Server,支持范圍很廣的多種數據類型,VFP 不得不將這些數據類型映射到它自己的少量數據類型中。有時候,這種映射實在不夠完美。VFP 9 通過增加了三種數據類型來幫助解決這個問題。
Varchar
第一種新數據類型是 Varchar。Varchar 其實并不是一種新數據類型;本質上它不過是沒有加上填補上空格的字符型而已。Varchar 的單字符縮寫是“V”。
由于 DBF 結構沒有重大的改動(盡管新的數據類型對結構有一些影響;參見本章中后面部分的“新的數據類型是如何影響 DBF 文件的”一節(jié)),Varchar 字段其實是作為固定長度的字段儲存的。不過,當你訪問一個 Varchar 字段的時候,它的值將先被trim 過,而不是填補空格以使得它的長度等于字段的長度。狐社
這是一個從 TestVarchar.PRG 中拿來的例子,它建立一個帶有一個 Varchar 字段的游標,并演示其跟 Character 的不同:
create cursor Test (CField C(20), VField V(20)) insert into Test values ('Fox Rocks', 'Fox Rocks') insert into Test values ('Fox Rocks ', 'Fox Rocks ') go top ? len(CField), len(VField) && displays 20 and 9 skip ? len(CField), len(VField) && displays 20 and 12
注意第二條記錄的 Varchar 字段中包含有三個空格,特別指定要包含在值中的空格在被儲存到字段中去時是被認為有意義的。
VFP 9 增加 Varchar 以更好的為其它象 SQL Server 這樣支持這種數據類型的數據庫提供支持。例如,在 VFP 8 中,如果你建立了一個來自包含有 Varchar 字段的 SQL Server 表的遠程視圖,然后使用 TABLEUPDATE() 來將改動寫入到 SQL Server 中去,在被更新記錄中的 Varchar 字段將被填補上空格,因為這些空格存在于 VFP 8 視圖中。在 VFP 9 做同樣的事情會得到期望的結果:Varchar 字段不會被填補上空格。
TestVarcharWithSQLServer.PRG 對此做了演示。它打開在 Test 數據庫中的一個基于 SQL Server Northwind 示例數據庫的 Customers 表的視圖。在該表中的 CompanyName 字段被定義為 Varchar,但視圖把它定義為 Character。更新這個表會強制用空格填補字段后再放入數據庫中。將視圖中的這個字段數據類型改為 Varchar、并再次更新這個表就會去掉多余的空格。
* 連續(xù)到 SQL Server Northwind 數據庫。根據你的情況改動連接串
lnHandle = sqlstringconnect('driver=SQL Server;server=(local);' + ; 'Database=Northwind;trusted_connection=yes;') if lnHandle < 1 return endif lnHandle < 1
* 打開示例數據庫
open database Test
* Ensure the CompanyName field in the CustomerView view is Character, then open * the view and display the contents of CompanyName in the first record.
dbsetprop('CustomerView.CompanyName', 'Field', 'DataType', 'C(40)') use CustomerView connstring (lnHandle) messagebox('CompanyName in the first record is ' + CompanyName + ; ', which is ' + transform(len(CompanyName)) + ' characters.')
* 更新這條記錄并保存它
replace CompanyName with trim(CompanyName) tableupdate() use
* 現在將 CompanyName 定義為 Varchar后再做一次。 * 可以看到第一條記錄中由于我們剛才保存的改動而有著多余的空格
dbsetprop('CustomerView.CompanyName', 'Field', 'DataType', 'V(40)') use CustomerView connstring (lnHandle) messagebox('CompanyName in the first record is ' + CompanyName + ; ', which is ' + transform(len(CompanyName)) + ' characters.')
* 更新記錄并保存它
replace CompanyName with trim(CompanyName) tableupdate() requery() messagebox('CompanyName in the first record is ' + CompanyName + ; ', which is ' + transform(len(CompanyName)) + ' characters.')
* 清理并退出
sqldisconnect(lnHandle) close databases all
上一次 VFP 有新的數據或者索引類型的時候已經是很久以前了。VFP 9 增加了三種新的數據類型和一種新的索引類型。這些新的數據類型使得與其它已經支持這些數據類型的數據庫引擎一起工作變得容易了。新的 binary 索引為象 DELETED() 這樣的邏輯條件增強了 Rushmore 優(yōu)化。
VFP 3 給產品增加了幾個新的數據類型……Double、Currency、Integer 、以及 DateTime……還有兩種新的索引類型 Candidate 和 Primary。然而,從那以后,對數據類型的改動是 VFP 8 里增加的 Integer 字段的自動增長,而它也并非是一個新的數據類型。
由于一些其它的數據庫引擎,比如 SQL Server,支持范圍很廣的多種數據類型,VFP 不得不將這些數據類型映射到它自己的少量數據類型中。有時候,這種映射實在不夠完美。VFP 9 通過增加了三種數據類型來幫助解決這個問題。
Varchar
第一種新數據類型是 Varchar。Varchar 其實并不是一種新數據類型;本質上它不過是沒有加上填補上空格的字符型而已。Varchar 的單字符縮寫是“V”。
由于 DBF 結構沒有重大的改動(盡管新的數據類型對結構有一些影響;參見本章中后面部分的“新的數據類型是如何影響 DBF 文件的”一節(jié)),Varchar 字段其實是作為固定長度的字段儲存的。不過,當你訪問一個 Varchar 字段的時候,它的值將先被trim 過,而不是填補空格以使得它的長度等于字段的長度。狐社
這是一個從 TestVarchar.PRG 中拿來的例子,它建立一個帶有一個 Varchar 字段的游標,并演示其跟 Character 的不同:
create cursor Test (CField C(20), VField V(20)) insert into Test values ('Fox Rocks', 'Fox Rocks') insert into Test values ('Fox Rocks ', 'Fox Rocks ') go top ? len(CField), len(VField) && displays 20 and 9 skip ? len(CField), len(VField) && displays 20 and 12
注意第二條記錄的 Varchar 字段中包含有三個空格,特別指定要包含在值中的空格在被儲存到字段中去時是被認為有意義的。
VFP 9 增加 Varchar 以更好的為其它象 SQL Server 這樣支持這種數據類型的數據庫提供支持。例如,在 VFP 8 中,如果你建立了一個來自包含有 Varchar 字段的 SQL Server 表的遠程視圖,然后使用 TABLEUPDATE() 來將改動寫入到 SQL Server 中去,在被更新記錄中的 Varchar 字段將被填補上空格,因為這些空格存在于 VFP 8 視圖中。在 VFP 9 做同樣的事情會得到期望的結果:Varchar 字段不會被填補上空格。
TestVarcharWithSQLServer.PRG 對此做了演示。它打開在 Test 數據庫中的一個基于 SQL Server Northwind 示例數據庫的 Customers 表的視圖。在該表中的 CompanyName 字段被定義為 Varchar,但視圖把它定義為 Character。更新這個表會強制用空格填補字段后再放入數據庫中。將視圖中的這個字段數據類型改為 Varchar、并再次更新這個表就會去掉多余的空格。
* 連續(xù)到 SQL Server Northwind 數據庫。根據你的情況改動連接串
lnHandle = sqlstringconnect('driver=SQL Server;server=(local);' + ; 'Database=Northwind;trusted_connection=yes;') if lnHandle < 1 return endif lnHandle < 1
* 打開示例數據庫
open database Test
* Ensure the CompanyName field in the CustomerView view is Character, then open * the view and display the contents of CompanyName in the first record.
dbsetprop('CustomerView.CompanyName', 'Field', 'DataType', 'C(40)') use CustomerView connstring (lnHandle) messagebox('CompanyName in the first record is ' + CompanyName + ; ', which is ' + transform(len(CompanyName)) + ' characters.')
* 更新這條記錄并保存它
replace CompanyName with trim(CompanyName) tableupdate() use
* 現在將 CompanyName 定義為 Varchar后再做一次。 * 可以看到第一條記錄中由于我們剛才保存的改動而有著多余的空格
dbsetprop('CustomerView.CompanyName', 'Field', 'DataType', 'V(40)') use CustomerView connstring (lnHandle) messagebox('CompanyName in the first record is ' + CompanyName + ; ', which is ' + transform(len(CompanyName)) + ' characters.')
* 更新記錄并保存它
replace CompanyName with trim(CompanyName) tableupdate() requery() messagebox('CompanyName in the first record is ' + CompanyName + ; ', which is ' + transform(len(CompanyName)) + ' characters.')
* 清理并退出
sqldisconnect(lnHandle) close databases all