ADO调用存储过程实例讲解

本文总结了四种调用存储过程的方法,包括直接返回值、使用SQL FUNCTION函数、无返回值及同时返回结果集与值的存储过程。通过具体实例展示了不同场景下如何灵活运用这些方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:直接有返回值的存储过程:
public string GetProjectCode() 
        {
            string strProc = "CreateProjectNumber";
	    //这个@ProjectNumber输出参数的设置,必须数据类型与长度与存储过程完全一致
            SqlParameter sp = new SqlParameter("@ProjectNumber",SqlDbType.VarChar,50);
            sp.Direction = ParameterDirection.Output;
            SqlHelper.ExecuteNonQuery(SqlHelper.ITODBConnectionStr, CommandType.StoredProcedure, strProc, sp);
            return sp.Value.ToString(); ;

        }
或者直接以SQL的形式调用:
 public string GetProjectCode() 
        {
            string strSql = "Declare @ProjectNumber varchar(50) EXEC CreateProjectNumber @ProjectNumber OUTPUT SELECT @ProjectNumber ";
            string a = SqlHelper.ExecuteScalar(SqlHelper.ITODBConnectionStr, CommandType.Text, strSql).ToString();
            return a;
        }
    /// <summary>
    /// 调用无参数的存储过程,直接调用存储过程的返回值
    /// </summary>
    /// <returns></returns>
    public static DataTable Pro_Categorys_Products() 
    {
        string procedureName = "pro_Categorys_Products";
        SqlParameter sp = new SqlParameter();
        //获取存储过程的返回值,在这里设置
        sp.Direction = ParameterDirection.ReturnValue;
        DataTable dt = SqlHelper.ExecuteDataset(SqlHelper.ConnectionString, CommandType.StoredProcedure, procedureName, sp).Tables[0];
        //当存储过程执行完毕后,返回存储过程的返回结果
        string spValue = sp.Value.ToString();
        return dt;
    }
2:调用SQLFUNCTION函数返回值:
public string GetTaskNumber() 
        {
            string strFunction = "CreateTaskNumber";
            SqlParameter[] sp = {
                new SqlParameter("@Result", SqlDbType.VarChar)                    
            };
            sp[0].Direction = ParameterDirection.ReturnValue;
            SqlHelper.ExecuteNonQuery(SqlHelper.ITODBConnectionStr, CommandType.StoredProcedure, strFunction, sp);
            return sp[0].Value.ToString();
         
        }


3:调用无返回值的存储过程:

//这种调用方式,参数不需要显示设置与存储过程中的输出参数长度一致
 public static DataTable Pro_Categorys_ProductsByCount(int beginNumber,int endNumber) 
    {
        string proceduceName = "pro_Categorys_ProductsByCount";
        //定义输入参数的时候,需要与存储过程中定义的参数名称一致,数据类型也一致
        SqlParameter[] sp = { 
            new SqlParameter("@ProductNumberBegin",SqlDbType.Int),
            new SqlParameter("@ProductNumberEnd",SqlDbType.Int)
        };
        sp[0].Value = beginNumber;
        sp[1].Value = endNumber;

        DataTable dt = SqlHelper.ExecuteDataset(SqlHelper.ConnectionString, CommandType.StoredProcedure, proceduceName, sp).Tables[0];
        return dt;
    }


4:调用返回结果集与返回值的存储过程

存储过程:

