1. 程式人生 > >在易語言中呼叫MS SQL SERVER資料庫儲存過程(Transact-SQL)方法總結

在易語言中呼叫MS SQL SERVER資料庫儲存過程(Transact-SQL)方法總結

作者:liigo

日期:2010/8/25

  Microsoft SQL SERVER 資料庫儲存過程,根據其輸入輸出資料,籠統的可以分為以下幾種情況或其組合:無輸入,有一個或多個輸入引數,無輸出,直接返回(return)一個值,通過output引數返回一個或多個值,返回一個記錄集(recordset)。無論哪一種情況,無論輸入輸出引數多複雜的儲存過程,都可以在易語言中正確呼叫,準確的傳入引數,並獲取正確的輸出資料。下面我(liigo)分多種情況介紹在易語言中呼叫MS SQL SERVER資料庫儲存過程的詳細方法,使用資料庫操作支援庫(eDatabase.fne)。此前多有人說易語言無法呼叫資料庫儲存過程,或諮詢呼叫儲存過程的方法,因成此文。

一、呼叫“無輸入輸出資料”的儲存過程

  這是最簡單的情況,執行一個簡單的SQL語句就OK了,下面直接給出程式碼:

  其中,“資料庫連線1”是資料庫操作支援庫中“資料庫連線”控制元件的例項,"exec" 表示呼叫儲存過程,"dbproc"為被呼叫的儲存過程的名稱。即使儲存過程有返回值,在不想接收返回值的情況下,也可按這種方法呼叫。

二、呼叫“有一個或多個輸入引數”的儲存過程

  一個輸入引數的情況(其中5為引數值,跟在儲存過程名稱之後,以空格分隔):

  兩個輸入引數的情況(其中3和6為引數值,之間以逗號分隔):

三、呼叫“返回記錄集(recordset)”的儲存過程

  儲存過程最後一條SQL語句為Select語句,通常將返回一個記錄集(recordset)給呼叫者。在易語言中,可通過資料庫操作支援庫中的“記錄集”控制元件接收該記錄集,具體程式碼如下圖:

易語言呼叫MSSQL儲存過程

  核心程式碼就是中間淡黃底色加亮的那一行(記錄集1.開啟),這行程式碼執行成功後,記錄集1內容就是儲存過程返回的recordset內容,通過一個簡單的迴圈語句可以遍歷所有記錄。實際使用中,應檢查“記錄集1.開啟”呼叫是否成功,上圖為簡化起見省略之。

  下文更復雜的情況,也是用大概相同的程式碼,僅中間淡黃底色加亮的那一行有所變化。

四、呼叫“返回記錄集(recordset)且有一個或多個輸入引數”的儲存過程 

  程式碼與前面大致相同,只是調整了中間一行呼叫儲存過程的SQL語句的寫法,前面都有涉及,無需多言:

五、呼叫“直接返回(return)一個值”的儲存過程

   此類返回值相當於易語言子程式的返回值,是在儲存過程程式碼內部使用 return 指令返回的。欲得到這個返回值,稍微有點麻煩,且看程式碼:

  這裡面我(liigo)用了三條SQL語句(嚴格來說是Transact-SQL語句),各語句之間以分號分隔。第一條 "declare @R int" 定義了一個型別為 int 的變數 @R,第二條 "exec @R = dbproc_r" 呼叫儲存過程並把其返回值賦值給變數@R,第三條,"select @R" 生成一個只有一條記錄和一個欄位的記錄集。程式碼執行成功後,讀取 記錄集1 第一條記錄第一個欄位就得到了儲存過程的返回值,完整程式碼可參考前圖。實際應用中,應注意儲存過程返回值型別的匹配。@R改成@abc都無所謂,但@符號必須保留(變數或引數的字首)。

  如果這個儲存過程還有輸入引數呢?直接把引數值附加在儲存過程名稱後面即可,形如:記錄集1.開啟 (“declare @R int; exec @R = xproc_r_p2 3,6; select @R”, #SQL語句, )。

六、呼叫“通過OUTPUT引數返回值”的儲存過程

  儲存過程中有一種output引數既是輸入引數又是輸出引數,它的值可被儲存過程內部改寫。大概相當於易語言子程式的“參考”引數。呼叫程式碼如下:

  仍然是藉助一個變數@P得到輸出引數的值(注意型別要匹配),然後生成一個單記錄單欄位的記錄集,執行成功後通過記錄集1讀取該欄位值即可。呼叫儲存過程的SQL語句 "exec xproc_o @P output" 中,output表示這個引數可以接收返回值。

七、呼叫“同時存在返回值和OUTPUT引數”的儲存過程

  這是前面兩種情況的綜合運用,可藉助多個變數解決,程式碼形如:記錄集1.開啟 (“declare @R int; declare @P1 int; declare @P2 int; exec @R = xproc_r_p3 100,@P1 output,@P2 output; select @R,@P1,@P2”, #SQL語句, )。

八、思考:呼叫“既有OUTPUT引數(或返回值)又返回記錄集”的儲存過程

  我(liigo)暫時無解。

附,相關測試用儲存過程程式碼:

全文完。