ASP.NET SQLDataSource SelectParameters значение по умолчанию не работает - PullRequest
0 голосов
/ 06 сентября 2018

Я написал простую ASP.NET форму для управления конкретным запросом в моей базе данных (MySQL). Такой запрос обрабатывается этой хранимой процедурой:

CREATE DEFINER=`root`@`localhost` PROCEDURE `noleggio_conducenti`(IN _id_convenzionato INT(10))
BEGIN
IF _id_convenzionato IS NOT NULL THEN
    SELECT * FROM
    (
        SELECT 
            *
        FROM
            noleggi AS H
        WHERE
            id_convenzionato = _id_convenzionato 

        UNION 

        SELECT 
            *
        FROM
            noleggi AS H
        WHERE
            id_convenzionato IN (SELECT 
                    id_recipiente
                FROM
                    sosautomotive.transizioni_point
                WHERE
                    id_cedente = _id_convenzionato )
    ) H
    WHERE (H.uscita IS NOT NULL) AND (H.rientro IS NOT NULL);
ELSE
    SELECT 
        *
    FROM
        noleggi
    WHERE (uscita IS NOT NULL) AND (rientro IS NOT NULL);
END IF;
END

Как видите, единственным параметром может быть NULL ... я надеялся использовать эту хранимую процедуру для предоставления данных следующему SQLDataSource объекту:

<asp:SqlDataSource 
    ID="_sdsConducenti" 
    runat="server"
    ConnectionString="<%$ ConnectionStrings:sos_db %>"
    ProviderName="<%$ ConnectionStrings:sos_db.ProviderName %>" 
    SelectCommandType="StoredProcedure"
    SelectCommand="noleggio_conducenti">
    <SelectParameters>
        <asp:Parameter Name="_id_convenzionato" Type="Int32" DefaultValue="" ConvertEmptyStringToNull="true" />
    </SelectParameters>
</asp:SqlDataSource>

Предоставляет данные для GridView :

<asp:GridView
    ID="_gvConducenti"
    runat="server"
    DataSourceID="_sdsConducenti"
    OnSorting="_gvConducenti_Sorting"
    OnPageIndexChanging="_gvConducenti_PageIndexChanging"
    OnRowDataBound="_gvConducenti_RowDataBound"
    AutoGenerateColumns="false"
    EmptyDataText="Nessun conducente presente."
    BorderStyle="None"
    CellSpacing="0"
    CellPadding="0"
    ShowHeader="true"
    ShowFooter="true"
    AllowSorting="true"
    AllowPaging="true"
    PageSize="10"
    GridLines="Horizontal"
    SelectedIndex="0"
    Style="width: 100%;" 
    HorizontalAlign="Center">
    <SelectedRowStyle CssClass="SelRow" />
    <HeaderStyle CssClass="GridHeader" />
    <AlternatingRowStyle BackColor="#F7F5E9" CssClass="AltRow" />
    <PagerStyle HorizontalAlign="Center" />
    <PagerSettings
        Visible="true"
        Mode="NumericFirstLast"
        PageButtonCount="3"
        Position="Bottom"
        NextPageText="Pagina successiva"
        PreviousPageText="Pagina precedente"
        FirstPageText="Prima pagina"
        LastPageText="Ultima pagina" />
    <Columns>
        <asp:TemplateField Visible="false">
            <HeaderTemplate>&nbsp;</HeaderTemplate>
            <ItemTemplate>
                <%#Eval("idnoleggio")%>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Numero" SortExpression="numero">
            <ItemTemplate>
                <asp:LinkButton 
                    runat="server" 
                    CommandArgument='<%# Eval("idnoleggio")%>' 
                    CommandName="Link" 
                    OnCommand="Link_Command">
                        <%#Eval("numero_completo")%>
                </asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField HeaderText="Conducente" DataField="conducente" />
        <asp:BoundField HeaderText="Via" DataField="conducente_via" />
        <asp:BoundField HeaderText="N° Civico" DataField="conducente_num_civico" />
        <asp:BoundField HeaderText="CAP" DataField="conducente_cap" />
        <asp:BoundField HeaderText="Città" DataField="conducente_residente_in" />
        <asp:BoundField HeaderText="Prov." DataField="conducente_residente_in_provincia" />
        <asp:BoundField HeaderText="Convenzionato" DataField="convenzionato" />
        <asp:BoundField HeaderText="Uscita" DataField="uscita" DataFormatString="{0:dd/MM/yyyy HH:mm}" />
        <asp:BoundField HeaderText="Rientro" DataField="rientro" DataFormatString="{0:dd/MM/yyyy HH:mm}" />
        <asp:BoundField HeaderText="Tipologia noleggio" DataField="modalita_noleggio" />
    </Columns>
</asp:GridView>

конечно, эта форма имеет другие поля, используемые для фильтрации запроса, которые обрабатываются этой парой функций:

private void Ricerca()
{
    if (!String.IsNullOrWhiteSpace(_txtConvenzionato.Text.Trim()))
    {
        int _nIdConvenzionato = CUtilita.RitornaIdConvenzionato(_txtConvenzionato.Text);

        if (_nIdConvenzionato != -1)
            _sdsConducenti.SelectParameters["_id_convenzionato"].DefaultValue = _nIdConvenzionato.ToString();
        else
            _sdsConducenti.SelectParameters["_id_convenzionato"].DefaultValue = null;
    }

    _sdsConducenti.FilterExpression = Filter();

}

