C# asp.net动态GridView SelectCommand分页/排序抛出Oracle错误

C# asp.net动态GridView SelectCommand分页/排序抛出Oracle错误,c#,asp.net,oracle,C#,Asp.net,Oracle,编辑:在Felix的帮助下自己解决了这个问题,请参见下面的答案 我正在尝试使用SelectCommand向GridView添加一些基本的搜索/过滤功能。更改下拉列表并单击按钮后,SelectCommand应随SelectParameter的添加而更改 问题在于,一旦更改SelectCommand并添加适当的SelectParameter,只有第一页会完美显示,显示正确的过滤结果。尝试更改页面或排序会引发Oracle错误 Sys.WebForms.PageRequestManagerServerE

编辑:在Felix的帮助下自己解决了这个问题,请参见下面的答案

我正在尝试使用SelectCommand向GridView添加一些基本的搜索/过滤功能。更改下拉列表并单击按钮后,SelectCommand应随SelectParameter的添加而更改

问题在于,一旦更改SelectCommand并添加适当的SelectParameter,只有第一页会完美显示,显示正确的过滤结果。尝试更改页面或排序会引发Oracle错误

Sys.WebForms.PageRequestManagerServerErrorException:ORA-01036: 变量名/编号非法

当删除筛选从而恢复SelectCommand并删除SelectParameter时,分页/排序工作正常

.ascx代码:

请注意,owner_ddl DropdownList使用单独的codebehind方法中的值填充

<asp:DropDownList ID="owner_ddl" runat="server">
    <asp:ListItem Value="*">All</asp:ListItem>
</asp:DropDownList>
&emsp;
<asp:Button ID="filter_btn" runat="server" Text="Filter" OnClick="filter_btn_Click" />

<br />
<br />

<asp:GridView ID="workbasket_gv" runat="server" AllowPaging="True"
 AllowSorting="True" PagerSettings-Mode="NextPreviousFirstLast" PageSize="20"
 AutoGenerateColumns="False" DataKeyNames="INCIDENT_ID" DataSourceID="sqlIncident"
 EmptyDataText="No incidents meet this criteria" Width="90%">
    <Columns>
        <asp:CommandField ShowSelectButton="True" ButtonType="Button" SelectText="View">
            <ItemStyle Width="50px" />
        </asp:CommandField>
        <asp:BoundField DataField="INCIDENT_ID" HeaderText="ID" ReadOnly="True" SortExpression="INCIDENT_ID">
            <ItemStyle Width="50px" />
        </asp:BoundField>
        <asp:BoundField DataField="OWNER" HeaderText="Owner" SortExpression="OWNER">
            <ItemStyle Width="100px" />
        </asp:BoundField>
        <asp:BoundField DataField="TITLE" HeaderText="Title" SortExpression="TITLE" />
        <asp:BoundField DataField="DATE_RAISED" HeaderText="Date Raised" SortExpression="DATE_RAISED" DataFormatString="{0:g}">
            <ItemStyle Width="200px" />
        </asp:BoundField>
    </Columns>
    <PagerSettings Mode="NextPreviousFirstLast" Position="TopAndBottom" FirstPageText="&lt;&lt; First"
     LastPageText="Last &gt;&gt;" NextPageText="Next &gt;" PreviousPageText="&lt; Prev">
    </PagerSettings>
    <PagerStyle HorizontalAlign="Center" />
</asp:GridView>

<asp:SqlDataSource ID="sqlIncident" runat="server" ConnectionString="Data Source=dbmisc89_dbmisc89.w34.bmw.uk;Persist Security Info=True;User ID=W50XS001_W;Password=sales_2;"
 ProviderName="System.Data.OracleClient" SelectCommand="SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL ORDER BY DATE_RAISED DESC">
</asp:SqlDataSource>

请检查一下这个。我不确定这是否是问题所在。让我知道它是否正确

if (owner_ddl.SelectedValue != "*")
    {
        // Defined owner

ControlParameter param = new ControlParameter("OWNER", System.Data.DbType.String, "owner_ddl", "SelectedValue");
        sqlIncident.SelectParameters.Add(param);


        string sql = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL AND OWNER=:OWNER ORDER BY DATE_RAISED DESC";
        sqlIncident.SelectCommand = sql;

    }

