談談VFP和SQLSERVER搭配做C/S系統(tǒng)

字號:

1.CLIENT/SERVER 到底是什么?
    C/S屬于2-TIER系統(tǒng),適合于中小型應用系統(tǒng)。大系統(tǒng)一般都用3-TIER了。
    打個比方單機數(shù)據(jù)庫系統(tǒng)(比如VFP), 相當于前店后庫.店里需要什么東西,得自己去庫房找,庫房管理也是有你自己進行. 而C/S系統(tǒng)下,店和庫是相對獨立的,有一個專門的庫房管理(數(shù)據(jù)SERVER),店里需要什么,按照手續(xù)把單子給
    庫房管理人員,由他們去操作.
    因此可以看出C/S的優(yōu)點: 支持多用戶; 更有效的數(shù)據(jù)管理,數(shù)據(jù)安全和可靠得多;遠程使用數(shù)據(jù).
    如果你是單機使用當然沒有太大必要使用C/S了.
    如果用VFP本身做C/S系統(tǒng), 效果不是很明顯,因為VFP的數(shù)據(jù)管理功能不是很強,比如加鎖解鎖都需要程序來操作. 我主要說的是VFP/SQL SERVER系統(tǒng).
    2. SQL SERVER
    SQL SERVER是微軟發(fā)布的RDBMS(關系數(shù)據(jù)庫管理系統(tǒng)), ORACLE, INFOMIX,POWERBUILD,也都是類似的系統(tǒng). 他們就相當于倉庫的管理系統(tǒng),但功能不僅僅是數(shù)據(jù)管理. 微軟的數(shù)據(jù)庫產品從功能和規(guī)模由小到大排列依次是: ACCESS, VFP, SQL SERVER.
    稍微大一點的系統(tǒng),SQL SERVER是需要專人管理的,這就是DBA (DATABASE ADMINISTRATOR)的位置.現(xiàn)在北美人才市場上, DBA的工作比程序員的工作好找些. 工資比普通程序員略高, 工作穩(wěn)定性也強一些.
    SQL SERVER是一套大的軟件系統(tǒng),可以安裝在專門的NT數(shù)據(jù)SERVER上,也有個人版可以安裝在WIN95/98上, 主要是為了咱們這些程序員方便測試. 它的功能主要有這么幾塊: 數(shù)據(jù)庫的管理和維護,用戶/安全管理, 數(shù)據(jù)的發(fā)布/轉換.
    3. 用VFP/SQL SERVER做C/S系統(tǒng)
    VFP和SQL SERVER的搭配應該是比較完美的, 但因為VB才是微軟的主流產品(VB一直是微軟的,FOXPRO是后來才買的,后娘生的), 所以微軟從來沒有大力推薦或者宣傳過VFP, 而是把VFP獨有的數(shù)據(jù)庫技術融合到自己的其它產品里了: SQL SERVER, ODBC, OLE DB/ADO. 最近甚至把VFP從VISUAL STUDIO里獨立出來了.
    VFP和SQL SERVER的交流,可以通過3種方式進行:
    A. 遠程視圖 B. ADO控件 C. SPT (SQL PASS THROUGH)
    3種方式各有優(yōu)缺點, 而我最偏好第3種. 遠程視圖和ADO都在VFP和SQL SERVER中間加了一個層次, 而這層次就相當于一個黑箱,你不清楚它們到底怎么操作數(shù)據(jù)的,只需按照它們的規(guī)則進行設置,使用
    相應的命令就可以. 反正我作為程序員,喜歡清楚地知道我的程序每一步都在干什么,所以我喜歡用SPT, 也從不用向導來建立表單報表一類的.
    SPT技術是通過VFP的函數(shù)SQLCONNECT()來和SQL SERVER建立連接, 然后用SQLEXEC()函數(shù)把要執(zhí)行的SQL命令 送到SQL SERVER上去執(zhí)行,
    所有對數(shù)據(jù)的操作都是通過這些SQL命令來進行的. 每一個細節(jié)都由自己的代碼來控制.
    4. VFP數(shù)據(jù)的升遷
    VFP的數(shù)據(jù)庫,可以直接用VFP自帶的升遷向導轉到SQL SERVER上,但必須把所有的表都放到數(shù)據(jù)庫里,自由表不能直接升遷, 而實際上升遷上去的又只是表,數(shù)據(jù)庫本身不能轉到SQL SERVER里. 感覺怪怪的. 也許是為了升遷索引或者關系吧.
    要把VFP數(shù)據(jù)升遷到SQL SERVER上, 必須先在SQL SERVER里建立相應的數(shù)據(jù)庫. SQL SERVER的管理是通過ENTERPRISE MANAGER (EM)來進行的. 通過它建立數(shù)據(jù)庫, 每個數(shù)據(jù)庫里可以包含 數(shù)據(jù)表,用戶/用戶群,視圖,存儲過程等等.
    至于改用SQL SERVER后,原來的VFP程序是肯定需要修改的, 而且是比較大的改動.
    ***************
    談談VFP和SQL SERVER搭配做C/S系統(tǒng) (二) --動態(tài)設置ODBC連接
    1。設置ODBC數(shù)據(jù)源
    VFP和SQL SERVER的連接是通過ODBC或者OLE DB(ADO)來進行的??梢源蜷_控制面板的ODBC數(shù)據(jù)源進行設置。但很多情況下,我們希望能在程序里動態(tài)設置數(shù)據(jù)源,一來可以不用去為每個用戶的機器手動設置, 二來為了數(shù)據(jù)的安全性,使用完后,希望把ODBC數(shù)據(jù)源刪掉。
    下面的例子是用API函數(shù)來設置和刪除ODBC數(shù)據(jù)源。
    函數(shù)名字是 SQLConfigDataSource,其中第二項參數(shù)是數(shù)字(1-增加 2-修改 3-刪除)
    DECLARE INTEGER SQLConfigDataSource IN odbccp32 INTEGER, INTEGER, STRING, STRING
    lnWindowHandle=0
    lcODBCDriver=’SQL Server’ &&DRIVER類型
    lcODBCName=’SharedData’ &&數(shù)據(jù)源名字
    lcODBCDesc=’Shared Data Source’ &&數(shù)據(jù)源描述
    lcODBCServer=’DEVSQL’ &&SQL SERVER名字
    lcODBCDatabase=’Shared’ &&要連接的數(shù)據(jù)庫名字
    **先試圖修改已有的ODBC,如果不存在,返回0。
    lreturn=SQLConfigDataSource(lnWindowHandle, 2, lcODBCDriver, ;
    ’DSN=’ + lcODBCName + CHR(0) ;
    + ’Description=’ + lcODBCDesc + CHR(0) ;
    + ’Server=’ + lcODBCServer + CHR(0) ;
    + ’Database=’ + lcODBCDatabase + CHR(0))
    IF lreturn=0 &&不存在
    **添加新的ODBC
    lreturn=SQLConfigDataSource(lnWindowHandle, 1, lcODBCDriver, ;
    ’DSN=’ + lcODBCName + CHR(0) ;
    + ’Description=’ + lcODBCDesc + CHR(0) ;
    + ’Server=’ + lcODBCServer + CHR(0) ;
    + ’Database=’ + lcODBCDatabase + CHR(0))
    IF lreturn=0 &&失敗
     MessageBox(’添加ODBC數(shù)據(jù)源失敗’,16,’BUFFER’)
    ENDIF
    ENDIF
    2。刪除ODBC數(shù)據(jù)源
    **用完后,可以在表單DESTROY事件里刪除ODBC。 如果不想重復設置參數(shù),可以把這些參數(shù)加到表單作為屬性。
    DECLARE INTEGER SQLConfigDataSource IN odbccp32 INTEGER, INTEGER, STRING, STRING
    lnWindowHandle=0
    lcODBCDriver=’SQL Server’
    lcODBCName=’SharedData’
    lcODBCDesc=’Shared Data Source’
    lcODBCServer=’DEVSQL’
    lcODBCDatabase=’Shared’
    **先修改,或者其是否存在
    lreturn=SQLConfigDataSource(lnWindowHandle, ;
     2, lcODBCDriver, ;
     ’DSN=’ + lcODBCName + CHR(0) ;
     + ’Description=’ + lcODBCDesc + CHR(0) ;
     + ’Server=’ + lcODBCServer + CHR(0) ;
     + ’Database=’ + lcODBCDatabase + CHR(0))
    IF lreturn=1 &&ODBC存在,刪除它
     lreturn=SQLConfigDataSource(lnWindowHandle, ;
     3, lcODBCDriver, ;
     ’DSN=’ + lcODBCName + CHR(0) ;
     + ’Description=’ + lcODBCDesc + CHR(0) ;
     + ’Server=’ + lcODBCServer + CHR(0) ;
     + ’Database=’ + lcODBCDatabase + CHR(0))
     IF lreturn=0
     MessageBox(’刪除ODBC源失敗,16,’BUFFER’)
     ENDIF
    ENDIF