に次の T-SQL がありますSelectCommand
。
SELECT h.Business,
hrl.frn
FROM registration hrl
INNER JOIN holder h on h.call = hrl.call
WHERE
(h.Business like '%' + @business + '%' and h.Business is not null)
and
(hrl.frn = @frn and hrl.frn is not null)
business
およびfrn
制御パラメーターに関連付けられており、一方または両方が空白のままであってもデータを返す必要がありますがfrn
、たとえばデータを入力しても何も返されません。私のT-SQLは正しいことをしていないと思います。また、like
正しく処理しているかどうかもわかりません。
両方のテキスト ボックスが空のままの場合は、すべてのデータが返されます。frn
が入力されてbusiness
いるが空白のままの場合、それに関連するデータのみが返されますfrn
。business
入力されたfrn
が空白のままの場合、すべての一致を返す必要がありますlike
business
。両方が入力された場合、frn
と に一致するデータのみが返されますbusiness
。
and is not null
また、実際に必要かどうかもわかりません。
protected void btnSearch_Click(object sender, EventArgs e)
{
if (txtFRN.Text == "")
frn = null;
if (txtBusiness.Text == "")
business = null;
sqlDsMaster.SelectParameters[frn].DefaultValue = frn;
sqlDsMaster.SelectParameters[business].DefaultValue = business;
sqlDsMaster.DataBind();
}
上記は、次の行に到達すると、「インスタンスに設定されていないオブジェクト参照」をスローします。
sqlDsMaster.SelectParameters[frn].DefaultValue = frn;
frn
およびbusiness
プロパティです。
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
ストアド プロシージャは次のとおりです。
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)
手順は次のとおりSqlDataSource
です。SearchMaster
<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>
手順は次のとおりSqlDataSource
です。SearchDetails
<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();
}
}
}
SearchMaster
SQL Server Management Studio で実行すると両方とも機能し、とのSearchDetails
両方のデータを入力すると機能しますが、1 つだけを入力するとデータは返されません。パラメータは正しく設定されていますか?また、プロシージャでパラメータを初期化する場合、引き続き を使用する必要がありますか?business
frn
null
ConvertEmptyStringToNull