XML是一種在網路上用來描述與傳遞的標準語言,就跟 HTML 是用來建立並顯示網頁的標準語言一樣.
XML使用標籤和屬性來界定資料,並且完整的保留資料原有的解釋讓應用程式去閱讀.
為了盡可能的要讓你更容易的利用XML來實作資料交換,VFP提供如下的新函數和功能:
CURSORTOXML( ) 將一個Cursor轉換成XML.
XMLUPDATEGRAM( ) 從一個有被變更過的工作區或cursor建立一個XML更新語法.
XMLTOCURSOR( ) 將XML資料轉換成Cursor或資料表格.
以上轉譯自 VFP7 提供的輔助說明.
以下就簡單介紹用法,但詳細用法,仍請參照輔助說明.
CursorToXML()
直接把工作區的資料轉換為一個xml檔案
舉例來說
CursorToXML(“LABELS”, “myXMLFile.xml”, 1, 512, 0, ;
“mySchema.xsd”, “http://www.microsoft.com/mySchema.xsd”)
這一行就是說把 LABELS 這個工作區的資料,轉換為 myXMLFile.xml
1 的意思就是Element-centric XML ,轉換為以元素為主的XML.
512 是表示第二個參數是一個檔案
0 則是設定編碼原則
“mySchema.xsd” 則是轉出後的規則檔
“http://www.microsoft.com/mySchema.xsd” 則是表示規則要參照 www.microsoft.com 上的 mySchema.xsd
XMLTOCursor()
就是把xml檔案轉換為一個工作區,注意:目前工作區若有開啟檔案,將會被關閉!
XMLToCursor(“myXMLFile.xml”,”LABELS”)
XMLUpdateGram()
這是一個很有用的函數,使用前,你必須先把目前的buffering開啟
它主要是把目前工作區有被變更過的資料轉變為 xml
只有變更過的才會喔~
於是可以聯想到,資料在Client被處理完,可以只把有被變更過的傳回Server
大大減低網路的負荷,並且提昇速度喔
之後就可以利用 xmltocursor() 函數來處理
Build Library How-to
程式碼
======
假設 main() 呼叫 iloveso() 這個函式,而且程式分開的話,程式碼就會像這樣子:
callso.c
#include <stdio.h>
void iloveso(void);
int
main(void)
{
printf(“\nmain() begin\n”);
iloveso();
printf(“main() end\n”);
}
iloveso.c
#include <stdio.h>
extern void iloveso(void);
void
iloveso(void)
{
printf(“here is so!!\n”);
}
一般做法
========
一般的情況下,我們會這樣去編譯程式
gcc callso.c iloveso.c –o callso
編譯出來後,直接執行 ./callso 就可以執行程式了。
靜態連結
========
因為 iloveso() 這個函式,其他程式也可能會使用到,我們希望把他獨立出來,這樣子,別人就可以直接連結他,而不需要重新編譯一次。
我們可以先編譯為 obj 檔之後,再利用 ar 指令,將 obj 檔變為 .a (靜態library) 檔。
再執行Ranlib 以確保 .a 檔能跟 unix 相容。
gcc -c iloveso.c -o iloveso.o
ar rcv libiloveso.a iloveso.o
ranlib libiloveso.a
為了驗證這樣子是可行的,請先在 /etc/ld.so.conf 最後加上 /usr/local/lib。
接著執行 ldconfig。然後將 libiloveso.a 放到 /usr/local/lib
執行
gcc –o callso callso.c –liloveso
沒有錯誤訊息的話表示成功,請執行 ./callso 試試。
如果有錯誤的話,通常是因為 ld.so.conf 檔案未設定,或設定後未執行 ldconfig 的緣故。
動態連結
========
當有很多程式都使用同一個靜態Library時,每個程式都會將該靜態連結檔給含括進來,所以會造成空間浪費,我們可以利用動態連結避免掉這個缺點。
同樣的,我們可以利用下列的程式來編譯動態連結檔
gcc -shared -Wl,-soname,libiloveso.so -o libiloveso.so iloveso.c -lc
這樣子就直接產出 libiloveso.so 了。
接下來同樣安裝到 /usr/local/lib,確定ld.so.conf有增加/usr/local/lib後,執行 ldconfig,以完成設定。
然後利用如下指令編譯 callso.c
gcc -o callso callso.c –liloveso
這樣就 ok 了,你可以試著用 ldd callso 去驗證一下,是不是真的有連結到。
結論及注意事項
==============
發現了嗎??不管是靜態或動態,程式碼和程式指令都不曾變更過,只有編譯Library 檔時,有些許差別而已。這對程式設計師來說,真是方便很多。
要特別注意的是Library檔必須以 lib 為開頭;另外,當 .a 和.so 同時存在時,gcc 會自動以 .so 作為優先連結對象,若你要強迫gcc作靜態連結,就要在編譯時加上 –static 。
Windows Script Component 與 NT/2000 的安全
摘要:說明 Windows Script Component 與 NT/2000 檔案安全的關係
內容:
下載本文章的範例程式(下載後以滑鼠右鍵點選,然後選擇註冊即可)
前二日,我在使用WSC(Windows Script Component)的時候,發現了很詭異的事情.
這個元件不管是利用VB或是利用Windows Script Host呼叫,都是正常而且可以運作的.
但是在 ASP 中,卻始終無法使用, 我為了這個問題,搞了兩個多小時,才終於搞懂,這個檔案的安全權限必須要加入IUSR_XXXX(IIS訪客)這個使用者才行!
唉唉唉~~
真是難搞的要命,如果各位有遇到難解的問題,不妨檢查一下資料夾以及檔案的安全權限,也許就能迎刃而解了.
呼~~
上面有提到 WSC, 我在這裡也順便說明一下, WSC 是 Microsoft 提出的一個與 Script 相關的技術,它讓我們可以利用 Script
來撰寫COM的元件,你可以參考http://www.microsoft.com/taiwan/products/develop/scripting/,這裡有許多與
Script 相關的技術文件.
本篇文章所附的範例則是來自 Active Server Pages 3.0 深度探索一書中的範例,主要的用處是結合Recordset來產生一個表格,使用方法很簡單:
dim objtbl
set objtbl = server.createobject("asptable.wsc")
objtbl.addcolumn "員工編號","emp_no",""
objtbl.addcolumn "員工姓名","emp_name", ""
obj.gettext()
不過我改寫過了,增加了兩個方法,一個方法是getpagetext(pageno),可以得到第幾頁的Table;另一個則是obj.getstrtext(),取得整個table的html字串.
當然這裡寫的還不是清楚,以後再來補吧 ^_^
Active Server Pages 3.0 深度探索(國外出版社Wrox,國內則是由碁峰翻譯後發行)
What is an Interface
What is an iterface?(什麼是介面)?
在英文裡面,一個介面(Interface)是一組用來與不相干實體互動的設備或系統.根據這個定義,一個遙控器是一組介於你和電視的介面,英文是一組介於兩個人之間的介面,在軍隊中的行為協定是一組在不同階級的人之間的介面.在Java語言中,一組介面是一個與不相干物件互動的設備.一組介面大致可以比擬為一個協定(在行為上的允許).實際上,其他物件導向語言也有介面的功能,但他們稱他們的介面為協定.
腳踏車類別和他的後繼類別定義了一部腳踏車在騎的時候可以做什麼和不可以做什麼,但不包括腳踏車在其他期間與世界的互動.舉例來說,在店裡的一部腳踏車可以被一個庫存程式來管理.一個庫存程式不管物品是什麼類別的,他只要每個物品提供確切的資訊,像是價錢和追蹤號碼,就能管理.取代在其他不相關聯的物品上作強制類別關聯的做法是,庫存程式初始化了一個通訊的協定.這個協定引入常數和函式的集合,包含在一個介面之中.庫存介面將會被定義,但不是實作,裡面的方法將會被用來設定和取得零售價錢,給予一個追蹤號碼等等.
在庫存程式裡作業時,腳踏車類別必須藉著實作這個介面以同意這個協定.當一個類別實作一個介面,這個類別就需要實作在介面中定義的所有方法.例如,腳踏車類別將提供設定和取得零售價格,給予一個追蹤號碼等方法的實作.
使用一個介面去定義一個行為的協定,以用來被任何類別來實作.介面在以下情況是非常有用的:
.在沒有關聯的類別中找到相似點,而不需要強制給予類別的關係.
.定義一個或多個類別預計要實作的方法.
.不需要顯露出物件的類別,就能顯露他的程式化介面.
Internet Transfter Control的聯想
摘要:對於 Internet Transfer Control 元件的一個聯想
內容:
下載本文章的範例程式: ASP端 Client端
(均為自動解壓縮檔)
請將下載下來的 ASPCODE.EXE 解壓縮,放到 WEB Server 的某個資料夾 上, 然後在 IIS 中開啟一個虛擬目錄,對應到此資料夾.
而 INETCTRL.EXE 解壓縮後就放在 client 端執行,只是可能要改一下程式!!你需要在 Query Customer Informat 那個按鈕的click事件中作修正.
請原諒我沒有作詳細的說明,主要是因為程式中已經有說明了.
另外需要注意的是,WEB Server 必須要安裝 ADO 2.5
以上版本,另外要有裝 IE5.0以上版本, client 端的需求也是一樣!!
某天,我在 Microsoft Newsgroup上看到一個Inetctrl 元件的應用範例
以前都沒想到可以用這個 Active X元件
挺有趣的
所以就動手寫了一個小程式,配合 ASP 做了一個有趣的應用
ASP 負責在 WEB Server 上 抓資料,並產生 XML
VFP 程式利用 Inetctrl 元件對 ASP 送指令,並取得 XML, 再轉換為 Recordset
於是就可以用啦!!
但是修改後的資料要怎麼送回去呢??
我在 post 的按鈕裡面已經寫了一部份了
到底在 ASP 程式還要作怎樣的配合才能把資料送回去?!
Active Server Pages 3.0 深度探索(國外出版社Wrox,國內則是由碁峰翻譯後發行)
® 2001ellery寫的!!引用時,請加註出處!!謝謝~
SQL pass-through的使用
在VFP所附的範例或者是微軟的建議中,都一直有看到這方面的函數。
事實上,這些函數對於遠端資料的控制來說是很方便的。
如果經過適當包裝的話,就非常類似於Delphi或BCB的TQuery元件或TStoreProc元件,
有看過Delphi或BCB的人可以自行比較一下。
但是偏偏市面上的書對於這個部分如何使用…等都略過不提。
在這裡,提出一個範例供大家研究一下,略盡棉薄之力 。
p.s. Arsen=Ellery, And this article is co-write with Saint.
————————————————————————————————————
*使用SPT更新表格的範例 *作者:Arsen(Ellery) *環境:在ODBC設定中,我設了fpm這個別名,路徑設到目錄下的foreign.dbc Local ln_handle *先連接 ln_handle=sqlconnect("fpm") *執行查詢 =sqlexec(ln_handle,"select emp_no,name from basic","_basic") *設定相關屬性:這幾個屬性必須設定,在MSDN上有詳細說明(記得多看MSDN) =cursorsetprop("tables","basic") &&設定欲更新的資料表格 =cursorsetprop("sendupdates",.t.,"_basic") &&確定要進行更新 =cursorsetprop("keyfieldlist","emp_no","_basic") &&要依據何鍵值來進行更新 =cursorsetprop("updatablefieldlist","emp_no,name","_basic") &&哪些欄位要更新 *以下這行,比較複雜一點,空格前寫的是上一行的欄名,後面寫的是資料表格的欄名(要用alias.field這樣) =cursorsetprop("updatenamelist","emp_no basic.emp_no,name basic.name","_basic") Replace Next 1 alltrim(name) with alltrim(name)+"Test" use *釋放連接 =sqldisconnect(ln_handle)
————————————————————————————————————
首先,謝謝Arsen,幫我解決了想了好久無法解決的問題。
其實,我的作法和他,並無很大的不同,只有這一行
=cursorsetprop(“updatenamelist”,”emp_no basic.emp_no,name basic.name”,”_basic”)
由於資料集預設的BUFFERING是3,所以只要移動記錄指標便會做存檔的動作
為了Client/Server效率上的考量,改用
=CURSORSETPROP(“BUFFERING”,5)
似乎是比較好的選擇。
另外附上另一份範例如下:
?sqldisconnect(0) ?sqlconnect("testdbc") _sqlsele="sele * from mydbf" =sqlexec(1,_sqlsele ,"myview") ?cursorsetprop("buffering",5) REPLACE NAME WITH "TEST" =cursorsetprop("tables","mydbf","myview") =cursorsetprop("keyfieldlist","id","MYVIEW") =cursorsetprop("updatablefieldlist","name","MYVIEW") =cursorsetprop("sendupdates",.t.,"MYVIEW") *=cursorsetprop("updatenamelist","ID MYDBF.ID,name MYDBF.name")&&這一行指令,有興趣的人可以比較 =cursorsetprop("updatenamelist","ID MYDBF.ID,name MYDBF.name") &&註解前和註解後有何差別 IF NOT TABLEUPDATE(.T.,.T.,"MYVIEW") =AERRO(MYERROR) CLEAR ?MYERROR(1) ?MESSAGE() ENDIF
另外附上其他的做法,一檥可做到,請自行參考
AA=sqlconnect("testdbc") IF AA>0 =SQLSETPROP(AA,"ASYNCHRONOUS",.F.) =SQLSETPROP(AA,"BATCHMODE",.T.) =SQLEXEC(AA,"sele * from mydbf","myview") M.SQLDESC="UPDATE ...." &&請參考 SQL INSERT,UPDATE 語法" =SQLEXEC(AA,M.SQLDESC) &&把指令送到後端讓Server去執行 ENDIF
VFP的認證測驗
VFP的認證測驗,主要測驗的是設計和實作分散式應用程式的解決方案。
在測驗之前,你必須要熟練以下列出的內容:
發展概念和邏輯規劃(Developing the Conceptual and Logical Design)
- 將資料分組為實體,並且為它們正規化。
- 在實體之間指定關聯。
- 選擇能在實體間進行關聯並且擔保指示一致性(Referential Integrity)的外來鍵(Foreign key)。
- 辨識出關聯到資料一致性(Data Integrity)的商業規則(Business rules)。
- 將商業規則和限制(Constraint)混合到資料模型中。
- 給予狀況以決定非正規化是否恰當。
衍伸出實體規劃
審慎評估邏輯規劃中對效率、維護、可伸展性和可利用性潛在的影響。需要考慮的部分包括COM、DCOM和中間層(middle tier)。
- 發展VFP元件從資料庫中存取資料。
- 規劃元件的屬性(Properite)和方法(Method)。
- 規劃類別庫。考慮的部分包含繼承、封裝、容器(containership)、委任(delegation)和多形。
完成發展環境
- 完成原始程式碼版本控制的環境。
- 為發展分散式應用程式安裝並設定VFP。
- 完成發展環境以執行MTS(Microsoft Transaction Server)、IIS(Inter Information Server)和MSMQ(Microsoft Message Queue Server)。
建立使用者服務
- 實作方向(navigational)規劃
- 建立選單。
- 增加一個快捷選單(shortcut menu)到應用程式中。
- 增加控制項(controls)到表單(forms)中。
- 為控制項設定屬性。
- 為控制項指定程式碼以回應一個事件。
- 建立一個工具列。
- 運用控制項顯示、操作和連結資料。
- 在執行時期(runtime)新增、刪除和操作控制項。
- 使用表單集合( Forms collection)以在執行時期操作表單。
- 給予一個狀況,增加程式碼到適當的表單事件中。這些事件包含Init、Destroy、Load、Unload、QueryUnload、Activate、Deactivate。
- 設定恰當的屬性以讓使用者容易瞭解該屬性的用處。求助內容包括求助檔、HelpContextID(求助檔中作為指定訊息或文章的編號)和WhatsThisHelp。
- 為一個應用程式建立HTML Help。
- 辨識並捕捉執行時期錯誤。
- 處理行間錯誤(inline errors)。
- 提示使用者錯誤訊息。
建立並管理COM元件
- 建立一個實作了商業規則或邏輯的COM元件。
- 建立一個和其他COM元件溝通的COM元件。
- 為一個COM元件增加錯誤處理。
- 為了要錯誤處理和除錯,將錯誤記錄下來到一個錯誤檔中。
- 規劃並建立給MTS使用的元件。
- 讓一個COM元件支援交易處理。
- 為一個COM元件建立適合的伺服器類型(Server type)。類型有in-process、out-of-process和multithreaded。
- 使用MTS Explorer來建立和管理套件。
- 將原件增加到一個MTS套件中。
- 利用使用者權限指定使用者只能限制使用某個MTS套件。
- 使用元件陳列庫去管理元件。
- 註冊和解除註冊一個COM元件。
建立資料服務
- 使用ADO和RDS存取和操作資料。
- 使用VFP的原生資料處理和查詢能力(Query capabilities)(包含Local View)來存取和操作資料。
- 使用SQL pass-through存取和操作資料。
- 使用遠端資料集(Remote views)和本地資料集(Local views)來存取和操作資料。
- 管理資料庫交易以確保資料一致性和可復原性。
- 撰寫能取得和變更資料的SQL敘述。
- 撰寫使用連結(join)來從多個資料表格連結資料的SQL敘述。
- 撰寫能建立資料集(views)的SQL敘述。
- 使用適合的鎖定和緩衝策略。策略包括悲觀(pessimistic)、樂觀(optimistic)、列和表格。
- 建立和操作一個VFP stored procedure。
- 建立並實作VFP trigger。
- 從其他外在的資料來源匯入資料。
- 撰寫能更新及變更資料的SQL敘述。
建立實體資料庫
- 以程式來建立和維護VFP的資料庫。
- 規劃、建立和實作資料庫和資料表格。包含了資料一致性(Data Integrity)、參考完整性(Referential Integrity)和正規化(Normalization)。
- 選擇並規劃一個索引策略。考慮最佳化(經由Rushmore)和索引維護。
- 建立並維護索引。考慮最佳化(經由Rushmore)、程式化的操作、視覺化的操作和索引維護。
測試並除錯
- 決定適合的除錯技巧。
- 辨識和描述測試計劃的要素。要素包括beta的測試、回歸測試(Regression testing)、單元測試(unit testing)、整合測試(integration testing)和重點測試(stress testing)。
- 給予一個狀況,選擇適當的建立選項。(此處應是指在專案管理員裡按下建立後的一些選項)
- 在應用程式中使用條件編譯。(此處應是指#ifdef、#ifndef…等指令的應用)
- 使用除錯視窗(Debug Window)監控運算式和變數的值。
- 使用即時運算視窗(Immediate window)來檢查或變更值。
- 使用監看視窗(Watch window)來檢查或變更值。
- 使用呼叫堆疊視窗(Call stack Window)來尋找錯誤。
- 在應用程式中使用 Asserts。
- 使用涵蓋分析工具應用程式來辨識效率瓶頸(Performance bottlenecks)和程式碼涵蓋範圍(Code coverage)。
- 使用事件追蹤來確定事件發生的順序。
- 設定中斷點以除錯應用程式。
散發應用程式
- 使用安裝程式精靈去建立一個能安裝分散式應用程式、註冊COM元件並容許反安裝的安裝程式。
- 註冊一個實作DCOM的元件。
- 為客戶端電腦(Client computer)和伺服器端電腦(Server computer)設定DCOM。
- 為客戶端電腦設定以使用一個MTS元件,並且為客戶端電腦及伺服器端電腦設定遠端自動化(Remote automation)。
- 為一個分散式應用程式計劃並實作以軟式磁碟機或CD為基礎的散發程式。
- 為一個分散式應用程式計劃並實作以Web為基礎的散發程式。
- 為一個分散式應用程式計劃並實作以網路(Network)為基礎的散發程式。
為應用程式提供維護和支援
- 為災難復原程序提出計劃並實作之。
- 修正錯誤並提早評估以預防未來的錯誤。
- 維護異常的報告。
- 為分散式應用程式散發應用程式更新。
Step by Step 用 C# 做出一個 GUI 的應用程式
這是我在 MSDN 網站上,看到的一篇文章
這篇文章一步一步的引領你如何使用 C# 來寫作 GUI 應用程式.
我覺得很實用
http://msdn.microsoft.com/library/en-us/dnmag01/html/winforms.asp
這篇文章主要是假設你有 Visual Studio.Net beta 1 整合開發環境來引領的
不過如果沒有 vs.net beta 1 的話,可以用 .Net Framework beta 1 來實作
如果使用 .Net Framework beta 2 的話,有幾點要注意:
1.編譯時所引用的 Dynamic Link Library 有變化
這是文章所建議的編譯方法,即 beta 1:
csc /target:winexe /out:Hello.exe /reference:System.dll
/reference:System.WinForms.dll /reference:System.Drawing.dll
/reference:Microsoft.Win32.Interop.dll Hello.cs
beta 2 的編譯方法改變了, 以下是我試出來的結果:
csc /target:winexe /out:Hello.exe /reference:System.dll
/reference:System.Windows.Forms.dll /reference:System.Drawing.dll Hello.cs
主要是 beta 2 將 DLL 的架構做了一些調整
2.using 的架構:
beta 1 是
using System;
using System.WinForms;
using System.Drawing;
而 beta 2 是
using System;
using System.Windows.Forms;
using System.Drawing;
其實這邊主要是跟 1 有關係,在beta 1 你可以試著尋找 System.WinForms.dll, 你將會發現有這麼一個檔案;但是在 beta 2 中卻沒有, beta 2 中只有System.Windows.Forms.dll.
3.MessageBox 類別有變化,其實應該也是因為架構調整的關係吧
beta 1:
MessageBox.Show (String.Format (“{0} is not ” +
“a valid image file”, fileName), “Error”,
MessageBox.OK | MessageBox.IconError);
beta 2:
MessageBox.Show (String.Format (“{0} is not ” +
“a valid image file”, fileName), “Error”,
MessageBoxButtons.OK,MessageBoxIcon.Error);
其他應該還有很多有所調整, 可能要參考 .Net Framework 的說明才能得知囉.
[Tip]2001/09/03
如何偵測一個服務(Service)存在~
http://support.microsoft.com/support/kb/articles/Q295/8/40.asp?SD=MSDN&FR=0
使用 http://msdn.microsoft.com 時
可以試著輸入
howto 加上 kbvfp600 或 kbvfp500 來搜尋
會在knowledge base 中找到許多 tips
如何使用 M$ Agent
http://support.microsoft.com/support/kb/articles/Q191/9/50.ASP
如何找到已安裝的 Modems
http://support.microsoft.com/support/kb/articles/Q291/5/35.asp