Установка DateTime в качестве параметра SqlDataSource для Gridview

Эй, я хотел бы отобразить определенные данные с моей хранимой процедурой за последние 30 дней. вот что я сделал (файл aspx.cs):

 protected void Page_Load(object sender, EventArgs e)     
        {
          DateTime toDate, fromDate;
          toDate = DateTime.Now;

          fromDate = toDate.Subtract(new TimeSpan(31, 0, 0, 0));

          SqlDataSource1.SelectParameters.Add("fromDate", DbType.DateTime, fromDate.ToString());
          SqlDataSource1.SelectParameters.Add("toDate", DbType.DateTime, toDate.ToString());                    

    }

вот мой aspx-файл

 <form id="form1" runat="server">
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" Width="232px" DataKeyNames="CustomerId" DataSourceID="SqlDataSource1">
            <Columns>
                <asp:BoundField DataField="CreationDate" HeaderText="CreationDate" SortExpression="CreationDate" />
            </Columns>
        </asp:GridView>
        <br />
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:SSEnewConnectionString %>"
            SelectCommand="procCustomer_SelectbyCreationDate" SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:Parameter DbType="DateTime" Name="fromDate" />
                <asp:Parameter DbType="DateTime" Name="toDate" />
            </SelectParameters>
        </asp:SqlDataSource>
        </form>

когда я тестирую это, мой экран становится пустым (кроме элементов мастер-страницы) и никаких ошибок. есть идеи?


person user1051364    schedule 09.01.2012    source источник
comment
хорошо, у вас есть какие-либо данные там?   -  person V4Vendetta    schedule 09.01.2012


Ответы (1)


РЕДАКТИРОВАТЬ: Несмотря на то, что была принята более ранняя версия этого ответа, похоже, я неправильно понял используемый тип параметра. веб-элементы управления ParameterCollection выглядит несколько ужасно.

Я бы предложил преобразовать значения даты в формат SQL (как бы это меня ни мучило, честно говоря, преобразования строк следует избегать, насколько это возможно). Например:

SqlDataSource1.SelectParameters.Add("fromDate", DbType.DateTime,
    fromDate.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture));
SqlDataSource1.SelectParameters.Add("toDate", DbType.DateTime,
    toDate.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture));

(Измените на yyyy-MM-dd для типов только для даты.)

Я сам не использовал SqlDataSource, но также похоже, что вы вводите параметры дважды: один раз в разметке и один раз в коде. Учитывая, что у вас нет значений в разметке (в том числе в привязках), вы можете удалить их оттуда, но я могу ошибаться на этом фронте.

Если ваш запрос не работает так, как вы ожидаете, вам следует проверить журналы базы данных (или любой другой подходящий инструмент), чтобы проверить, какой фактический запрос выполняется.

person Jon Skeet    schedule 09.01.2012
comment
Если я удаляю toString(), я получаю следующую ошибку. Лучший перегруженный метод, соответствующий «System.Web.UI.WebControls.ParameterCollection.Add (string, System.Data.DbType, string)», имеет некоторые недопустимые аргументы. - person user1051364; 09.01.2012
comment
Кроме того, удаление параметров из файла aspx, казалось, решило проблему... по крайней мере, теперь я получаю некоторые данные на экране. Хотя мне пришлось использовать преобразование toString()... - person user1051364; 09.01.2012
comment
У меня точно такая же проблема. Метод .Add позволяет использовать только строки, и в моем случае это вызывает ошибку в SQL. Не совсем уверен, как действовать. - person carny666; 04.03.2014
comment
@ carny666: Нет, это действительно не только строки. Я предлагаю вам задать новый вопрос с соответствующими подробностями. - person Jon Skeet; 04.03.2014
comment
@JonSkeet Конечно .. но я бы задал ТОЧНО тот же вопрос, но указал, что метод .Add позволит мне использовать только строку независимо от того, какой тип я выбрал, более того, .DefaultValue будет принимать только строку в качестве аргумента. В моем случае преобразование моего DateTime в строку для использования этих методов вызывает ошибку SQL. ORA-01036: недопустимое имя/номер переменной - person carny666; 04.03.2014
comment
@ carny666: Что вы имеете в виду, говоря, что я могу использовать только строку? Где именно и какую ошибку вы получаете в противном случае? И каков тип вашего источника данных здесь? (Обратите внимание, что этот вопрос касается SqlDataSource...) - person Jon Skeet; 04.03.2014
comment
@JonSkeet dsLadleStatus.SelectParameters[SHIFT_ST_EST].DefaultValue = shiftd; shiftd должен иметь typestring... dsLadleStatus.SelectParameters.Add(SHIFT_ST_EST, TypeCode.DateTime, shiftd); Опять же... shiftd должен быть typestring... - person carny666; 04.03.2014
comment
@carny666: Верно, да, третий параметр имеет тип string. (Раньше мне было непонятно, что вы имели в виду.) Должен признаться, когда я писал этот ответ (давным-давно), я подозревал, что путаюсь с SqlDbParameter. Это выглядит как совершенно ужасный API - я все же отредактирую некоторые предложения. - person Jon Skeet; 04.03.2014
comment
Если у yyyy-MM-dd есть проблемы, поскольку формат даты на сервере — YDM, попробуйте вместо этого yyyyMMdd. - person mjwills; 30.11.2020