过滤Web表单GridView基于DatePicker不返回数据



我有一个web表单与gridview和两个日期选择器和提交提交新的查询与日期时间的约束。作为筛选数据的开始和结束日期。即使没有数据,数据也可以很好地加载,当点击带有所选日期的提交按钮时,什么也没有发生。我想知道如果过滤的数据没有被正确绑定(我是新的web表单和gridview。)下面是该页面的代码:

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
BindDataToGridView();
}
protected void dashboard_RowEditing(object sender, GridViewEditEventArgs e)
{
gridErrors.Text = string.Empty;
dashboard.EditIndex = e.NewEditIndex;
BindDataToGridView();
}
protected void dashboard_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
dashboard.EditIndex = -1;
BindDataToGridView();
}
protected void dashboard_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
dashboard.PageIndex = e.NewPageIndex;
BindDataToGridView();
}
protected void dashboard_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
gridErrors.Text = string.Empty;
GridViewRow tabRow = (GridViewRow)dashboard.Rows[e.RowIndex];
HiddenField hdnTabId = (HiddenField)tabRow.FindControl("hdnTabId");
TextBox TxtName = (TextBox)tabRow.Cells[1].Controls[0];
}
protected void button1_Click(object sender, EventArgs e)
{
var start = startDate.Text;
var startTime = DateTime.Parse(start);
var sqlStart = startTime.ToString("yyyy-MM-dd");
var end = endDate.Text;
var endTime = DateTime.Parse(end);
var sqlEnd = endTime.ToString("yyyy-MM-dd");
string sqlQuery = "SELECT TOP(100) TabID, TabName, Title, CreatedOnDate, TabPath From TableName " +
"where CreatedOnDate >= " + sqlStart + " and CreatedOnDate <= " + sqlEnd +   " Order By TabName";
BindDataToGridView(sqlQuery);
}
public void BindDataToGridView(string sqlQuery =
"SELECT TOP(100) TabID, TabName, Title, CreatedOnDate, TabPath From TableName Order By TabName")
{
var connectionFromConfig = WebConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
using (SqlConnection db = new SqlConnection(connectionFromConfig))
{
try
{
db.Open();
SqlCommand command = new SqlCommand(sqlQuery, db);
SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet);
if (dataSet.Tables[0].Rows.Count > 0)
{
dashboard.DataSource = dataSet;
dashboard.DataBind();
}
}
catch (SqlException ex)
{
gridErrors.Text = ex.Message;
}
finally
{
db.Close();
db.Dispose();
}
}
}
<<p>OnPageIndexChanging方法/strong>
protected void dashboard_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
dashboard.PageIndex = e.NewPageIndex;
BindDataToGridView();
}

好的,您找到了问题(缺少引号)。但是,在一天结束的时候?是的,每个人都会蜂拥而至,记录如何"何时"。对于用户输入,您不希望将其连接到SQL中(对于SQL注入来说风险太高)。

然而,只是告诉你不要连接参数并没有帮助,除非我们也给你一个很好的设计方法。看看你的代码,你做了一个伟大的想法,有一个网格视图加载例程。你也想很容易地传递sql到那个例程。然而,这个伟大的想法和目标与使用强类型参数相冲突。

那么,让我们一箭双雕吧。

并发现使用参数通常比使用冗长混乱的sql字符串更少的代码,这很容易出错(这就是为什么你必须在这里发布)。

对于数字-没有引号,对于字符串-是,对于日期,还是是。这是额外的开发人员工作量。而且这个又长又乱的字符串很难编写、调试和管理。

所以,我建议这样写:

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
BindDataToGridView();
}
void BindDataToGridView(SqlCommand cmdSQL = null)
{
// default sql
if (cmdSQL is null)
{
cmdSQL = new 
SqlCommand("SELECT TabID, TabName, Title, CreatedOnDate, TabPath From TableName Order By TabName");
}

using (cmdSQL)
{
cmdSQL.Connection = new SqlConnection(conString);
cmdSQL.Connection.Open();
DataTable rst = new DataTable();            
rst.Load(cmdSQL.ExecuteReader());
dashboard.DataSource = rst;
dashboard.DataBind();
}
}

注意几点:我们不需要创建一个单独的连接对象- sqlcommand有一个!!(因为我们没有创建一个单独的连接对象,那么处理SQL命令就会在using块中处理它!!)

我们不需要单独的数据表/数据集,我们不需要数据适配器,我们也不需要阅读器!!(sql命令对象也有读取器!!).

现在我们可以不带参数调用load grid了

但是,当我们想传递带有参数的sql时?然后我们可以这样做:

{
string sqlQuery 
= "SELECT TabID, TabName, Title, CreatedOnDate, TabPath From TableName " +
"WHERE CreatedOnDate >= @Start AND CreatedOnDate  <= @End ORDER By TabName";
SqlCommand cmdSQL = new SqlCommand(sqlQuery);
cmdSQL.Parameters.Add("@Start", SqlDbType.Date).Value = startDate.Text;
cmdSQL.Parameters.Add("@End", SqlDbType.Date).Value = endDate.Text;
BindDataToGridView(cmdSQL);
}

所以,实际上,我们可以有参数,我们可以有更少的代码。我们可以很容易地读取SQL,并且我们可以将cmd SQL传递给那个例程。

所以它不仅建议不要连接字符串,而且通过正确的方法,我们不必这样做,我们得到了强数据类型转换,更少的代码,甚至代码中更少的错误机会。

另外,检查sql server列是日期还是datetime。如果是datetime,则在查询参数中指定该数据类型。

还可以放下TOP子句——只有在创建理论上不支持排序输出的SQL视图时才需要。但是对于原始sql,您可以删除TOP子句。

我需要在sqlStart和sqlEnd变量之前和之后添加单引号,以便Sql Server使用具有比较运算符的值

最新更新