【问题标题】:How to query an Xml Document using a SP and populate an ASP DropDownList from code-behind?如何使用 SP 查询 Xml 文档并从代码隐藏中填充 ASP DropDownList?
【发布时间】:2015-07-30 06:07:07
【问题描述】:

给定xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <lfSpec1ForLoc>
        <a href="/spec.aspx?id=20" title="AI">AI</a>
    </lfSpec1ForLoc>
    <lfSpec2ForLoc />
    <lfSpec3ForLoc />
    <lfSpec4ForLoc />
    <lfSpec5ForLoc />
    <lfSpec6ForLoc />
    <lfSpec7ForLoc />
    <lfSpec8ForLoc />
    <lfSpec9ForLoc />
    <lfSpec10ForLoc />
</root>

我的网址是:www.mypage.com/off.aspx?id=12

我有以下存储过程:

ALTER PROCEDURE [dbo].[MySP]
(
@LstrID varchar(200), -- 12 {from the query string in the above URL}
)

AS

BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT
        CAST ([con] AS XML).query('/root/lfSpec1ForLoc/a') AS [Spec1]
        , CAST ([con] AS XML).query('/root/lfSpec2ForLoc/a') AS [Spec2]
        , CAST ([con] AS XML).query('/root/lfSpec3ForLoc/a') AS [Spec3]
        , CAST ([con] AS XML).query('/root/lfSpec4ForLoc/a') AS [Spec4]
        , CAST ([con] AS XML).query('/root/lfSpec5ForLoc/a') AS [Spec5]
        , CAST ([con] AS XML).query('/root/lfSpec6ForLoc/a') AS [Spec6]
        , CAST ([con] AS XML).query('/root/lfSpec7ForLoc/a') AS [Spec7]
        , CAST ([con] AS XML).query('/root/lfSpec8ForLoc/a') AS [Spec8]
        , CAST ([con] AS XML).query('/root/lfSpec9ForLoc/a') AS [Spec9]
        , CAST ([con] AS XML).query('/root/lfSpec10ForLoc/a') AS [Spec10]
    FROM
        [myDB1].[dbo].[con]
    WHERE
        [folder_id] = 106
        AND 
        [content_id] = '%' + Lstr + '%'
END

SP 的结果是:

Spec1                                           Spec2                                       Spec3   Spec4   Spec5   Spec6   Spec7   Spec8   Spec9   Spec10
<a href="/spe.aspx?id=1" title="AI">AI</a>      <a href="/spe.aspx?id=5" title="QW">QW</a>

我想填充以下下拉列表:

<ASP:DropDownList runat="server" ID="ddl1"></ASP:DropDownList>

所以HTML输出如下:

<SELECT>
    <option value="/spe.aspx?id=1">AI</option>
    <option value="/spe.aspx?id=5">QW</option>
</SELECT>

在执行 SP 后实现填充下拉列表的最佳方法是什么?

【问题讨论】:

  • @TonyHinkle 可能的解决方案。

标签: c# sql asp.net xml


【解决方案1】:

我会更改您的PROC 以更好地使用 Xquery 和 Sql Server 的 xml 解析功能。

你可以从你的 PROC 中做的是从你的表中的 xml 记录中投影一个 (URL, Title) 对的表,查询很简单:

SELECT Nodes.node.value('(a/@href)[1]', 'varchar(100)') AS URL,
       Nodes.node.value('(a/@title)[1]', 'varchar(100)') AS Title
FROM 
(
  SELECT CAST(con.con AS XML) AS con,
    folder_id,
    content_id
    FROM con
) x
CROSS APPLY x.Con.nodes('/root/*[a]') as Nodes(node)
WHERE
[folder_id] = 106
AND 
[content_id] LIKE '%' + @LstrID + '%';

/root/*[a] 将导航所有lfSpecxForLoc 节点(无论名称如何),并仅过滤具有a 子元素的节点,从而避免过滤掉空值。此外,通过将元素投影为单独的行,您无需删除 10 个显式列 - 行数与数据数一样多。

这是上述查询投影的结果表的SqlFiddle

从这里,将结果集拉入 ADO 数据读取器或将其绑定到您的下拉列表是一项简单的任务(例如,将 .DataSource 设置为数据读取器,然后在 DropDownList 上调用 .DataBind() )。

【讨论】:

  • con 列的类型为 ntext,所以我收到以下错误:Msg 9506, Level 16, State 1, Line 1 The XMLDT method 'nodes' can only be invoked on columns of type xml.
  • 我已将使用 CAST 的查询调整为 XML。 AFAIK 你需要一个包装派生表才能执行CROSS APPLY
猜你喜欢
  • 2012-11-22
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多