在asp.net2.0中通常都是gridview和sqldatasource配合使用可以在sqldatasource中调用存储过程,然后把返回的数据集绑定到gridview中去,但是不知道有没想过,怎么才能把sqldatasource调用的存储过程返回的参数(存储过程标记为OutPut的参数)绑定到gridview中去,用google搜索了几天都没有什么结果,不知道是否可以这么做,如果不可以的话,有没什么办法可以变通下。请大家给我个思路。

解决方案 »

  1.   

    不是很清楚,
    不喜欢用sqldatasource,和objectdatasource,感觉还不如手写代码,还灵活
      

  2.   

    同意楼上的,用sqldatasource绑定数据源确实有很大的局限性,但是可以省去大量的代码如果不是做个很特别的显示数据的东东,用sqldatasource+gridview最简单实现.
      

  3.   

    首先感谢你的回答你说的datakey在gridview中和sqldatasource这两个控件中都没有该属性我想你应该是指gridview中的datakeys属性,不过该属性我记得应该是根据gridview的数据显示下标(根据datakeynames指定的字段)来显示返回的数据集合并不显示返回的参数。
      

  4.   

    写存储过程的时候不要写output参数就可以了,
    假如output是这样写的:
    @aa int output
    as
         set  @aa = 1可以换成这种方式就可以绑定了as
        DECLARE @aa int 
        set @aa = 1select @aa as aa
    GO这样列名就为aa,多加几个也是一样的,
    as
        DECLARE @aa int 
        DECLARE @bb int 
        set @aa = 1select @aa as aa,@bb as bb
    GO
      

  5.   

    楼上的兄弟正解,确实是可以这样做的.不过我想知道gridview到底是否支持绑定存储过程返回的值就象在ADO.net中那样调用
    sqlparameters("@*").direction=ParameterDirection.Output
    用sqlparameters("@*").value来获值所以现在还不能结贴,呵呵.
      

  6.   

    http://geekswithblogs.net/chrishan/archive/2005/07/16/47164.aspx
      

  7.   

    谢谢Sysinfo兄的提示,照着你的提示我试了以下代码:
    这是sqldatasource的代码
    -------------------
     <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="**" SelectCommand="testreturn" SelectCommandType="StoredProcedure">
                <SelectParameters>
                    <asp:Parameter DefaultValue="0" Direction="InputOutput" Name="test" Type="Int32" />
                </SelectParameters>
            </asp:SqlDataSource>
    --------------------
    用以下代码在sqldatasource的selected事件中提取返回的参数的值:
    ----------
    Dim param As SqlParameter = CType(e.Command.Parameters("@test"), SqlParameter)
    HiddenField1.Value = param.Value.ToString//缓存取到的值
    -----------把取到的值绑定到gridview上的代码
    --------------
      Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            For Each gvr As GridViewRow In GridView1.Rows
                Dim a As Label
                a = CType(gvr.FindControl("test2"), Label)
                If Not a Is System.DBNull.Value Then
                    Dim b As Label = gvr.Cells(3).FindControl("test2")
                    b.Text = HiddenField1.Value
                End If
            Next
        End Sub
    ------------------结果是可以达到目的,但觉得这样似乎很麻烦.
    不知道有没更简单的办法,就象
    在<itemtemplate>
    <asp:label text='<%# eval("**")%>' />  //类似的调用手法
    </itemtemplate>
      

  8.   

    支持的
    点出来的
    是一个select 
    先要配值数据库
    然后把一个属性改成DATAREARDER
    默认为dataset
    要实现IDataReader dr = (IDataReader)(SqlDataSource1.Select(DataSourceSelectArguments.Empty) as IDataReader);
    IDataReader 接口
      

  9.   

    楼上的朋友是否能再详细的说明下
    我照着你的提示做了以下操作
    修改了sqldatasource的datasourcemode属性把原来的dataset改成了datareader
    按你的提示
    IDataReader dr = (IDataReader)(SqlDataSource1.Select(DataSourceSelectArguments.Empty) as IDataReader); 
    我在page-load事件(不知道是不在这里写)中写了以下代码
    ----------
     Dim dr As IDataReader = CType(SqlDataSource1.Select(DataSourceSelectArguments.Empty), IDataReader)
            GridView2.DataSource = dr
            GridView2.DataBind()
    -----------------
    结果是正常显示返回的数据集合,但是用这种动态编程的方法,好象没考虑到怎么把存储过程返回的参数显示出来,
    不知道是否漏了些什么,还是根本就不是这样实现的
    嘿嘿,望在指点下。