【问题标题】:Calculating a T-SQL Query Parameter at Load Time在加载时计算 T-SQL 查询参数
【发布时间】:2009-04-19 15:32:07
【问题描述】:

我正在尝试从事件数据库(EventDate 字段作为日期)中选择 EventDate 为当前月份的记录。

我有计算当月第一天的函数:

public string GetFirstofMonth(DateTime dt)
{
 int thisMonth = dt.Month;
 int thisYear = dt.Year;
 string firstOfMonth = thisMonth.ToString() + "/1/" + thisYear.ToString();
 return firstOfMonth;
}

以及当月的最后一天:

public string GetLastofMonth(DateTime dt)
{
  DateTime Date2Obj = new DateTime(dt.Year, dt.Month, 1);
  int thisMonth = dt.Month;
  int thisYear = dt.Year;
  Date2Obj.AddMonths(1);
  Date2Obj.AddDays(-1);
  int lastDay = Date2Obj.Day;
  string LastOfMonth = thisMonth + "/" + lastDay + "/" + thisYear;
  return LastOfMonth;
}

所以在 MasterPage(或实例,没关系)我有这个 SQLDataSource:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
 ConnectionString="<%$ ConnectionStrings:MeetingsConnectionString %>" 
 SelectCommand="SELECT * FROM [Events] WHERE (([EventDate] &gt;= @EventDate) AND ([EventDate] &lt;= @EventDate2))">
 <SelectParameters>
   <asp:Parameter DbType="Date" Name="EventDate" />
   <asp:Parameter DbType="Date" Name="EventDate2" />
 </SelectParameters>
</asp:SqlDataSource>

如何修改 SQLDataSource 中的 EventDate 和 EventDate2 参数以使用 GetFirstofMonth(DateTime.Today);和 GetLastofMonth(DateTime.Today) 分别作为它们的值?或者这不可能?

【问题讨论】:

  • 谢谢大家的回答。何塞工作了,所以我和他一起去,但你们都得到了提升。

标签: c# asp.net sql parameters


【解决方案1】:

这可以通过如下处理 SqlDataSource 的“Selecting”事件来完成:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" OnSelecting="SqlDataSource1_Selecting"
 ConnectionString="<%$ ConnectionStrings:MeetingsConnectionString %>" 
 SelectCommand="SELECT * FROM [Events] WHERE [EventDate] BETWEEN @EventDate AND @EventDate2">
 <SelectParameters>
   <asp:Parameter Name="EventDate" />
   <asp:Parameter Name="EventDate2" />
 </SelectParameters>
</asp:SqlDataSource>

在您的代码隐藏或内联代码中(无论您在哪里定义了函数)添加此方法:

protected void SqlDataSource1_Selecting(object sender, SqlDataSourceEventArgs e)
{
  e.Command.Parameters["@EventDate"].Value 
           = GetFirstofMonth(DateTime.Now); //replace with your date param
  e.Command.Parameters["@EventDate2"].Value 
              = GetLastofMonth(DateTime.Now); //replace with your date param
}

【讨论】:

  • 应该是参数(“@EventDate”)而不是参数[“@EventDate”]
【解决方案2】:

一种方法是在您的页面上放置隐藏字段,使用您的方法在代码隐藏中设置这些字段的值以及日期,然后将数据源参数绑定到隐藏字段。

代码隐藏

public void Page_Load( ... )
{
     ...
     EventDate.Value = GetFirstOfMonth( DateTime.Today );
     EventDate2.Value = GetLastOfMonth( DateTime.Today );
     ...
}

标记

<asp:HiddenField runat="server" id="EventDate" />
<asp:HiddenField runat="server" id="EventDate2" />

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
 ConnectionString="<%$ ConnectionStrings:MeetingsConnectionString %>" 
 SelectCommand="SELECT * FROM [Events] WHERE (([EventDate] &gt;= @EventDate) AND ([EventDate] &lt;= @EventDate2))">
 <SelectParameters>
   <asp:ControlParameter DbType="Date" Name="EventDate" ControlID="EventDate" PropertyName="Value" />
   <asp:ControlParameter DbType="Date" Name="EventDate2" ControlID="EventDate2" PropertyName="Value" />
 </SelectParameters>
</asp:SqlDataSource>

【讨论】:

    【解决方案3】:

    我通常觉得这样做更简单:

    select * from Events where Month(EventDate) = Month(getdate())
    

    如果用户可以选择月份,那么您只需用一个参数替换月份编号(从选择列表返回)。

    附: - 如果您想对事件数据(每小时计数、每天计数等)进行更复杂的汇总分析,并且您使用的是 SQL Server 2005+,那么this post 中描述的函数可能会很有用。

    【讨论】:

      猜你喜欢
      • 2014-11-04
      • 2013-09-21
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多