【发布时间】:2009-03-27 18:10:08
【问题描述】:
如果我在 Sql Management Studio 中运行 SearchMaster 和 SearchDetails 这两个过程,当我在设计视图中设置存储过程时测试查询时,SearchMaster 甚至运行良好,但是当我运行它时,没有行如果我只输入 frn 或业务的信息,则创建。如果我同时输入,如果匹配,我会得到数据。参数设置是否正确?另外,如果我在程序中将参数初始化为null,是否还需要使用ConvertEmptyStringToNull?
这是 SearchMaster 存储过程:
CREAETE PROCEDURE SearchMaster
@business nvarchar(300) = NULL,
@frn nvarchar(10) = NULL
AS
SELECT h.Business,
hrl.frn
FROM registration hrl
INNER JOIN holder h on h.call = hrl.call
WHERE (@business IS NULL OR h.Business like '%' + @business + '%')
AND (@frn IS NULL OR hrl.frn = @frn)
这里是 SearchDetails StoredProcedure:
CREATE PROCEDURE SearchDetails
@business nvarchar(300) = NULL,
@frn nvarchar(10) = NULL
AS
SELECT hrl.call
FROM registration hrl
INNER JOIN holder h ON h.call = hrl.call
WHERE (@business IS NULL OR h.Business LIKE '%' + @business + '%')
AND (@frn IS NULL OR hrl.frn = @frn)
这是 SearchMaster 过程的 SqlDataSource:
<asp:SqlDataSource ID="sqlDsDetails"
runat="server"
ConnectionString="<%$ ConnectionStrings:cnxString %>
SelectCommandType="StoredProcedure"
SelectCommand="SearchMaster">
<SelectParameters>
<asp:ControlParameter Name="business" ControlID="txtBusiness"
Type="String" PropertyName="Text"
ConvertEmptyStringToNull="true" />
<asp:ControlParameter Name="frn" ControlID="txtFRN"
Type="String" PropertyName="Text"
ConvertEmptyStringToNull="true"/>
</SelectParameters>
</asp:SqlDataSource>
这是 SearchDetails 过程的 SqlDataSource:
<asp:SqlDataSource ID="sqlDsDetails"
runat="server"
ConnectionString="<%$ ConnectionStrings:cnxString %>
SelectCommandType="StoredProcedure"
SelectCommand="SearchDetails">
<SelectParameters>
<asp:Parameter Name="frn" Type="String" DefaultValue=""
ConvertEmptyStringToNull="true" />
<asp:Parameter Name="business" Type="String" DefaultValue=""
ConvertEmptyStringToNull="true" />
</SelectParameters>
</asp:SqlDataSource>
这里是绑定SqlDsMaster的按钮点击:
protected void btnSearch_Click(object sender, EventArgs e)
{
sqlDsMaster.DataBind();
}
这是为详细信息创建行的 gvMaster_RowCreated:
protected void gvMaster_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
SqlDataSource ctrl =
e.Row.FindControl("sqlDsDetails") as SqlDataSource;
if (ctrl != null && e.Row.DataItem != null)
{
ctrl.SelectParameters["frn"].DefaultValue =
((DataRowView)e.Row.DataItem)["frn"].ToString();
ctrl.SelectParameters["business"].DefaultValue =
((DataRowView)e.Row.DataItem)["business"].ToString();
}
}
}
我运行了 SQL 探查器,当只输入一个参数时,探查器甚至没有显示过程正在运行。当我输入这两个参数时,程序显示在分析器中运行。
【问题讨论】:
-
根据您的上一条评论,我 100% 确定这将解决它:确保在您的数据源上设置 CancelSelectOnNullParameter="False"
标签: c# asp.net sqldatasource