ALTER PROC TEST123
(
	@TNAME VARCHAR(20)
)
AS
BEGIN
	DECLARE @ReturnCount INT,@StrSql varchar(300)
	SELECT @ReturnCount = COUNT(*) FROM TEST 
	
	SELECT @StrSql  = 'SELECT * FROM TEST WHERE TNAME = '''+@TNAME+''' '
	
	PRINT @StrSql
	
	EXEC(@StrSql)
	
	RETURN @ReturnCount
	
END

GO


应用程序:

public static DataTable ProTest( out int returnValue)
        {
            string procedureName = "TEST123";
            SqlParameter[] sp = {   
            new SqlParameter("@TNAME",SqlDbType.VarChar),  
            new SqlParameter("@ReturnCount",SqlDbType.Int)  
            };
            sp[0].Value = "A";
            sp[1].Direction = ParameterDirection.ReturnValue;
            DataTable dt = SqlHelper.ExecuteDataset(SqlHelper.DBConnectString, CommandType.StoredProcedure, procedureName, sp).Tables[0];
            //当存储过程执行完毕后,返回存储过程的返回结果   
            returnValue = Convert.ToInt32(sp[1].Value);
            return dt;
        }  


调用端:

 	   int a;
            DataTable dt =  ProTest(out a);

            int b = a;


 

一个使用ADO连接池的示例,演示了TADOStoredProc动态参数的使用,带重连机制 =================== unit UnitDemo; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; //数据库服务器 gDBServer: String = '127.0.0.1'; //数据库名称 gDBName: String = 'master'; //数据库用户名 gDBUser: String = 'sa'; //密码 gDBPass: String = '2001'; implementation {$R *.dfm} uses ADODB, UnitADOConnectionPool; const CreateSQL = 'create procedure TestMyPool (@type sysname) '#13#10+ 'as'#13#10+ 'select * from sysobjects where xtype=@type'#13#10+ 'return @@rowcount'; DeleteSQL = 'if Exists(select 1 from sysobjects where xtype=N''P'' and name=N''TestMyPool'')'#13#10+ ' drop procedure TestMyPool'; var gPoolMan: TADOConnPoolMan = Nil; procedure TForm2.Button1Click(Sender: TObject); var ADOObject:TADOConnPoolObject; ADOStoredProc:TADOStoredProc; Running :Integer; I: Integer; begin //取得一个存储过程资源(含一数据库有效连接) ADOObject := gPoolMan.CreateSP('TestMyPool'); if ADOObject = Nil then //取得资源失败 Exit; try ADOStoredProc := ADOObject.ExecObject as TADOStoredProc; Running := 2;//允许重试(两次)操作,以便在操作失败之后达到重连 while Running>0 do begin Dec(Running); if ADOObject.NeedRefresh then begin//判断是否有重连标志(比如数据库断开等,可能需要进行重连) if Not ADOObject.Reconnect then Exit; ADOObject.NeedRefresh := Not ADOStoredProc.Parameters.Refresh; if ADOObject.NeedRefresh then Exit; end; for I := 1(*Zero is the *Result* Parameter*) to ADOStoredProc.Parameters.Count - 1 do begin //========================= //传递参数 ADOStoredProc.Parameters.Items[I].Value := 'U'; //========================= end; if Running 0 then try //执行存储过程 ADOStoredProc.Open; //执行存储过程成功,退出循环进入后续的数据处理 break; except On E:Exception do begin //执行失败非程序级的异常通常有两种可能: //1.数据库连接断开 //2.自适合的参数传递当中可能存储过程已更新,参与不一致 //设置重连标志 ADOObject.NeedRefresh := True; //=================== //这里记录数据库操作失败日志 //=================== end; end; Exit; end; //========================== //从ADOStoredProc当中读取记录 ShowMessage(IntToStr(ADOStoredProc.Parameters.ParamByName('Result').Value)); //========================== //关闭存储对象的资源 ADOStoredProc.Close; finally //调用结束,释放资源 ADOObject.Free; end; end; procedure TForm2.FormCreate(Sender: TObject); var ADOConn:TADOConnection; begin (****************BEGIN*******************) (*注:仅为测试准备 *) //初始化测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); ADOConn.Execute(CreateSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) //初始化连接池 gPoolMan := TADOConnPoolMan.Create(gDBServer,gDBUser,gDBPass,gDBName,true); end; procedure TForm2.FormDestroy(Sender: TObject); var ADOConn:TADOConnection; begin //释放连接池 if Assigned(gPoolMan) then gPoolMan.Free; (****************BEGIN*******************) (*注:仅为测试准备 *) //清理测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) end; end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值