天天看點

VFP CS模式操作資料庫,三行極簡代碼搞定它

MSSQLhelper 是執行SQL指令的封裝類,,封裝了常用的資料庫操作。

特點是:無需管連接配接,可以擷取執行失敗的錯誤資訊。無使用者互動界面打斷程式,CS BS模式都可使用。

很多狐友寫程式喜歡用SQLEXEC,執行失敗就籠統提示執行失敗,而不會去跟蹤和處理錯誤,這是要不得的。

以下的示例所使用的資料表來自于MSSQL的NorthWind資料庫

開發工具:VFP SP2 7423 +祺佑三層開發架構(貓框)

一:進行賬套管理配置好連接配接參數。

VFP CS模式操作資料庫,三行極簡代碼搞定它

二:打開指令視窗執行如下指令

1 資料查詢 SQLQuery方法

參數:SQL語句,遊标名

傳回表:傳回查詢的遊标

傳回值:>=0 傳回查詢記錄數, <0 表示查詢出錯

錯誤資訊:存放于類的errmsg屬性

*-- 查詢雇員表
oDBSQLhelper=NEWOBJECT("MSSQLHelper","MSSQLHelper.prg")
nRow=oDBSQLhelper.SQLQuery("select * from Employees","Employees")
if nRow<0
 ?oDBSQLhelper.errmsg
endif
BROWSE           

複制

2 資料查詢 GetSingle 傳回單個值

參數:SQL語句

傳回值:傳回資料的第一行第一列資料,null 且 errmsg不為空說明查詢出錯。

*-- 查詢雇員表記錄數
oDBSQLhelper=NEWOBJECT("MSSQLHelper","MSSQLHelper.prg")
?oDBSQLhelper.GetSingle("select count(*) from Employees")           

複制

3 執行非查詢SQL指令 ExecuteSQL方法

參數:SQL語句

傳回值:>=0 傳回影響記錄數, <0 表示查詢出錯

*--插入或修改記錄
*--傳回影響的記錄數
oDBSQLhelper=NEWOBJECT("MSSQLHelper","MSSQLHelper.prg")
?oDBSQLhelper.ExecuteSQL("update Employees set LastName='123' where EmployeeID=1")
           

複制

4 得到字段列的最大值GetMaxID方法 (MYSQL等其它資料庫未測試)

參數: 字段名,表名

oDBSQLhelper=NEWOBJECT("MSSQLHelper","MSSQLHelper.prg")
?oDBSQLhelper.GetMaxID("EmployeeID","Employees")           

複制

5 判斷某個字段是否存在 ColumnExists方法(MYSQL等其它資料庫未測試)

參數: 字段名,表名

傳回值:邏輯值

oDBSQLhelper=NEWOBJECT("MSSQLHelper","MSSQLHelper.prg")
?oDBSQLhelper.ColumnExists("EmployeeID","Employees")           

複制

6 執行多個語句

需打開程式PRG或表單中進行測試

TEXT TO lcSQLCmd NOSHOW TEXTMERGE
UPDATE LSNBBM SET LSNBBM_DQNM=LSNBBM_DQNM+1 WHERE LSNBBM_NMBH = 'XSFPLS'
SELECT LSNBBM_DQNM FROM LSNBBM WHERE LSNBBM_NMBH = 'XSFPLS'
ENDTEXT
oDBSQLhelper=NEWOBJECT("MSSQLHelper","MSSQLHelper.prg")
lclsh=oDBSQLHelper.GetSingle(lcSQLCmd)           

複制

三、參數傳遞的三種方式

1 private 聲明變量,即可以用?傳遞參數

private myvar
myvar = "張三"
lcSQLCmd="select * from username where username=?myvar"
oDBSQLhelper=NEWOBJECT("MSSQLHelper","MSSQLHelper.prg")
nRow=oDBSQLhelper.SQLQuery(lcSQLCmd,"Employees")
if nRow<0
 ?oDBSQLhelper.errmsg
endif
BROWSE           

複制

2 利用Text to 拼接參數,支援多變量

myvar = "張三"
TEXT TO lcSQLCmd NOSHOW ADDITIVE TEXTMERGE PRETEXT 1+2
select * from username where username="<<myvar>>"
ENDTEXT
oDBSQLhelper=NEWOBJECT("MSSQLHelper","MSSQLHelper.prg")
nRow=oDBSQLhelper.SQLQuery(lcSQLCmd,"Employees")
if nRow<0
 ?oDBSQLhelper.errmsg
endif
BROWSE           

複制

3 利用StringFormat拼接參數,支援多變量

lcwhere=StringFormat("name='{2}' And 機關名稱='{1}'","北京","張三")
lcSQLCmd="select * from username where "+lcwhere
oDBSQLhelper=NEWOBJECT("MSSQLHelper","MSSQLHelper.prg")
nRow=oDBSQLhelper.SQLQuery(lcSQLCmd,"Employees")
if nRow<0
 ?oDBSQLhelper.errmsg
endif
BROWSE           

複制

四、傳遞自定義連接配接句柄複用句柄

1 多賬套通過賬套名選擇建立連接配接

ocon=Newobject("qiyu_connection","qiyu超類","","jcbg")  &&第四個參數為賬套名
ncon=ocon.createcon()  &&根據指定賬套建立連接配接句柄
oDBSQLhelper=NEWOBJECT("MSSQLHelper","MSSQLHelper.prg","",nCon)
*--執行SQL
oDBSQLhelper.SQLQuery(lcSQLCmd,"Employees")           

複制

2 自行建立的句柄

nCon=您自己建立的資料庫連接配接句柄
oDBSQLhelper=NEWOBJECT("MSSQLHelper","MSSQLHelper.prg","",nCon)
*--執行SQL
oDBSQLhelper.SQLQuery(lcSQLCmd,"Employees")             

複制

五、待更新(Furture)

MSSQLHelper 執行個體化(Newobject)時可以直接傳賬套名,自動建立連接配接