【问题标题】:Chaining user responses with SQL Server and ASP.NET使用 SQL Server 和 ASP.NET 链接用户响应
【发布时间】:2012-09-30 16:32:57
【问题描述】:

我不太确定如何解决这个问题,所以认为最好问一下,看看是否有人有任何可能有帮助的想法。

我有一个存储在 SQL Server 中的表,它使用此架构存储 Exchange 2010 邮箱服务器性能数据:

CREATE TABLE [dbo].[2010_Perfmon_MBX]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Server] [varchar](50) NULL,
    [ObjectName] [varchar](100) NULL,
    [CounterName] [varchar](100) NULL,
    [InstanceName] [varchar](100) NULL,
    [Value] [decimal](18, 3) NULL,
    [DateTime] [datetime] NULL
)

我还有一个用 C# 编写的 ASP.NET 网站。我想让用户选择级联答案,最终将请求的数据返回到 GridView/Graph 中。

目前,我的主要挑战是如何确保在最终用户从所有列中选择值之前不会返回数据。

我想这样上演:

要求用户提供服务器以从中提取数据

SELECT DISTINCT(Server)
FROM 2010_Perfmon_MBX

假设他们选择了服务器MailboxServer.domain.com

SELECT DISTINCT(ObjectName)
FROM 2010_Perfmon_MBX
WHERE Server = 'MailboxServer.domain.com'

然后根据服务器MailboxServer.domain.com 向用户询问对象名称。他们选择'msexchangeis mailbox' 例如:

SELECT DISTINCT(CounterName)
FROM 2010_Perfmon_MBX
WHERE Server = 'MailboxServer.domain.com'
AND ObjectName = 'msexchangeis mailbox'

接下来要求用户输入CounterName。他们选择'active rpc threads'

SELECT DISTINCT(InstanceName)
FROM 2010_Perfmon_MBX
WHERE Server = 'MailboxServer.domain.com'
AND ObjectName = 'msexchangeis mailbox'
AND CounterName = 'active rpc threads'

最后他们选择了InstanceName。在这个例子中'Database20'。然后运行完整的查询,根据所做的选择拉回所有数据:

SELECT *
FROM 2010_Perfmon_MBX
WHERE Server = 'MailboxServer.domain.com'
AND ObjectName = 'msexchangeis mailbox'
AND CounterName = 'active rpc threads'
AND InstanceName = 'Database20'

在不跳转和链接选择的情况下确保选择流程正常工作的最优雅的方法是什么?

我需要确保选择是动态的,并且基于所选服务器的 SQL Server 表中的可用数据,因此只能选择有效数据。

感谢阅读。

【问题讨论】:

    标签: c# asp.net .net sql-server sql-server-2008


    【解决方案1】:

    一个相当广泛的问题,所以这里有一个广泛的答案。我假设您的网络应用程序是 ASP.NET WebForms。

    1. 使用 DropDownList 控件进行用户选择,使用 RequiredFieldValidator 控件来确保用户从每个控件中做出有效选择。
    2. 将下拉列表与您的 SELECT DISTINCT 数据绑定
    3. 有一个提交按钮,在回发检查 Page.IsValid 时,如果为真,则获取数据并绑定 GridView。

    更新

    好的,我认为您是说可用选项取决于前一个选项,从服务器开始。在这种情况下,一次呈现每个 DropDownList(使其可见),将它们的 autopostback 属性设置为 true。每次索引更改都会重新绑定所有后续依赖的 DropDownLists。您还可以使用验证器控件来确保用户在提交之前已在所有列表中做出选择:

    aspx

    <asp:DropDownList ID="ddlObjectName" runat="server" DataSourceId="dsObjectName" 
        OnDataBound="ddlObjectName_DataBound"></DropDownList>
    <asp:RequiredFieldValidator ID="ddlObjectNameRequired" runat="server" 
            ControlToValidate="ddlObjectName" InitialValue="-1"
            ErrorMessage="Please select an Object Name.">
    </asp:RequiredFieldValidator>
    
    <asp:Button ID="Submit" runat="server" Text="Submit" OnClick="Submit_Click" />
    

    aspx.cs

    protected void ddlObjectName_DataBound(object sender, EventArgs e)
    {
        ddlObjectName.Items.Insert(0, new ListItem("Please Select...", "-1"));
    }
    
    protected void Submit_Click(object sender, EventArgs e)
    {
        if(Page.IsValid)
        {
            //Bind the data grid ...
        }
    }
    

    【讨论】:

    • 是的,您的更新一针见血。我的 DDL 都将单独绑定到数据源,但我需要确保它们在前一个数据绑定之前不会进行数据绑定,并且索引也发生了变化。我想这就是我目前正在努力解决的问题。我会尽快安排一场比赛,不过可能是明天!
    • 如果您使用 ObjectDataSource 或 SqlDataSources,您可以将其中一个参数设为 ControlParameter,其 ID 为从属 DropDownList 的 ID
    • OK Holly,我创建了一个 .ASPX 页面,允许我选择服务器,选择 3 种不同的计数器类型(ObjectName、CounterName、InstanceName)。我需要停止它在每个步骤中检索数据,直到我准备好为止。现在,如果我填写服务器并单击按钮,它会完成所有其他下拉菜单并开始返回数据。阻止这种情况的最佳方法是什么?一旦数据准备就绪,我想要另一个按钮来检索数据。
    • 如果没有实际的 Web 应用程序在我面前,我不可能说出最好的解决方案是什么。但一种方法是使用验证器控件,请参阅我编辑的答案。
    • 我会为您提供帮助的答案。谢谢霍莉!最后,我创建了 3 个 DDL,3 个对象数据源。将每个 DDL 配置为在运行时不绑定,然后在选择服务器时,仅将 DDL 1 绑定到 ODS。 On Index Changed 然后我绑定 DDL 2。在该 DDL 3 上的索引更改上。在所有 DDL 都填充了选项后,用户可以单击将另一个 ODS 绑定到 GV 的 ASP 按钮。一切似乎都可以正常工作:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多