none
SqlDataSource数据源使用存储过程读取数据时,无法和数据绑定控件绑定 RRS feed

  • 问题

  • <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:InfoConnectionString %>" SelectCommand="Pager" SelectCommandType="StoredProcedure">
          
                <SelectParameters>
                    <asp:Parameter DefaultValue="InfosNeedToCheck" Name="tblName" Type="String" />
                    <asp:Parameter DefaultValue="*" Name="fldName" Type="String" />
                    <asp:Parameter DefaultValue="10" Name="pageSize" Type="Int32" />
                    <asp:Parameter DefaultValue="1" Name="page" Type="Int32" />
                    <asp:Parameter DefaultValue="uploadtime" Name="fldSort" Type="String" />
                    <asp:Parameter DefaultValue="True" Name="Sort" Type="Boolean" />
                    <asp:Parameter DefaultValue="" Name="strCondition" Type="String" />
                    <asp:Parameter DefaultValue="id" Name="ID" Type="String" />
                    <asp:Parameter DefaultValue="False" Name="Dist" Type="Boolean" />
                    <asp:Parameter DefaultValue="" Direction="InputOutput" Name="pageCountOut" Type="Int32" />
                    <asp:Parameter Direction="InputOutput" Name="CountsOut" Type="Int32" />
                </SelectParameters>
            </asp:SqlDataSource>
    这是我的数据源控件,其中的Pager是我的存储过程名,这个数据源控件再用向导生成的时候,最后一步“测试数据”也成功的显示了正确的数据。

    但是再添加一个Datalist控件时,把Datalist控件的DataSourceID属性指定为数据源后,在浏览器下看页面什么也没有显示。
            <asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1" >
            
            </asp:DataList>
    这样的Datalist不行,下面的DataList也不行

            <asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1" DataKeyField="id" >
                <ItemTemplate>
                    UserName:
                    <asp:Label ID="UserNameLabel" runat="server" Text='<%# Eval("UserName") %>' />
                    <br />
                    category:
                    <asp:Label ID="categoryLabel" runat="server" Text='<%# Eval("category") %>' />
                    <br />
                    City:
                    <asp:Label ID="CityLabel" runat="server" Text='<%# Eval("City") %>' />
                    <br />
                    ip:
                    <asp:Label ID="ipLabel" runat="server" Text='<%# Eval("ip") %>' />
                    <br />
                    uploadtime:
                    <asp:Label ID="uploadtimeLabel" runat="server" Text='<%# Eval("uploadtime") %>' />
                    <br />
                    title:
                    <asp:Label ID="titleLabel" runat="server" Text='<%# Eval("title") %>' />
                    <br />
                    mode:
                    <asp:Label ID="modeLabel" runat="server" Text='<%# Eval("mode") %>' />
                    <br />
                    contents:
                    <asp:Label ID="contentsLabel" runat="server" Text='<%# Eval("contents") %>' />
                    <br />
                    id:
                    <asp:Label ID="idLabel" runat="server" Text='<%# Eval("id") %>' />
                    <br />
                    managestatus:
                    <asp:Label ID="managestatusLabel" runat="server" Text='<%# Eval("managestatus") %>' />
                    <br />
                    safelevel:
                    <asp:Label ID="safelevelLabel" runat="server" Text='<%# Eval("safelevel") %>' />
                    <br />
                    <br />
                </ItemTemplate>
            
            </asp:DataList>
    
    即使用这种绑定语法,还是不能显示数据
    难道是在数据源的 SelectCommand 中没有出现字段名称的缘故吗?但是我调用的存储过程,怎么会有字段名称呢?
    请高人给指点一下。
    2009年12月29日 14:05

答案