通过删除SelectParameter并将owner_ddl.SelectedValue直接放入SQL字符串,解决了这个问题。还添加了一个会话变量以在数据绑定时传递给自身,以便分页/排序保持正确的查询

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        if (!String.IsNullOrEmpty((String)Session["sqlOwnerType"]))
        {
            if ((String)Session["sqlOwnerType"] == "specific")
                sqlIncident.SelectCommand = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL AND OWNER='" + owner_ddl.SelectedValue + "' ORDER BY DATE_RAISED DESC";
            else if ((String)Session["sqlOwnerType"] == "all")
                sqlIncident.SelectCommand = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL ORDER BY DATE_RAISED DESC";
        }
    }
}

protected void filter_btn_Click(object sender, EventArgs e)
{
    if (owner_ddl.SelectedValue != "*")
    {
        // Defined owner

        string sql = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL AND OWNER='" + owner_ddl.SelectedValue + "' ORDER BY DATE_RAISED DESC";
        sqlIncident.SelectCommand = sql;

        Session["sqlOwnerType"] = "specific";
    }
    else
    {
        // All owners (Remove variable)
        string sql = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL ORDER BY DATE_RAISED DESC";
        sqlIncident.SelectCommand = sql;

        Session["sqlOwnerType"] = "all";
    }
    workbasket_gv.DataBind();
}

不起作用,似乎没有什么不同,我仍然遇到同样的问题。为什么你要添加这个单独的代码。您可以在sqldatasource中添加参数…我已删除SelectParameter,并尝试将owner_ddl.SelectedValue直接放入sql字符串中,现在的问题是更改页面会丢失新的SelectCommand,它会立即恢复为原始SelectCommand。我想这与ViewState的改变有关,现在需要look…对它进行排序,添加一个会话变量在DataBind上传递给它自己,以便它保持正确的SQL。问题解决了!:-
 <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
            DeleteCommand="DELETE FROM [Table] WHERE [INCIDENT_ID] = @INCIDENT_ID" 
            InsertCommand="INSERT INTO [Table] ([INCIDENT_ID], [OWNER]) VALUES (@INCIDENT_ID, @OWNER)" 
            SelectCommand="SELECT * FROM [Table] WHERE ([OWNER] = @OWNER)" 
            UpdateCommand="UPDATE [Table] SET [OWNER] = @OWNER WHERE [INCIDENT_ID] = @INCIDENT_ID">
            <DeleteParameters>
                <asp:Parameter Name="INCIDENT_ID" Type="Int32" />
            </DeleteParameters>
            <InsertParameters>
                <asp:Parameter Name="INCIDENT_ID" Type="Int32" />
                <asp:Parameter Name="OWNER" Type="String" />
            </InsertParameters>
            <SelectParameters>
                <asp:ControlParameter ControlID="owner_ddl" Name="OWNER" PropertyName="SelectedValue" Type="String" />
            </SelectParameters>
            <UpdateParameters>
                <asp:Parameter Name="OWNER" Type="String" />
                <asp:Parameter Name="INCIDENT_ID" Type="Int32" />
            </UpdateParameters>
        </asp:SqlDataSource>



 protected void filter_btn_Click(object sender, EventArgs e)
    {
        SqlDataSource1.DataBind();
        workbasket_gv.DataBind();
    }
protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        if (!String.IsNullOrEmpty((String)Session["sqlOwnerType"]))
        {
            if ((String)Session["sqlOwnerType"] == "specific")
                sqlIncident.SelectCommand = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL AND OWNER='" + owner_ddl.SelectedValue + "' ORDER BY DATE_RAISED DESC";
            else if ((String)Session["sqlOwnerType"] == "all")
                sqlIncident.SelectCommand = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL ORDER BY DATE_RAISED DESC";
        }
    }
}

protected void filter_btn_Click(object sender, EventArgs e)
{
    if (owner_ddl.SelectedValue != "*")
    {
        // Defined owner

        string sql = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL AND OWNER='" + owner_ddl.SelectedValue + "' ORDER BY DATE_RAISED DESC";
        sqlIncident.SelectCommand = sql;

        Session["sqlOwnerType"] = "specific";
    }
    else
    {
        // All owners (Remove variable)
        string sql = "SELECT INCIDENT_ID, OWNER, TITLE, DATE_RAISED FROM INCIDENT_TBL WHERE TITLE IS NOT NULL ORDER BY DATE_RAISED DESC";
        sqlIncident.SelectCommand = sql;

        Session["sqlOwnerType"] = "all";
    }
    workbasket_gv.DataBind();
}