首页 > 解决方案 > 使用条件时,ASP.NET webforms 不会在 gridview 中检索查询

问题描述

如果没有条件子句(基本select * from table语句),此代码将完美地检索数据,但是当我提供用户名和 order by 子句时它会失败

protected void Button2_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["mycon"].ToString());
    string cname = TextBox2.Text;

    Session[cname] = cname.ToString();

    con.Open();
        
    string sql = " select * from customer_reservations where customer_id='" 
                 + Session[cname] + "' order by reservation_time  ";

    SqlCommand cmd = new SqlCommand(sql, con);

    SqlDataReader reader = cmd.ExecuteReader();
    GridView1.DataSource = reader;
    GridView1.DataBind();

    /*"select *from customer_reservations where customer_id='" + cname +
         "' order by reservation_time";
    */

    /* select *from customer_reservations */
}

在SQL Serverreservation_time中存储为datetime数据类型,并且似乎可以访问,因为当我执行select *语句时,它会在浏览器中将 14' O 时钟转换为 2pm

标签: asp.netwebforms

解决方案


好的,cname 是文本还是数字?您必须检查数据库。

但是,总是很容易弄乱字符串连接,因此我建议这样做:

    protected void Button1_Click(object sender, EventArgs e)
    {
        {
            using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["mycon"].ToString()))
            {
            string cname = TextBox2.Text;
            Session["cname"] = cname.ToString();

            con.Open();
            string sql = " select * from customer_reservations where customer_id = @cname "
                         + " order by reservation_time";
            SqlCommand cmd = new SqlCommand(sql, con);
            cmd.Parameters.Add("@cname", SqlDbType.NVarChar).Value = cname;

            GridView1.DataSource = cmd.ExecuteReader();
            GridView1.DataBind();

            }
        }
    }

因此,在没有所有这些引号的情况下写出 sql 往往更容易。奖励是我们获得了 sql 注入安全代码。

所以试试上面。

另外,检查您的页面加载事件。如果它加载网格或执行任何操作,那么您总是,但总是希望只在第一页加载时运行代码,因此:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadGrid();
    }

作为一个仅供参考,你会需要这个:

 Session["cname"] = cname;

为了获得价值,你需要这个:

 some var = Session["cname"].ToString();

您实际上创建了实际文本值的会话变量!!- 不是所谓的“cname”。

第二个仅供参考:

如果你想在网格上使用分页,那么你不能给 GV 一个“阅读器”,因此你需要/应该使用这个:

                string sql = " select * from customer_reservations where customer_id = @cname "
                             + " order by reservation_time";
                SqlCommand cmd = new SqlCommand(sql, con);
                cmd.Parameters.Add("@cname", SqlDbType.NVarChar).Value = cname;

                DataTable rstData = new DataTable();
                rstData.Load(cmd.ExecuteReader());

                GridView1.DataSource = rstData;
                GridView1.DataBind();

推荐阅读