全部回复

  • 更奇怪的是,编译不出错,运行的时候也不出错,就是什么都不显示。
    2009年12月29日 14:06
  • 你可以下断点调试看看DataList1中是否存在数据~以确定是获取数据的问题还是显示的问题~
    2009年12月30日 14:45
    版主
  • 首先谢谢楼上。
    我是在.aspx文件中以向导的方式生成的控件,并不是使用编程的方式生成的控件,所以应该无法设置断点吧?

    我在创建数据源控件的时候,在最后一步出现“测试查询”的时候,我点击“测试查询”,然后直接点“确定”,是可以看到数据的。图片如下:
    http://www.lffdc.gov.cn/1.jpg 

    http://www.lffdc.gov.cn/2.jpg
    但是当我完成数据源控件向导,再点sqldatasource1的任务中的击“刷新构架”时,就不能显示数据了,出现一个错误提示,图片如下:
    http://www.lffdc.gov.cn/3.jpg

    http://www.lffdc.gov.cn/4.jpg

    2009年12月31日 13:47
  • 数据库连接字符串后来改过了吗?提示是ConnectionString或SelectCommand可能有错误~但是测试查询通过SelectCommand应该没问题吧~
    2010年1月1日 7:46
    版主
  • 谢谢SnowDream,我发现了问题出在哪里了,但是现在还没能解决。
    不是数据源控件的问题,是我写的存储过程有问题。有时间麻烦你帮我看一下。

    USE [Info]
    GO
    /****** 对象:  StoredProcedure [dbo].[Pager]    脚本日期: 01/01/2010 20:24:35 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    
     --/*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/ 
     --/*-----存储过程 分页处理 浪尘 2008-9-1修改----------*/ 
     --/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/ 
    
    create PROCEDURE [dbo].[aaPager] 
     ( 
     @tblName     nvarchar(200)='infosneedtocheck',        ----要显示的表或多个表的连接 
     @fldName     nvarchar(500) = '*',    ----要显示的字段列表 
     @pageSize    int = 10,        ----每页显示的记录个数 
     @page        int = 1,        ----要显示那一页的记录 
     @fldSort    nvarchar(200) = 'uploadtime',    ----排序字段列表或条件 
     @Sort        bit = 1,        ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ') 
     @strCondition    nvarchar(1000) = 'and 1=1',    ----查询条件,不需where 
     @ID        nvarchar(150)='id',        ----主表的主键 
     @Dist                 bit = 0,           ----是否添加查询字段的 DISTINCT 默认0不添加/1添加 
     @pageCountOut    int = 1 output,            ----查询结果分页后的总页数 
     @CountsOut    int = 1 output                ----查询到的记录数 
     ) 
     AS 
     SET NOCOUNT ON 
     Declare @sqlTmp nvarchar(1000)        ----存放动态生成的SQL语句 
     Declare @strTmp nvarchar(1000)        ----存放取得查询结果总数的查询语句 
     Declare @strID     nvarchar(1000)        ----存放取得查询开头或结尾ID的查询语句 
    
     Declare @strSortType nvarchar(10)    ----数据排序规则A 
     Declare @strFSortType nvarchar(10)    ----数据排序规则B 
    
     Declare @SqlSelect nvarchar(50)         ----对含有DISTINCT的查询进行SQL构造 
     Declare @SqlCounts nvarchar(50)          ----对含有DISTINCT的总数查询进行SQL构造 
    
     declare @timediff datetime  --耗时测试时间差 
     ----select @timediff=getdate() 
    
     if @Dist  = 0 
     begin 
         set @SqlSelect = 'select ' 
         set @SqlCounts = 'Count(*)' 
     end 
     else 
     begin 
         set @SqlSelect = 'select distinct ' 
         set @SqlCounts = 'Count(DISTINCT '+@ID+')' 
     end 
    
    
     if @Sort=0 
     begin 
         set @strFSortType=' ASC ' 
         set @strSortType=' DESC ' 
     end 
     else 
     begin 
         set @strFSortType=' DESC ' 
         set @strSortType=' ASC ' 
     end 
    
    
    
     --------生成查询语句-------- 
     --此处@strTmp为取得查询结果数量的语句 
     if @strCondition is null or @strCondition=''     --没有设置显示条件 
     begin 
         set @sqlTmp = @fldName + ' From ' + @tblName 
         set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName 
         set @strID = ' From ' + @tblName 
     end 
     else 
     begin 
         set @sqlTmp = @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition 
         set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition 
         set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition 
     end 
    
     ----取得查询结果总数量----- 
     exec sp_executesql @strTmp,N'@Counts int out ',@Counts=@CountsOut output 
     declare @tmpCounts int 
     if @CountsOut = 0 
         set @tmpCounts = 1 
     else 
         set @tmpCounts = @CountsOut
    
         --取得分页总数 
         set @pageCountOut=(@tmpCounts+@pageSize-1)/@pageSize 
    
         /**//**//**//**当前页大于总页数 取最后一页**/ 
         if @page>@pageCountOut 
             set @page=@pageCountOut 
    
         --/*-----数据分页2分处理-------*/ 
         declare @pageIndex int --总数/页大小 
         declare @lastcount int --总数%页大小  
    
         set @pageIndex = @tmpCounts/@pageSize 
         set @lastcount = @tmpCounts%@pageSize 
         if @lastcount > 0 
             set @pageIndex = @pageIndex + 1 
         else 
             set @lastcount = @pagesize 
    
         --//***显示分页 
         if @strCondition is null or @strCondition=''     --没有设置显示条件 
         begin 
             if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理 
                 begin  
                     if @page=1 
                         set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName                         
                             +' order by '+ @fldSort +' '+ @strFSortType 
                     else 
                     begin 
                         if @Sort=1 
                         begin                     
                         set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
                             +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 
                             +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
                             +' order by '+ @fldSort +' '+ @strFSortType 
                         end 
                         else 
                         begin 
                         set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
                             +' where '+@ID+' >(select max('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 
                             +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
                             +' order by '+ @fldSort +' '+ @strFSortType  
                         end 
                     end     
                 end 
             else 
                 begin 
                 set @page = @pageIndex-@page+1 --后半部分数据处理 
                     if @page <= 1 --最后一页数据显示                 
                         set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
                             +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType  
                     else 
                         if @Sort=1 
                         begin 
                         set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
                             +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 
                             +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
                             +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
                         end 
                         else 
                         begin 
                         set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
                             +' where '+@ID+' <(select min('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 
                             +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
                             +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType  
                         end 
                 end 
         end 
    
         else --有查询条件 
         begin 
             if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理 
             begin 
                     if @page=1 
                         set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName                         
                             +' where 1=1 ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType 
                     else if(@Sort=1) 
                     begin                     
                         set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
                             +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 
                             +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
                             +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType 
                     end 
                     else 
                     begin 
                         set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
                             +' where '+@ID+' >(select max('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 
                             +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
                             +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType  
                     end            
             end 
             else 
             begin  
                 set @page = @pageIndex-@page+1 --后半部分数据处理 
                 if @page <= 1 --最后一页数据显示 
                         set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
                             +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType                      
                 else if(@Sort=1) 
                         set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
                             +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 
                             +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
                             +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType     
                 else 
                         set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
                             +' where '+@ID+' <(select min('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 
                             +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
                             +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType             
             end     
         end 
    
     ------返回查询结果----- 
    
     exec sp_executesql @strTmp 
     ----select @strTmp
     ----select datediff(ms,@timediff,getdate()) as 耗时 
     --print @strTmp 
     SET NOCOUNT OFF 
    
    ---- 执行方法:execute pager info,'id,uploadtime,title,contents,price,priceunit',10,1,'uploadtime' ,1,'and cityid=3 and categoryid=67','id'
    
    
    
    2010年1月1日 12:26
  • 我知道是什么原因了,我的存储过程里面使用了动态SQL,SqlDataSource不能取得在存储过程中使用动态SQL语句生成的数据集的内容。
    但我还没有办法解决这个问题。
    2010年1月3日 1:41
  • 苗苗老师 你好,
    我在 northwind 数据库上测试了你的存储过程,没问题,工作正常。 错误应该发生在参数设置上,注意检查 CountsOut 和 PageCountsOut 参数。


    Mog Liang
    2010年1月4日 8:37
  • 苗苗老师 你好,
    我在 northwind 数据库上测试了你的存储过程,没问题,工作正常。 错误应该发生在参数设置上,注意检查 CountsOut 和 PageCountsOut 参数。


    Mog Liang

    非常感谢你的测试。
    情况是这样的,我在Sql Server 2005下对这个存储过程测试也是正确的,能取得数据。
    即使是在ASP.NET下的数据源控件SqlDataSource中,最后一步“测试数据”时,也是能看到数据的:
    http://www.lffdc.gov.cn/1.jpg

    http://www.lffdc.gov.cn/2.jpg

    但是这个数据源控件是不能正常工作的。原因就是在我的存储过程中适用了动态SQL语句,SqlDataSource控件不能取得动态SQL语句返回的字段名。
    2010年1月5日 1:45
  • 这种情况下使用GridView就省事了。当然DataList也可以动态更改Template, 下面这篇文章提供了一种方法,创建一个Template类实现ITemplate接口,你可以尝试一下。
    http://www.codedigest.com/Articles/ASPNET/164_Creating_Dynamic_DataList_control_in_C_ASPNet.aspx


    Mog Liang
    • 已标记为答案 Mog Liang 2010年1月8日 2:13
    2010年1月5日 8:25