使用SQL存储过程作为源在ASP.NET Gridview中将数字格式化为Money

时间:2015-08-18 09:28:32

标签: c# sql asp.net sql-server stored-procedures

我在加载时使用SQL Server存储过程作为gridview的源代码。该查询具有结果为数字(money)的列,我希望数字输出在gridview中加载时具有逗号。最初在SQL中,查询结果没有任何格式,因为我试图将格式放在前端。

之前,我可以通过在gridview定义中放置一个boundfield,然后输入属性名称datafield,根据SQL中的列名或别名给出其值来实现。但是在我的情况下,这次存储过程列具有动态别名,因为它产生了一个具有特定日期的列(它根据一周中的几天而变化)。

存储过程就像这样(最后一部分)

 set @query = 'select locationd, Name ' +
        ',(SUM(Day1)) as '+ '[' + @sdateVC1 + ']'  +
        ',(SUM(Day2)) as '+ '[' + @sdateVC2 + ']'  +
        ',(SUM(Day3)) as '+ '[' + @sdateVC3 + ']'  +
        ',(SUM(Day4)) as '+ '[' + @sdateVC4 + ']'  +
        ',(SUM(Day5)) as '+ '[' + @sdateVC5 + ']'  +
        ',(SUM(Day6)) as '+ '[' + @sdateVC6 + ']'  +
        ',(SUM(Day7)) as '+ '[' + @sdateVC7 + ']'  +
        ',(SUM(ISNULL(Day1,0)) + SUM(ISNULL(Day2,0)) + SUM(ISNULL(Day3,0)) + SUM(ISNULL(Day4,0)) + SUM(ISNULL(Day5,0)) + SUM(ISNULL(Day6,0)) + SUM(ISNULL(Day7,0)))as ''TOTAL'' ' +  
        ',RANK() over (partition by locationd order by ((SUM(ISNULL(Day1,0)) + SUM(ISNULL(Day2,0)) + SUM(ISNULL(Day3,0)) + SUM(ISNULL(Day4,0)) + SUM(ISNULL(Day5,0)) + SUM(ISNULL(Day6,0)) + SUM(ISNULL(Day7,0)))) DESC) as ''Ranking'' ' +    
        'from #newestWSR4 ' +
        'group by locationd,  Name ' +
        --'order by locationd, Name ' 
         'union all' +
          ' select ''-'', ''TOTAL'',  sum(day1),  sum(day2),  sum(day3), sum(day4), sum(day5),  sum(day6), sum(day7), (SUM(ISNULL(Day1,0)) + SUM(ISNULL(Day2,0)) + SUM(ISNULL(Day3,0)) + SUM(ISNULL(Day4,0)) + SUM(ISNULL(Day5,0)) + SUM(ISNULL(Day6,0)) + SUM(ISNULL(Day7,0))), ''-''    ' +
          'from #newestWSR4 '

ASP.net中的gridview代码就像这样

<asp:GridView ID="grdWSR" runat="server" BackColor="White" BorderColor="#DEDFDE" 
    BorderStyle="None" BorderWidth="1px" CellPadding="4" ForeColor="Black"
    GridLines="Vertical" Font-Size="Smaller" EmptyDataText="No Records Found" 
    ShowHeaderWhenEmpty="True" width="100%" AutoGenerateColumns="false" >

<emptydatarowstyle backcolor="white" forecolor="black"/> 
<emptydatatemplate> No Data Found.</emptydatatemplate> 

 <AlternatingRowStyle BackColor="White" />

  <Columns>
     <asp:BoundField  DataField="locationd" />
     <asp:BoundField  DataField="name"   />
     <asp:BoundField Datafield=""  DataFormatString="{0:#,##0.00;(#,##0.00);0}" />
   </Columns>

   <FooterStyle BackColor="#CCCC99" />
   <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" Height="25px"/>
 <PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
 <RowStyle BackColor="#F7F7DE" />
 <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
 <SortedAscendingCellStyle BackColor="#FBFBF2" />
 <SortedAscendingHeaderStyle BackColor="#848384" />
 <SortedDescendingCellStyle BackColor="#EAEAD3" />
 <SortedDescendingHeaderStyle BackColor="#575357" />
</asp:GridView>

请注意上面代码中的这一部分

 <asp:BoundField  DataField="locationd" />
 <asp:BoundField  DataField="name"   />
 <asp:BoundField  Datafield="" DataFormatString="{0:#,##0.00;(#,##0.00);0}" />

正如您所看到的,我只将三个边界区域用于测试目的。在那里我不知道在数据域值中放入什么,因为SQL存储过程中的别名列是动态更改或不是固定的,与前两个边界字段(SQL中的列名/别名是固定的)不同

这种情况可以回答吗?或者我应该考虑现在在后端(SQL)上做解决方案来实现我想要的结果吗?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

我建议你不要在sp中做任何格式化的事情, 它将使您的系统在优化方面超载,

更喜欢c#而不是

    DataTable dt=mySP();
    for(i=0;i<dt.Rows.Count;i++)
    {
    dt.Rows[i][10]=Convert.ToDouble(dt.Rows[i][10]).ToString("#,###,###,###,###,##0.00");
    }
    GridView1.DatSource=dt;

答案 1 :(得分:0)

尝试在存储过程中格式化这样的字符串:

CONVERT(varchar, CAST(SUM(Day1) AS money), 1)

或者像这样 -

FORMAT(SUM(Day1),'###,###,###')