单击按钮时的 SqlDataSource 重新查询
SqlDataSource requery on button click
我遇到了 asp:SqlDataSource 的问题。我正在尝试根据开始日期和结束日期提取一些数据。我希望这些数据能够拉出最近 24 小时的负载,但现在我只是想把它全部拉回来进行测试。我有两个 asp:TextBox 控件,一个开始日期和一个结束日期。
没什么特别的,应该很简单...
我的问题是将存储过程参数绑定到 asp:TextBox。 TextBox 将我在文本框中键入的文本放入 'Text' 属性中。似乎有道理,但问题是 asp 将此控件转换为输入标签,然后将输入的文本放入值属性中。
现在,在配置 SqlDataSource 时,它想使用实际页面上不存在的 controlName.Text。这是 controlName.value.
如果我尝试将 asp:ControlParameter 绑定到 controlName.value,我会收到一条错误消息,指出值不是 TextBox 的 属性。没错...这是一个 属性 的输入,这将是...所以它不会让我这样做。
如果我有直接的 sql 查询,我会取回数据。当我使用所有默认值测试存储过程时,我会取回数据。一旦我加入控制,我什么也得不到。我确实处理传递到日期字段的空值和空字符串,所以我不认为是这样。
总之,我迷路了。帮助!
初始HTML:
<asp:TextBox ID="startDate" Width="10em" runat="server" AutoPostBack="true"></asp:TextBox>
生成HTML:
<input type="text" style="width:10em;" id="startDate" onkeypress="if (WebForm_TextBoxKeyHandler(event) == false) return false;" onchange="javascript:setTimeout('__doPostBack(\'startDate\',\'\')', 0)" value="2000/07/13 00:00" name="startDate">
失败:
<asp:SqlDataSource ID="employeesSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:DbConnectionString %>" SelectCommand="SPRT_GetRecords" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:ControlParameter ControlID="startDate" Name="StartDate" PropertyName="Text" Type="DateTime" />
<asp:ControlParameter ControlID="endDate" Name="EndDate" PropertyName="Text" Type="DateTime" />
<asp:Parameter Name="GetLogs" Type="Boolean" />
<asp:Parameter Name="LogType" Type="Decimal" />
</SelectParameters>
</asp:SqlDataSource>
失败:
<asp:SqlDataSource ID="employeesSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:DbConnectionString %>" SelectCommand="SPRT_GetRecords" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="StartDate" Type="DateTime" />
<asp:Parameter Name="EndDate" Type="DateTime" />
<asp:Parameter Name="GetLogs" Type="Boolean" />
<asp:Parameter Name="LogType" Type="Decimal" />
</SelectParameters>
</asp:SqlDataSource>
有效但不引入控制输入:
<asp:SqlDataSource ID="employeesSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:DbConnectionString %>" SelectCommand="declare @SDate datetime
set @SDate = DateAdd(dd, -100, GetDate())
EXEC SPRT_GetRecords @StartDate = @SDate, @EndDate = null, @GetLogs = 0, @LogType = 0"></asp:SqlDataSource>
你能在按钮点击事件的后台代码中做到这一点吗?或者将其设为日期时间而不是字符串,然后执行相同的操作。
string startdate = startDate.text;
//OR DateTime
employeesSqlDataSource.SelectParameters.Add("@SDate", startdate);
好吧,在和别人商量之后,没有想出太多,我能够从不同的角度看一看并找出答案。
我假设因为我在我的存储过程中设置了一个默认值,所以我不必为可选参数指定一个值。这不是真的...
我的问题的解决方案是添加默认值。请注意,下面的两个 asp:parameters 现在具有默认值。我希望这会引发错误并让它冒泡给我,而不是默默地爆炸而不返回任何结果。
<asp:SqlDataSource ID="employeesSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:DbConnectionString %>" SelectCommand="SPRT_GetRecords" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:ControlParameter ControlID="startDate" Name="StartDate" PropertyName="Text" Type="DateTime" />
<asp:ControlParameter ControlID="endDate" Name="EndDate" PropertyName="Text" Type="DateTime" />
<asp:Parameter DefaultValue="false" Name="GetLogs" Type="Boolean" />
<asp:Parameter DefaultValue="0" Name="LogType" Type="Decimal" />
</SelectParameters>
此外,我在 Page_Load 方法中为 start/end 日期设置默认值,如下所示:
if (!IsPostBack)
{
// Default the grid to the last 24 hours worth of data
employeesSqlDataSource.SelectParameters["startDate"].DefaultValue = DateTime.Now.AddDays(-1).ToString();
employeesSqlDataSource.SelectParameters["endDate"].DefaultValue = DateTime.Now.ToString();
...
...
}
为了让按钮工作,我只是做了一些验证,然后在 onclick 中调用 SqlDataSource 上的 DataBind()。
protected void searchButton_Click(object sender, EventArgs e)
{
CheckDates();
if (string.IsNullOrEmpty(startDate.Text)) employeesSqlDataSource.SelectParameters["startDate"].DefaultValue = SqlDateTime.MinValue.ToString();
if (string.IsNullOrEmpty(endDate.Text)) employeesSqlDataSource.SelectParameters["endDate"].DefaultValue = SqlDateTime.MaxValue.ToString();
employeesSqlDataSource.DataBind();
}
最后一行很重要。
希望这对有需要的人有所帮助。
我遇到了 asp:SqlDataSource 的问题。我正在尝试根据开始日期和结束日期提取一些数据。我希望这些数据能够拉出最近 24 小时的负载,但现在我只是想把它全部拉回来进行测试。我有两个 asp:TextBox 控件,一个开始日期和一个结束日期。
没什么特别的,应该很简单...
我的问题是将存储过程参数绑定到 asp:TextBox。 TextBox 将我在文本框中键入的文本放入 'Text' 属性中。似乎有道理,但问题是 asp 将此控件转换为输入标签,然后将输入的文本放入值属性中。
现在,在配置 SqlDataSource 时,它想使用实际页面上不存在的 controlName.Text。这是 controlName.value.
如果我尝试将 asp:ControlParameter 绑定到 controlName.value,我会收到一条错误消息,指出值不是 TextBox 的 属性。没错...这是一个 属性 的输入,这将是...所以它不会让我这样做。
如果我有直接的 sql 查询,我会取回数据。当我使用所有默认值测试存储过程时,我会取回数据。一旦我加入控制,我什么也得不到。我确实处理传递到日期字段的空值和空字符串,所以我不认为是这样。
总之,我迷路了。帮助!
初始HTML:
<asp:TextBox ID="startDate" Width="10em" runat="server" AutoPostBack="true"></asp:TextBox>
生成HTML:
<input type="text" style="width:10em;" id="startDate" onkeypress="if (WebForm_TextBoxKeyHandler(event) == false) return false;" onchange="javascript:setTimeout('__doPostBack(\'startDate\',\'\')', 0)" value="2000/07/13 00:00" name="startDate">
失败:
<asp:SqlDataSource ID="employeesSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:DbConnectionString %>" SelectCommand="SPRT_GetRecords" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:ControlParameter ControlID="startDate" Name="StartDate" PropertyName="Text" Type="DateTime" />
<asp:ControlParameter ControlID="endDate" Name="EndDate" PropertyName="Text" Type="DateTime" />
<asp:Parameter Name="GetLogs" Type="Boolean" />
<asp:Parameter Name="LogType" Type="Decimal" />
</SelectParameters>
</asp:SqlDataSource>
失败:
<asp:SqlDataSource ID="employeesSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:DbConnectionString %>" SelectCommand="SPRT_GetRecords" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="StartDate" Type="DateTime" />
<asp:Parameter Name="EndDate" Type="DateTime" />
<asp:Parameter Name="GetLogs" Type="Boolean" />
<asp:Parameter Name="LogType" Type="Decimal" />
</SelectParameters>
</asp:SqlDataSource>
有效但不引入控制输入:
<asp:SqlDataSource ID="employeesSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:DbConnectionString %>" SelectCommand="declare @SDate datetime
set @SDate = DateAdd(dd, -100, GetDate())
EXEC SPRT_GetRecords @StartDate = @SDate, @EndDate = null, @GetLogs = 0, @LogType = 0"></asp:SqlDataSource>
你能在按钮点击事件的后台代码中做到这一点吗?或者将其设为日期时间而不是字符串,然后执行相同的操作。
string startdate = startDate.text;
//OR DateTime
employeesSqlDataSource.SelectParameters.Add("@SDate", startdate);
好吧,在和别人商量之后,没有想出太多,我能够从不同的角度看一看并找出答案。
我假设因为我在我的存储过程中设置了一个默认值,所以我不必为可选参数指定一个值。这不是真的...
我的问题的解决方案是添加默认值。请注意,下面的两个 asp:parameters 现在具有默认值。我希望这会引发错误并让它冒泡给我,而不是默默地爆炸而不返回任何结果。
<asp:SqlDataSource ID="employeesSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:DbConnectionString %>" SelectCommand="SPRT_GetRecords" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:ControlParameter ControlID="startDate" Name="StartDate" PropertyName="Text" Type="DateTime" />
<asp:ControlParameter ControlID="endDate" Name="EndDate" PropertyName="Text" Type="DateTime" />
<asp:Parameter DefaultValue="false" Name="GetLogs" Type="Boolean" />
<asp:Parameter DefaultValue="0" Name="LogType" Type="Decimal" />
</SelectParameters>
此外,我在 Page_Load 方法中为 start/end 日期设置默认值,如下所示:
if (!IsPostBack)
{
// Default the grid to the last 24 hours worth of data
employeesSqlDataSource.SelectParameters["startDate"].DefaultValue = DateTime.Now.AddDays(-1).ToString();
employeesSqlDataSource.SelectParameters["endDate"].DefaultValue = DateTime.Now.ToString();
...
...
}
为了让按钮工作,我只是做了一些验证,然后在 onclick 中调用 SqlDataSource 上的 DataBind()。
protected void searchButton_Click(object sender, EventArgs e)
{
CheckDates();
if (string.IsNullOrEmpty(startDate.Text)) employeesSqlDataSource.SelectParameters["startDate"].DefaultValue = SqlDateTime.MinValue.ToString();
if (string.IsNullOrEmpty(endDate.Text)) employeesSqlDataSource.SelectParameters["endDate"].DefaultValue = SqlDateTime.MaxValue.ToString();
employeesSqlDataSource.DataBind();
}
最后一行很重要。
希望这对有需要的人有所帮助。