【问题标题】:Error while sorting filtered data from a GridView从 GridView 对过滤的数据进行排序时出错
【发布时间】:2010-10-31 23:55:33
【问题描述】:

大家好,

我在 ASP.NET 网站上遇到了一个我无法解决的错误。

其中一个页面 - Country.aspx 具有以下控件:

  • 一个名为“CheckBoxNAME”的复选框:

&lt asp:CheckBox ID="CheckBoxNAME" runat="server" Text="Name" /&gt 
  • 一个名为“TextBoxName”的文本框:

&lt asp:TextBox ID="TextBoxNAME" runat="server" Width="100%" Wrap="False"&gt &lt /asp:TextBox&gt 
  • 一个名为“SqlDataSourceCOUNTRIES”的 SQLDataSource,它从具有 3 列的表中选择所有记录 - ID(数字,PK)、名称(Varchar2(1000))和名为 COUNTRIES 的 POPULATION(数字)

&lt asp:SqlDataSource 
    ID="SqlDataSourceCOUNTRIES" 
    runat="server" 
    ConnectionString="&lt %$ ConnectionStrings:myDB %&gt " 
    ProviderName="&lt %$ ConnectionStrings:myDB.ProviderName %&gt " 
    SelectCommand="SELECT COUNTRIES.ID, COUNTRIES.NAME, COUNTRIES.POPULATION FROM COUNTRIES ORDER BY COUNTRIES.NAME, COUNTRIES.ID"&gt 
&lt /asp:SqlDataSource&gt 
 
  • 一个名为 GridViewCOUNTRIES 的 GridView:

&lt asp:GridView 
    ID="GridViewCOUNTRIES" 
    runat="server" 
    AllowPaging="True" 
    AllowSorting="True" 
    AutoGenerateColumns="False" 
    DataSourceID="SqlDataSourceCOUNTRIES" 
    DataKeyNames="ID" 
    DataMember="DefaultView"&gt  
    &lt Columns&gt 
        &lt asp:CommandField ShowSelectButton="True" /&gt 
        &lt asp:BoundField DataField="ID" HeaderText="Id" SortExpression="ID" /&gt 
        &lt asp:BoundField DataField="NAME" HeaderText="Name" SortExpression="NAME" /&gt 
        &lt asp:BoundField DataField="POPULATION" HeaderText="Population" SortExpression="POPULATION" /&gt 
    &lt /Columns&gt 
&lt /asp:GridView&gt 
  • 一个名为 ButtonFilter 的按钮:

&lt asp:Button ID="ButtonFilter" runat="server" Text="Filter" onclick="ButtonFilter_Click"/&gt 

这是 onclick 事件:


    protected void ButtonFilter_Click(object sender, EventArgs e)
    {
        Response.Redirect("Countries.aspx?" + 
            (this.CheckBoxNAME.Checked ? string.Format("NAME={0}", this.TextBoxNAME.Text) : string.Empty));
    }

另外,这是页面的主要 onload 事件:


    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack == false)
        {   
            if (Request.QueryString.Count != 0)
            {
                Dictionary parameters = new Dictionary();
                string commandTextFormat = string.Empty;

                if (Request.QueryString["NAME"] != null)
                {
                    if (commandTextFormat != string.Empty && commandTextFormat.EndsWith("AND") == false)
                    {
                        commandTextFormat += "AND";
                    }
                    commandTextFormat += " (UPPER(COUNTRIES.NAME) LIKE '%' || :NAME || '%') ";
                    parameters.Add("NAME", Request.QueryString["NAME"].ToString());
                }

                this.SqlDataSourceCOUNTRIES.SelectCommand = string.Format("SELECT COUNTRIES.ID, COUNTRIES.NAME, COUNTRIES.POPULATION FROM COUNTRIES WHERE {0} ORDER BY COUNTRIES.NAME, COUNTRIES.ID", commandTextFormat);

                foreach (KeyValuePair parameter in parameters)
                {
                    this.SqlDataSourceCOUNTRIES.SelectParameters.Add(parameter.Key, parameter.Value.ToUpper());
                }
            }
        }
    }

基本上,页面在GridViewCOUNTRIES中显示了COUNTRIES表的所有记录。

场景如下: - 用户检查复选框; - 用户在 TextBox 中输入一个值(比如说“ch”); - 用户按下按钮; - 页面加载仅显示符合过滤条件的记录(在这种情况下,所有名称包含“Ch”的国家); - 用户单击名为“名称”的列的标题以对 GridView 中的数据进行排序

然后,我收到以下错误:ORA-01036: 非法变量名称/编号。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Data.OracleClient.OracleException:ORA-01036:非法变量名称/编号

源错误:在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

非常感谢任何帮助,tnks。

PS:我使用的是 ASP.NET 3.5,在 Visual Studio 2008 下,带有 OracleXE 数据库。

【问题讨论】:

    标签: asp.net oracle filtering oracle-xe


    【解决方案1】:

    问题是 SqlDataSource 的 SelectCommand 中的一个错误...相当蹩脚... 如果有人想详细了解它,请与我联系。否则,我现在将继续做其他事情。

    从我的角度来看,这个问题可以被视为已回答,并且已结束。

    还是谢谢。

    【讨论】:

    • 太棒了。这对我也有帮助。所以还是关了吧。或者尝试简要介绍它如何帮助您,以便它也可以帮助其他人。没有人会因为一个小错误与您联系,您也不会一次又一次地为同一个问题回答每个人。
    【解决方案2】:

    我没有 Oracle 经验。但是,由于您没有收到任何答复,我敢于提出以下建议。尝试从该行中删除括号:

    commandTextFormat += " (UPPER(COUNTRIES.NAME) LIKE '%' || :NAME || '%') ";
    

    如下图:

    commandTextFormat += " UPPER(COUNTRIES.NAME) LIKE '%' || :NAME || '%' ";
    

    另一个建议;尝试将:NAME 参数包含在 %

    commandTextFormat += " UPPER(COUNTRIES.NAME) LIKE '%:NAME%' ";
    

    希望对你有帮助。

    【讨论】:

    • 不,这不是问题所在。真正的问题是 SqlDataSource 的 SelectCommand 中的一个错误...相当蹩脚...
    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2015-12-12
    相关资源
    最近更新 更多