SQL查询WHERE条件不起作用

时间:2016-08-02 03:35:23

标签: c# asp.net

这是我在SQL Server中输入时的查询。

SELECT * FROM CSPJDE.DBO.Emp WHERE Dept = '010'

这是aspx.cs文件中的代码

private void BindGrid()
    {
        string strConnString = ConfigurationManager.ConnectionStrings["SQL"].ConnectionString;
        using (SqlConnection con = new SqlConnection(strConnString))
        {
            using (SqlCommand cmd = new SqlCommand("SELECT TOP 100 * FROM [dbo].[F4101] WHERE IMSRP3 ='"+Div+"'"))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    cmd.Connection = con;
                    sda.SelectCommand = cmd;
                    using (DataTable dt = new DataTable())
                    {
                        sda.Fill(dt);
                        GridView1.DataSource = dt;
                        GridView1.DataBind();
                    }
                }
            }
        }
    }

" Div"变量从另一个页面传输,用户将在该页面中选择下拉列表。每个选项都有自己的价值。

 <asp:DropDownList ID="DivDrop" runat="server" CssClass="auto-style1">
        <asp:ListItem Value="010" Selected="True">(010) CAL</asp:ListItem>
        <asp:ListItem Value="020">(020) Sales</asp:ListItem>
        <asp:ListItem Value="'030'">(030) Marketing</asp:ListItem>
        <asp:ListItem Value="'031'">(031) Admin</asp:ListItem>
        <asp:ListItem Value="'035'">(035) Accounting</asp:ListItem>
        <asp:ListItem Value="'999'">ALL</asp:ListItem>
    </asp:DropDownList>

在index.aspx.cs文件中,保存变量以传输到resultpage.aspx.cs的代码是:

 protected void RunButton_Click(object sender, EventArgs e)
    {
        Response.Redirect("ResultPage.aspx?Value="+DivDrop.SelectedValue);
    }

在result.aspx.cs中,检索变量的代码是:

 public void Page_Load(object sender, EventArgs e)
    {
        if (Request.QueryString["Value"] != null)
        {
           string Div = Request.QueryString["Value"].ToString();
        }
        if (!IsPostBack)
        {
            this.BindGrid();
        }
    }

因此,我不确定为什么WHERE条件不起作用。我的编码是错误的还是我错过了什么?请指教。提前谢谢。

修改

在比较SQL查询和我的数据库的结果后,我意识到变量是空的。它仍然能够从数据库中提取数据的原因是因为我正在调整的列中有空数据。

修改

不确定这是否会有所帮助,但我有一个可能导致此问题的错误。 &#34;名称&#39; DivDrop&#39;在当前上下文中不存在&#34;。 DivDrop是我用来获取价值的下拉列表。

2 个答案:

答案 0 :(得分:2)

删除&#39; DropdownList中的字符,即:030,031,035,999。您将Div作为&#39; 030&#39;并将被翻译为WHERE IMSRP3 =&#39;&#39; 030&#39;&#39;

<asp:DropDownList ID="DivDrop" runat="server" CssClass="auto-style1">
    <asp:ListItem Value="010" Selected="True">(010) CAL</asp:ListItem>
    <asp:ListItem Value="020">(020) Sales</asp:ListItem>
    <asp:ListItem Value="'030'">(030) Marketing</asp:ListItem>
    <asp:ListItem Value="'031'">(031) Admin</asp:ListItem>
    <asp:ListItem Value="'035'">(035) Accounting</asp:ListItem>
    <asp:ListItem Value="'999'">ALL</asp:ListItem>
</asp:DropDownList>

答案 1 :(得分:1)

您需要对代码进行三项更改才能正常工作,即:

  1. 您需要从所有下拉列表项的Value属性中删除单引号字符(') - <asp:ListItem Value="'030'"

  2. 您没有将div作为参数传递给BindGrid()方法。将您的方法更改为:

    private void BindGrid(string div)
    {
        string strConnString = ConfigurationManager.ConnectionStrings["SQL"].ConnectionString;
        using (SqlConnection con = new SqlConnection(strConnString))
        {
            using (SqlCommand cmd = new SqlCommand("SELECT TOP 100 * FROM [dbo].[F4101] WHERE IMSRP3 ='" + div + "'"))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    cmd.Connection = con;
                    sda.SelectCommand = cmd;
                    using (DataTable dt = new DataTable())
                    {
                        sda.Fill(dt);
                        GridView1.DataSource = dt;
                        GridView1.DataBind();
                    }
                }
            }
        }
    }
    
  3. 最后更改Page_Load事件以将查询字符串值传递给BindGrid()方法:

    public void Page_Load(object sender, EventArgs e)
    {
        string Div = String.Empty;
    
        if (Request.QueryString["Value"] != null)
        {
            Div = Request.QueryString["Value"].ToString();
        }
    
        if (!IsPostBack)
        {
             this.BindGrid(Div);
        }
    }