C 中SQL呼叫儲存過程

2021-04-21 00:48:21 字數 3053 閱讀 8814

兩種不同的儲存過程呼叫方法

為了突出新方法的優點,首先介紹一下在.net中呼叫儲存過程的「官方」方法。另外,本文的所有示例程式均工作於sqlserver資料庫上,其它情況類似,以後不再一一說明。本文所有例子均採用c#語言。

要在應用程式中訪問資料庫,一般性的步驟是:首先宣告乙個資料庫連線sqlconnection,然後宣告乙個資料庫命令sqlcommand,用來執行sql語句和儲存過程。有了這兩個物件後,就可以根據自己的需要採用不同的執行方式達到目的。需要補充的是,不要忘記在頁面上新增如下的引用語句:using system.data.sqlclient。

就執行儲存過程來說,如果執行的是第一類儲存過程,那麼就要用乙個dataadapter將結果填充到乙個dataset中,然後就可以使用資料網格控制項將結果呈現在頁面上了;如果執行的是第二和第三種儲存過程,則不需要此過程,只需要根據特定的返回判定操作是否成功完成即可。

(1)執行乙個沒有引數的儲存過程的**如下:

sqlconnection conn=new sqlconnection(「connectionstring」);

sqldataadapter da = new sqldataadapter();

da.selectcommand = new sqlcommand();

da.selectcommand.connection = conn;

da.selectcommand.commandtext = "nameofprocedure";

da.selectcommand.commandtype = commandtype.storedprocedure;

然後只要選擇適當的方式執行此處過程,用於不同的目的即可。

(2)執行乙個有引數的儲存過程的**如下(我們可以將呼叫儲存過程的函式宣告為exeprocedure(string inputdate)):

sqlconnection conn=new sqlconnection(「connectionstring」);

sqldataadapter da = new sqldataadapter();

da.selectcommand = new sqlcommand();

da.selectcommand.connection = conn;

da.selectcommand.commandtext = "nameofprocedure";

da.selectcommand.commandtype = commandtype.storedprocedure;

(以上**相同,以下為要新增的**)

param = new sqlparameter("@parametername", sqldbtype.datetime);

param.direction = parameterdirection.input;

param.value = convert.todatetime(inputdate);

da.selectcommand.parameters.add(param);

這樣就新增了乙個輸入引數。若需要新增輸出引數:

param = new sqlparameter("@parametername", sqldbtype.datetime);

param.direction = parameterdirection.output;

param.value = convert.todatetime(inputdate);

da.selectcommand.parameters.add(param);

若要獲得參儲過程的返回值:

param = new sqlparameter("@parametername", sqldbtype.datetime);

param.direction = parameterdirection.returnvalue;

param.value = convert.todatetime(inputdate);

da.selectcommand.parameters.add(param);

從上面的**我們可以看出,當儲存過程比較多或者儲存過程的引數比較多時,這種方法會大大影響開發的速度;另外一方面,如果專案比較大,那麼這些用於資料庫邏輯的函式在以後的維護中也是乙個很大的負擔。那麼,有沒有一種改進的方法可以解決這個問題呢?想到在執行沒有引數的儲存過程時只需要傳入乙個儲存過程的名字就可以呼叫相應的儲存過程,而且在sqlserver資料庫中我們可以直接在查詢分析器中敲入「儲存過程名(引數列表)」樣的字串就可以執行儲存過程,那麼,是否可以把這種思想應用到應用程式中呢?

於是在編譯器中鍵入相應**。這些**是在呼叫不帶引數的儲存過程的**的基礎上改的。具體**如下:

sqlconnection conn=new sqlconnection(「connectionstring」);

sqldataadapter da = new sqldataadapter();

da.selectcommand = new sqlcommand();

da.selectcommand.connection = conn;

da.selectcommand.commandtext = "nameofprocedure(』para1』,』para2』,para3)";

da.selectcommand.commandtype = commandtype.storedprocedure;

為了使**更具有代表性,要呼叫的儲存過程的第乙個和第二個引數都為字串型別,第三個引數為整型。執行以後發現,完全可以達到預期的效果!

兩種呼叫方法的比較

通過比較我們可以看到,第二種方法具有乙個很明顯的優點,那就是可以提高開發速度,節省開發時間,而且**容易維護,在一定程度上也減少了系統大小。但是,由於對儲存過程引數的處理比較籠統,如果要獲取輸出引數或者得到儲存過程的返回值,這種方法就不能滿足需要了。雖然如此,但是,這種方法畢竟可以讓開發人員少些很大一部分的**。如果不需要獲取輸出引數和返回值,那麼幾乎可以做到「一勞永逸」。因此在實際的程式開發中,這種方法還是具有一定的實用價值的。

C 如何呼叫SQL儲存過程

在工作中,經常遇到需要呼叫儲存過程,如何呼叫呢?using system using system.collections.generic using system.linq using system.web using system.web.ui using system.web.ui.webco...

sql呼叫儲存過程

sqlconnection con new sqlconnection configurationmanager.connectionstrings easthhproductquoteconnectionstring tostring con.open sqlcommand cmd new sql...

C 中呼叫SQL儲存過程實現登入認證

儲存過程如下 set ansi nulls onset quoted identifier ongoalter procedure dbo security check user sort int,userid nchar 16 userpwd nchar 16 as declare uid nch...