从GridView排序过滤数据时出错

时间:2009-06-07 11:31:39

标签: asp.net oracle filtering oracle-xe

大家好,

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

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

  • 一个名为“CheckBoxNAME”的CheckBox:

< asp:CheckBox ID="CheckBoxNAME" runat="server" Text="Name" /> 
  • 一个名为“TextBoxName”的TextBox:

< asp:TextBox ID="TextBoxNAME" runat="server" Width="100%" Wrap="False"> < /asp:TextBox> 
  • 一个名为“SqlDataSourceCOUNTRIES”的SQLDataSource,用于选择表中包含3列的所有记录 - ID(数字,PK),NAME(Varchar2(1000))和名为COUNTRIES的人口(数字)

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

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

< asp:Button ID="ButtonFilter" runat="server" Text="Filter" onclick="ButtonFilter_Click"/> 

这是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的所有记录。

方案如下: - 用户检查CheckBox; - 用户在TextBox中键入一个值(比如说“ch”); - 用户按下按钮; - 页面加载仅显示与过滤条件匹配的记录(在这种情况下,所有具有包含“Ch”的名称的国家/地区); - 用户单击名为“Name”的列的标题,以便对GridView中的数据进行排序

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

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

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

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

非常感谢任何帮助,tnks。

PS:我在Visual Studio 2008下使用ASP.NET 3.5和OracleXE数据库。

2 个答案:

答案 0 :(得分:2)

问题是SqlDataSource的SelectCommand出错了......非常蹩脚...... 如果有人想详细了解它,请与我联系。其他方面,我现在就继续推进其他事情。

从我的观点来看,这个问题可以被视为已经回答,并且已经结束了。

非常感谢。

答案 1 :(得分:0)

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

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

如下图所示:

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

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

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

我希望有所帮助。