ADO & ADO.NET中使用儲存過程的兩個共用的函式 (轉)

amyz發表於2007-08-14
ADO & ADO.NET中使用儲存過程的兩個共用的函式 (轉)[@more@]

在ADO環境下,過程查詢資料時常規做法為:
1 建立Connection Command
2 開啟連線,給Command賦引數的名稱、資料型別、值
3 Command物件
4 返回給Recordset物件交給客戶端
這樣做每呼叫一次儲存過程都要按照儲存過程中的引數的資料型別建立Parameters物件
比如儲存過程需要兩個引數 @ID int、@Name varchar(10)就需要
‘建立引數
cmd.Parameters.Append cmd.CreateParameter("@ID",adInteger,adParamInput,4)
cmd.Parameters.Append cmd.CreateParameter("@Name",adVarChar,adParamInput,10)
‘給引數賦值
cmd("@State") = 1
cmd("@WhereT")=”2”
每呼叫一個儲存過程都要手工新增這個儲存過程的所有引數,用自己的腦力保證引數的資料型別和儲存過程中的引數的資訊的一致性。
Command.Parameters物件有一個Refresh方法,這個方法的作用時讀取當前Command物件需要的所有引數的名稱和資料型別,用這個方法就可以寫成一個呼叫所有儲存過程的共用,現面這個函式完成了一個返回結果集的儲存過程的通用函式。很簡單可以根據需要細化。

‘在VisualBasic6.0透過。
Function GetRsByPro(strConnString As String, strProName As String, arjParameter() As String)
  '  返回 查詢的記錄集
  '  strConnString  資料連線串
  '  strProName  儲存過程名
  '  arjParameter() 儲存過程需要的陣列
  On Error GoTo errMsg
  '建立ADO物件
  Dim Cmd As New Command
  ' Con = Server.Create("ADO.Connection")
  Dim Con As New Connection
  ' ASP Set Cmd = Server.CreateObject("ADODB.Command")
  Dim Rs As New Recordset
  ' ASP Set rs = Server.CreateObject("ADODB.Recordset")
 
  '開啟
  Con.Open strConnString
  Set Cmd.ActiveConnection = Con
  Cmd.Commandtype = adCmdStoredProc
  Cmd.Parameters.Refresh
  If UBound(arjParameter) <> Cmd.Parameters.Count Then
  De.Print "引數個數不對"
  Exit Function
  End If
 
  '給儲存過程引數賦值
  For i = 0 To Cmd.Parameters.Count - 1
  Cmd.Parameters(i).Value = arjParameter(i)
  Next
 
  '設定Recordset物件
  Rs.CursorType = 3
  Rs.LockType = 3
  Rs.CursorLocation = 3
  Set Rs. = Cmd
  Rs.Open
 
  '返回結果集
  Set GetRsByPro = Rs
 
  '關閉資料來源
  Con.Close
  Set Con = Nothing
errMsg:
  Debug.Print Err.Description
End Function

‘呼叫Demo
Dim Rs As New Recordset
StrConnString=””
StrProName=”pro_GetAllUser”
Dim arjParameter(1)
arjParameter(0)=”1”
arjParameter(1)=”山東”
Set Rs= GetRsByPro(strConnString, strProName, arjParameter())

用相同的方法在開發環境裡也可以建立一個通用的方法呼叫儲存過程。
在裡不管是OleDbCommand.Parameters物件還是Command.Parameters物件都沒有Refresh方法讀取儲存過程的引數資訊,.NET在OleDbCommandBuilder類裡提供了一個DeriveParameters靜態方法可以實現相同的功能。
.NET SDK裡關於DeriveParameters的描述
“使用在 SqlCommand 中指定的儲存過程的引數資訊,填充指定的 SqlCommand 物件的 Parameters 集合。”

SqlConnection Conn=new SqlConnection(cnString);
Conn.Open();
SqlCommand Comm=new SqlCommand();
Comm.Connection =conn;
Comm.CommandType =CommandType.StoredProcedure ;
Comm.CommandText =proName;
SqlCommandBuilder.DeriveParameters(comm);
//經過這個方法後SqlCommand物件的SqlParameters物件已經幫定了儲存過程中的資訊了
實現執行任意一個儲存過程返回一個DataSet物件的具體函式程式碼
名 :TestSqlAccess.cs
// 在vs.net除錯透過
using System;
using System.Data;
using System.;
using System.Data.SqlClient;
using System.Data.OleDb ;
using System.Collections;

namespace Erp
{
public sealed class TestSqlAccess
{
#region 獲取儲存過程引數集合
public static SqlParameter [] getParameters(string cnString,string proName)
{
SqlConnection conn=new SqlConnection(cnString);
conn.Open();
SqlCommand comm=new SqlCommand();
comm.Connection =conn;
comm.CommandType =CommandType.StoredProcedure ;
comm.CommandText =proName;

SqlCommandBuilder.DeriveParameters(comm);
SqlParameter [] rm=new SqlParameter[comm.Parameters.Count];
for (int i=0;i{
arPrm[i]=new SqlParameter();
arPrm[i].SqlDbType =comm.Parameters[i].SqlDbType ;
arPrm[i].ParameterName=comm.Parameters[i].ParameterName;
arPrm[i].Size =comm.Parameters[i].Size;
}
return arPrm;
}
#endregion


#region 執行Command物件返回DataSet


/////可以呼叫提供的那個SqlHelper類..

#endregion 執行Command物件返回DataSet



 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-956572/,如需轉載,請註明出處,否則將追究法律責任。

相關文章