VFP9新的數(shù)據(jù)和索引類型(一)

字號(hào):

新的數(shù)據(jù)和索引類型
    上一次 VFP 有新的數(shù)據(jù)或者索引類型的時(shí)候已經(jīng)是很久以前了。VFP 9 增加了三種新的數(shù)據(jù)類型和一種新的索引類型。這些新的數(shù)據(jù)類型使得與其它已經(jīng)支持這些數(shù)據(jù)類型的數(shù)據(jù)庫(kù)引擎一起工作變得容易了。新的 binary 索引為象 DELETED() 這樣的邏輯條件增強(qiáng)了 Rushmore 優(yōu)化。
    VFP 3 給產(chǎn)品增加了幾個(gè)新的數(shù)據(jù)類型……Double、Currency、Integer 、以及 DateTime……還有兩種新的索引類型 Candidate 和 Primary。然而,從那以后,對(duì)數(shù)據(jù)類型的改動(dòng)是 VFP 8 里增加的 Integer 字段的自動(dòng)增長(zhǎng),而它也并非是一個(gè)新的數(shù)據(jù)類型。
    由于一些其它的數(shù)據(jù)庫(kù)引擎,比如 SQL Server,支持范圍很廣的多種數(shù)據(jù)類型,VFP 不得不將這些數(shù)據(jù)類型映射到它自己的少量數(shù)據(jù)類型中。有時(shí)候,這種映射實(shí)在不夠完美。VFP 9 通過(guò)增加了三種數(shù)據(jù)類型來(lái)幫助解決這個(gè)問(wèn)題。
    Varchar
    第一種新數(shù)據(jù)類型是 Varchar。Varchar 其實(shí)并不是一種新數(shù)據(jù)類型;本質(zhì)上它不過(guò)是沒(méi)有加上填補(bǔ)上空格的字符型而已。Varchar 的單字符縮寫是“V”。
    由于 DBF 結(jié)構(gòu)沒(méi)有重大的改動(dòng)(盡管新的數(shù)據(jù)類型對(duì)結(jié)構(gòu)有一些影響;參見(jiàn)本章中后面部分的“新的數(shù)據(jù)類型是如何影響 DBF 文件的”一節(jié)),Varchar 字段其實(shí)是作為固定長(zhǎng)度的字段儲(chǔ)存的。不過(guò),當(dāng)你訪問(wèn)一個(gè) Varchar 字段的時(shí)候,它的值將先被trim 過(guò),而不是填補(bǔ)空格以使得它的長(zhǎng)度等于字段的長(zhǎng)度。狐社
    這是一個(gè)從 TestVarchar.PRG 中拿來(lái)的例子,它建立一個(gè)帶有一個(gè) Varchar 字段的游標(biāo),并演示其跟 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 字段中包含有三個(gè)空格,特別指定要包含在值中的空格在被儲(chǔ)存到字段中去時(shí)是被認(rèn)為有意義的。
    VFP 9 增加 Varchar 以更好的為其它象 SQL Server 這樣支持這種數(shù)據(jù)類型的數(shù)據(jù)庫(kù)提供支持。例如,在 VFP 8 中,如果你建立了一個(gè)來(lái)自包含有 Varchar 字段的 SQL Server 表的遠(yuǎn)程視圖,然后使用 TABLEUPDATE() 來(lái)將改動(dòng)寫入到 SQL Server 中去,在被更新記錄中的 Varchar 字段將被填補(bǔ)上空格,因?yàn)檫@些空格存在于 VFP 8 視圖中。在 VFP 9 做同樣的事情會(huì)得到期望的結(jié)果:Varchar 字段不會(huì)被填補(bǔ)上空格。
    TestVarcharWithSQLServer.PRG 對(duì)此做了演示。它打開(kāi)在 Test 數(shù)據(jù)庫(kù)中的一個(gè)基于 SQL Server Northwind 示例數(shù)據(jù)庫(kù)的 Customers 表的視圖。在該表中的 CompanyName 字段被定義為 Varchar,但視圖把它定義為 Character。更新這個(gè)表會(huì)強(qiáng)制用空格填補(bǔ)字段后再放入數(shù)據(jù)庫(kù)中。將視圖中的這個(gè)字段數(shù)據(jù)類型改為 Varchar、并再次更新這個(gè)表就會(huì)去掉多余的空格。
    * 連續(xù)到 SQL Server Northwind 數(shù)據(jù)庫(kù)。根據(jù)你的情況改動(dòng)連接串
    lnHandle = sqlstringconnect('driver=SQL Server;server=(local);' + ; 'Database=Northwind;trusted_connection=yes;') if lnHandle < 1 return endif lnHandle < 1
    * 打開(kāi)示例數(shù)據(jù)庫(kù)
    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
    * 現(xiàn)在將 CompanyName 定義為 Varchar后再做一次。 * 可以看到第一條記錄中由于我們剛才保存的改動(dòng)而有著多余的空格
    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