command存儲過程
⑴ asp.net 調用存儲過程
兩種不同的存儲過程調用方法
為了突出新方法的優點,首先介紹一下在.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 = "NameOfProcere";
da.selectCommand.CommandType = CommandType.StoredProcere;
然後只要選擇適當的方式執行此處過程,用於不同的目的即可。
(2)執行一個有參數的存儲過程的代碼如下(我們可以將調用存儲過程的函數聲明為ExeProcere(string inputdate)):
SqlConnection conn=new SqlConnection(「connectionString」);
SqlDataAdapter da = new SqlDataAdapter();
da.selectCommand = new SqlCommand();
da.selectCommand.Connection = conn;
da.selectCommand.CommandText = "NameOfProcere";
da.selectCommand.CommandType = CommandType.StoredProcere;
(以上代碼相同,以下為要添加的代碼)
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 = "NameOfProcere('para1','para2',para3)";
da.selectCommand.CommandType = CommandType.StoredProcere;
為了使代碼更具有代表性,要調用的存儲過程的第一個和第二個參數都為字元串類型,第三個參數為整型。執行以後發現,完全可以達到預期的效果!
兩種調用方法的比較
通過比較我們可以看到,第二種方法具有一個很明顯的優點,那就是可以提高開發速度,節省開發時間,而且代碼容易維護,在一定程度上也減少了系統大小。但是,由於對存儲過程參數的處理比較籠統,如果要獲取輸出參數或者得到存儲過程的返回值,這種方法就不能滿足需要了。雖然如此,但是,這種方法畢竟可以讓開發人員少些很大一部分的代碼。如果不需要獲取輸出參數和返回值,那麼幾乎可以做到「一勞永逸」。因此在實際的程序開發中,這種方法還是具有一定的實用價值的。
用ASP.NET與SQL SERVER可是緣份最好了,稍大的程序一般第一先考慮的是SQL SERVER,只是一些很考慮經濟的才使用ACCESS等了。用SQL SERVER,為了使資料庫的效率更好,一般都會才取存儲過程,因存儲過程執行速度快,並且可以實現一些高級的查詢等功能。比如傳入一些數據參數,但執行的SQL過程可能不同等。
下面就來個例子,建立一新的角色,要求角色的名字不能重復,以下是一存儲過程。
CREATE PROCEDURE sp_AccountRole_Create@CategoryID int,@RoleName nvarchar(10),@Description nvarchar(50),@RoleID int outputAS DECLARE @Count int -- 查找是否有相同名稱的記錄 SELECT @Count = Count(RoleID) FROM Account_Role WHERE RoleName = @RoleName IF @Count = 0 INSERT INTO Account_Role (CategoryID, RoleName, Description) valueS (@CategoryID, @RoleName, @Description) SET @RoleID = @@IDENTITY RETURN 1GO 執行存儲過程的C#過程:
SqlConnection DbConnection = new SqlConnection(mConnectionString);SqlCommand command = new SqlCommand( "sp_AccountRole_Create", DbConnection );DbConnection.Open(connectString);// 廢置SqlCommand的屬性為存儲過程command.CommandType = CommandType.StoredProcere;command.Parameters.Add("@CategoryID", SqlDbType.Int, 4);command.Parameters.Add("@RoleName", SqlDbType.NVarChar, 10);command.Parameters.Add("@Description", SqlDbType.NVarChar, 50);command.Parameters.Add("@RoleID", SqlDbType.Int, 4);// 返回值command.Parameters.Add("Returnvalue", SqlDbType.Int, 4, // Size ParameterDirection.Returnvalue, false, // is nullable 0, // byte precision 0, // byte scale string.Empty, DataRowVersion.Default, null );command.parameters["@CategoryID"].value = permission.CategoryID;command.parameters["@RoleName"].value = permission.PermissionName;command.parameters["@Description"].value = permission.Description;// 可以返回新的ID值command.parameters["@RoleID"].Direction = ParameterDirection.Output;int rowsAffected = command.ExecuteNonQuery();int result = command.parameters["Returnvalue"].value;int newID = command.parameters["@RoleID"].value;
⑵ webservice怎麼調用資料庫存儲過程
代碼不記得寫了,過程如下:
自己建一個存儲過程
2..建一個資料庫操作類,並建一個public 方法,在方法里將command對象的CommadType屬性設置為存儲過程(StoreProcess);將Command對象的CommandText屬性設為存儲過程名,將傳入的參數加入Command對象的參數集合中,然後執行Command對象的ExecuteReader方法,
3.創建一個WebService,並引入上面創建的類,在WebService的方法裡面調用該類的方法,返回一個DataReader,將該DataReader轉換為XML格式輸出。
⑶ VC中如何執行SQL語句(用SQLServer的數據源)
使用 ADODB.Command 來調用存儲過程,如:
Dim adoComm As Object
'// 創建一個對象,我們用來調用存儲過程
Set adoComm = CreateObject("ADODB.Command")
With adoComm
'// 設置連接,假設 adoConn 為已經連接的 ADODB.Connection 對象
.ActiveConnection = adoConn
'// 類型為存儲過程,adCmdStoredProc = 4
.CommandType = 4
'// 存儲過程名稱
.CommandText = "你的存儲過程名稱"
'// 設置輸入參數
.Parameters.Item("@輸入參數").Value = "值"
'// 執行存儲過程
.Execute
If .Parameters.Item("@返回參數名稱").Value = True Then
Else
End If
End With
'// 釋放對象
Set adoComm = Nothing
⑷ oracle中怎麼在存儲過程中調用同一個包的其他存儲過程
在存儲過程或函數里調用oracle包的話,首先要有執行這個包的許可權;如果包屬於其他的用戶(不是系統包),調用時:用戶名.包名.存儲過程(參數)名或者
變數:=用戶名.包名.函數(參數);因為函數有返回值,變數類型要跟函數返回值的類型一致。
在command
下調用的話:exec
用戶名.包名.存儲過程名(參數);select
用戶名.包名.函數名(參數)
from
al;就可以了。包屬於當期用戶可以不寫用戶名。
⑸ ASPNET怎樣調用一個存儲過程(帶參數的)
ASPNET怎樣調用一個存儲過程(帶參數的)使用的是Ado.NET中的相關的資料庫操作方法。
Ado.NET連接資料庫有以下幾個步驟:
1:使用配置的資料庫連接串,創建資料庫連接 Connection 對象
2:構建操作的sql語句
3:定義command對象
4:打開數據連接
5:執行命令
舉一個例子,刪除操作
public int DeleteStudent3(int stuID)
{
int result = 0;
using (SqlConnection connection = new SqlConnection(connString))
{
SqlCommand objCommand = new SqlCommand(dboOwner + ".usp_DeleteStudent", connection);
objCommand.CommandType = CommandType.StoredProcere;
objCommand.Parameters.Add("@stuID", SqlDbType.Int).Value = stuID;
connection.Open();
result = objCommand.ExecuteNonQuery();
}
return result;
}