Вычисление параметра запроса T-SQL во время загрузки - PullRequest
0 голосов
/ 19 апреля 2009

Я пытаюсь ВЫБРАТЬ записи из базы данных событий (с полем 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>

Как изменить параметры EventDate и EventDate2 в SQLDataSource для использования GetFirstofMonth (DateTime.Today); и GetLastofMonth (DateTime.Today) соответственно как их значения? Или это невозможно?

Ответы [ 3 ]

3 голосов
/ 19 апреля 2009

Это можно сделать, обработав событие SqlDataSource «Выбор» следующим образом:

<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
}
1 голос
/ 19 апреля 2009

Обычно мне проще:

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

Если месяц может быть выбран пользователем, вы просто подставляете параметр для номера месяца (возвращаемого из списка выбора).

P.S. - Если вы хотите выполнить более сложный сводный анализ данных вашего события (счет в час, день и т. Д.) И используете SQL Server 2005+, то может быть полезна функция, описанная в в этом сообщении .

1 голос
/ 19 апреля 2009

Один из способов сделать это - поместить на страницу скрытые поля, установить значения этих полей в коде с датами, используя методы, а затем привязать параметры источника данных к скрытым полям.

Codebehind

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...