private string Filter()
{
    StringBuilder _sbFilter = new StringBuilder();

    try
    {
        #region Data fine noleggio

        if (!string.IsNullOrWhiteSpace(_txtDallaDataFineNoleggio.Text.Trim()) &&
            !string.IsNullOrWhiteSpace(_txtAllaDataFineNoleggio.Text.Trim()))
        {
            DateTime _dtDallaDataFineNoleggio = DateTime.Parse(_txtDallaDataFineNoleggio.Text.Trim());
            DateTime _dtAllaDataFineNoleggio = DateTime.Parse(_txtAllaDataFineNoleggio.Text.Trim());

            _sbFilter.AppendFormat("((uscita>='{0:yyyy-MM-dd}') AND (uscita<='{1:yyyy-MM-dd}'))", _dtDallaDataFineNoleggio, _dtAllaDataFineNoleggio);
        }
        else if (string.IsNullOrWhiteSpace(_txtDallaDataFineNoleggio.Text.Trim()) &&
            !string.IsNullOrWhiteSpace(_txtAllaDataFineNoleggio.Text.Trim()))
        {
            DateTime _dtAllaDataFineNoleggio = DateTime.Parse(_txtAllaDataFineNoleggio.Text.Trim());
            _sbFilter.AppendFormat("(uscita<='{0:yyyy-MM-dd}')", _dtAllaDataFineNoleggio);
        }
        else if (!string.IsNullOrWhiteSpace(_txtDallaDataFineNoleggio.Text.Trim()) &&
            string.IsNullOrWhiteSpace(_txtAllaDataFineNoleggio.Text.Trim()))
        {
            DateTime _dtDallaDataFineNoleggio = DateTime.Parse(_txtDallaDataFineNoleggio.Text.Trim());
            _sbFilter.AppendFormat("(uscita>='{0:yyyy-MM-dd}')", _dtDallaDataFineNoleggio);
        }

        #endregion
    }
    catch (FormatException ex)
    {
        _lblStatus.Text = ex.Message;
        _lblStatus.ForeColor = System.Drawing.Color.Red;
    }

    try
    {
        #region Data esportazione

        if (!string.IsNullOrWhiteSpace(_txtDallaDataEstrazione.Text.Trim()) &&
            !string.IsNullOrWhiteSpace(_txtAllaDataEstrazione.Text.Trim()))
        {
            DateTime _dtDallaDataEstrazione = DateTime.Parse(_txtDallaDataEstrazione.Text.Trim());
            DateTime _dtAllaDataEstrazione = DateTime.Parse(_txtAllaDataEstrazione.Text.Trim());

            _sbFilter.AppendFormat("((data_esportazione_conducenti>='{0:yyyy-MM-dd}') AND (data_esportazione_conducenti<='{1:yyyy-MM-dd}'))", _dtDallaDataEstrazione, _dtAllaDataEstrazione);
        }
        else if (string.IsNullOrWhiteSpace(_txtDallaDataEstrazione.Text.Trim()) &&
            !string.IsNullOrWhiteSpace(_txtAllaDataEstrazione.Text.Trim()))
        {
            DateTime _dtAllaDataEstrazione = DateTime.Parse(_txtAllaDataEstrazione.Text.Trim());
            _sbFilter.AppendFormat("(data_esportazione_conducenti<='{0:yyyy-MM-dd}')", _dtAllaDataEstrazione);
        }
        else if (!string.IsNullOrWhiteSpace(_txtDallaDataEstrazione.Text.Trim()) &&
            string.IsNullOrWhiteSpace(_txtAllaDataEstrazione.Text.Trim()))
        {
            DateTime _dtDallaDataEstrazione = DateTime.Parse(_txtDallaDataEstrazione.Text.Trim());
            _sbFilter.AppendFormat("(data_esportazione_conducenti>='{0:yyyy-MM-dd}')", _dtDallaDataEstrazione);
        }

        #endregion
    }
    catch (FormatException ex)
    {
        _lblStatus.Text = ex.Message;
        _lblStatus.ForeColor = System.Drawing.Color.Red;
    }

    #region Tipo Noleggio

    if (!string.IsNullOrWhiteSpace(_ddlTipoNoleggio.SelectedValue) && !_ddlTipoNoleggio.SelectedValue.Equals("TUTTI"))
    {
        if (_sbFilter.Length > 0)
            _sbFilter.Append(" AND");

        _sbFilter.Append("(modalita_noleggio = '" + _ddlTipoNoleggio.SelectedValue + "')");
    }

    #endregion

    if (_sbFilter.Length == 0)
        return null;

    return _sbFilter.ToString();

}

Я протестировал хранимую процедуру через MySQL Workbench и уверен, что она работает (как с допустимым параметром, так и с NULL ). НО, когда я пытаюсь использовать его в форме, он работает ТОЛЬКО, если задано значение параметра и когда тогда значение установлено на NULL (то есть _sdsConducenti.SelectParameters["_id_convenzionato"].DefaultValue = null), запрос не предоставил никаких данных (хотя он должен извлекать большое количество записей). Где я потерпел неудачу? Как я могу проверить, правильно ли установлено значение NULL в качестве значения параметра перед вызовом хранимой процедуры?

Полный код доступен здесь .

1 Ответ

0 голосов
/ 07 сентября 2018

Попробуйте указать свойство ниже в определении SQLDataSource -

CancelSelectOnNullParameter = "ложь"

И это описывается как

true, если операция извлечения данных отменяется, когда параметр содержится в коллекции SelectParameters с нулевым значением; иначе ложно. По умолчанию установлено значение

Подобная проблема объясняется здесь -

Установить для параметра SqlDataSource значение null

Для получения дополнительной информации см. здесь-

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...