主细节网格视图中的多个DataKeyNames

时间:2009-08-07 21:19:31

标签: asp.net oracle

此代码允许您在Oracle数据库中搜索表名。然后,当您选择一行时,它会将所选表的所有列放在第二个gridview中。

如果我只使用一个DatakeyName - “Table_Name”,下面的代码可以工作,但如果它们存在,它将显示具有不同所有者的相同表名,这不是我想要的。我想基于两个字段 - Table_Name和Owner。

来提取细节

我无法弄清楚如何让细节部分与两个datakeyNames一起使用。

 <asp:Label ID="lblTitleSrchOracleTab" runat="server" Text="Search For A Table In Oracle"></asp:Label>
        <br /><br />
        <asp:Label ID="lblOracleTableName" runat="server" Text="Oracle Table Name"></asp:Label>
        <asp:TextBox ID="txtOracleTableName" runat="server"></asp:TextBox>
        <asp:Button ID="btnOracleTableName" runat="server" Text="Search" 
             />
        <br /><br /> 
    <asp:GridView ID="gvOracleTableName" runat="server" CssClass="mGrid" 
            AutoGenerateSelectButton="True" AutoGenerateColumns="False" 
                DataSourceID="sdsOracleTableName" DataKeyNames="Owner,Table_Name" >
            <Columns>
                <asp:BoundField DataField="OWNER" HeaderText="OWNER" SortExpression="OWNER" />
                <asp:BoundField DataField="TABLE_NAME" HeaderText="TABLE_NAME" 
                    SortExpression="TABLE_NAME" />
                <asp:BoundField DataField="NUM_ROWS" HeaderText="NUM_ROWS" 
                    SortExpression="NUM_ROWS" />
                <asp:BoundField DataField="TABLESPACE_NAME" HeaderText="TABLESPACE_NAME" 
                    SortExpression="TABLESPACE_NAME" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="sdsOracleTableName" runat="server" 
            ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
            ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" SelectCommand="SELECT Owner, Table_name, Num_Rows, Tablespace_name
    FROM all_tables
    WHERE trim(upper(table_name)) LIKE trim(upper('%' || :TableName || '%'))">
            <SelectParameters>
                <asp:ControlParameter ControlID="txtOracleTableName" Name="TableName" 
                    PropertyName="Text" />
            </SelectParameters>
        </asp:SqlDataSource>
        <br /><br />
        <asp:GridView ID="gvSelectedTableColumns" runat="server" CssClass="mGrid"
            AutoGenerateColumns="False" DataSourceID="sdsgvSelectedTableColumns">
            <Columns>
                <asp:BoundField DataField="OWNER" HeaderText="OWNER" SortExpression="OWNER" />
                <asp:BoundField DataField="TABLE_NAME" HeaderText="TABLE_NAME" 
                    SortExpression="TABLE_NAME" />
                <asp:BoundField DataField="COLUMN_NAME" HeaderText="COLUMN_NAME" 
                    SortExpression="COLUMN_NAME" />
                <asp:BoundField DataField="DATA_TYPE" HeaderText="DATA_TYPE" 
                    SortExpression="DATA_TYPE" />
                <asp:BoundField DataField="DATA_LENGTH" HeaderText="DATA_LENGTH" 
                    SortExpression="DATA_LENGTH" />
                <asp:BoundField DataField="NULLABLE" HeaderText="NULLABLE" 
                    SortExpression="NULLABLE" />
            </Columns>
            <SelectedRowStyle BorderColor="Red" Font-Bold="True" />
        </asp:GridView>
        <asp:SqlDataSource ID="sdsgvSelectedTableColumns" runat="server" 
            ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 


            ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" SelectCommand="SELECT Owner, table_name, column_name, Data_Type, Data_Length, Nullable 
    FROM all_tab_columns 
    WHERE trim(upper(Owner)) =trim(upper(:SelectedOwner)) AND
    trim(upper(table_name)) =trim(upper(:SelectedTableName)) 
    ">
            <SelectParameters>
                <asp:ControlParameter ControlID="gvOracleTableName" Name="SelectedOwner" 
                    PropertyName="SelectedValue" />
                <asp:ControlParameter ControlID="gvOracleTableName" DefaultValue="" 
                    Name="SelectedTableName" PropertyName="SelectedValue" />
            </SelectParameters>
        </asp:SqlDataSource>

3 个答案:

答案 0 :(得分:0)

你不能扩展where子句吗?

所以

from all_tables where ... and owner = 'MYOWNER'

select from user_tables instead of all_tables. 

答案 1 :(得分:0)

这就是

WHERE trim(upper(Owner)) =trim(upper(:SelectedOwner)) AND
trim(upper(table_name)) =trim(upper(:SelectedTableName)) 

我的问题是,当您使用sqlDataSource向导将参数连接到gridview控件时,它不允许您选择gridview的哪个数据键将其绑定到。

答案 2 :(得分:0)

我终于想到了这一个。你不能Mighty Mouse它 - 它需要实际代码!特别是gridview_SelectedIndexChanged事件。

我是这样做的。

  protected void gvOracleTableName_SelectedIndexChanged(object sender, EventArgs e)
        {
            string SelectedOwner;

            SelectedOwner = gvOracleTableName.SelectedRow.Cells[1].Text ;

            string SelectedTableName;
            SelectedTableName = gvOracleTableName.SelectedRow.Cells[2].Text;

            lblTest.Text = SelectedOwner + " " + SelectedTableName;





            string strConn, strSQL;
            strConn = @"";
            strSQL = @"SELECT Owner, table_name, column_name, Data_Type, Data_Length, Nullable FROM all_tab_columns WHERE trim(upper(Owner)) =trim(upper(:SelectedOwner)) AND trim(upper(table_name)) =trim(upper(:SelectedTableName))";
            using (OracleConnection cn = new OracleConnection(strConn))
            {
                OracleCommand cmd = new OracleCommand(strSQL, cn);

                cmd.Parameters.AddWithValue(":SelectedOwner", SelectedOwner);
                cmd.Parameters.AddWithValue(":SelectedTableName", SelectedTableName);

                cn.Open();

                OracleDataReader rdr = cmd.ExecuteReader();

                gvSelectedTableColumns.DataSource = rdr;
                gvSelectedTableColumns.DataBind();

                cn.Close();
            }

        }