Ошибка при сортировке отфильтрованных данных из GridView - PullRequest
1 голос
/ 07 июня 2009

Привет, ребята,

У меня ошибка, которую я не могу устранить на веб-сайте ASP.NET.

Одна из его страниц - Country.aspx, имеет следующие элементы управления:

  • CheckBox, называемый "CheckBoxNAME":

&lt asp:CheckBox ID="CheckBoxNAME" runat="server" Text="Name" /&gt 
  • TextBox с именем "TextBoxName":

&lt asp:TextBox ID="TextBoxNAME" runat="server" Width="100%" Wrap="False"&gt &lt /asp:TextBox&gt 
  • SQLDataSource с именем "SqlDataSourceCOUNTRIES", который выбирает все записи из таблицы с 3 столбцами - ID (номер, PK), NAME (Varchar2 (1000)) и POPULATION (число) с именем COUNTRIES

&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 
 
  • GridView с именем GridViewCOUNTRIES:

&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));
    }

Кроме того, это главное событие загрузки страницы:


    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 все записи таблицы СТРАН.

Сценарий следующий: - пользователь проверяет CheckBox; - пользователь вводит значение в TextBox (скажем, «ch»); - пользователь нажимает кнопку; - страница загружается с отображением только тех записей, которые соответствуют критериям фильтра (в данном случае все страны, названия которых содержат «Ch»); - пользователь нажимает на заголовок столбца с именем «Имя», чтобы отсортировать данные в GridView

Затем я получаю следующую ошибку: ORA-01036: недопустимое имя / номер переменной.

Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Data.OracleClient.OracleException: ORA-01036: недопустимое имя / номер переменной

Ошибка источника: необработанное исключение было сгенерировано во время выполнения текущего веб-запроса. Информацию о происхождении и местонахождении исключения можно определить с помощью приведенной ниже трассировки стека исключений.

Любая помощь с благодарностью, тнкс.

PS: я использую ASP.NET 3.5 под Visual Studio 2008 с базой данных OracleXE.

Ответы [ 2 ]

2 голосов
/ 08 июня 2009

Проблема заключалась в ошибке в SelectCommand SqlDataSource ... Довольно хромая ... Если кто-то хотел бы узнать об этом во всех подробностях, свяжитесь со мной. В противном случае я сейчас перейду к чему-то другому.

Этот вопрос можно считать с моей точки зрения закрытым и закрытым.

В любом случае, спасибо.

0 голосов
/ 08 июня 2009

У меня нет опыта работы с Oracle. Однако, так как вы не получили никаких ответов, я бы осмелился сделать следующие предложения. Попробуйте удалить заключающие скобки из строки:

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

Как показано ниже:

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

Еще одно предложение; попробуйте заключить параметр :NAME в%

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

Надеюсь, это поможет.

...