我写了一个简单的 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> </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 值是否正确设置为参数值?
可用的完整代码here。
答案 0 :(得分:1)
尝试在SQLDataSource定义中指定以下属性-
CancelSelectOnNullParameter =“ false”
它被描述为
如果参数取消了数据检索操作,则为true SelectParameters集合中包含的值评估为null; 否则为假。默认值为true
类似的问题在这里解释-
Set SqlDataSource parameter to null
有关更多信息,请参见here-