SQL中的XML字段

本文关键字:字段 XML 中的 SQL | 更新日期: 2023-09-27 18:21:45

我有一个方法,它将对象序列化为SQL Server XML字段。我在Managmenet Studio的SQL服务器中看到了XML,现在我需要在HTML页面中显示它。

我使用AJax函数调用WebMethod,该函数调用存储过程如下:

using (conn){
    using (SqlCommand cmd = new SqlCommand()){
        conn.Open();
        cmd.CommandText = "GetMessage_Sel";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@messageId", SqlDbType.VarChar, 50).Value = str;
        cmd.Connection = conn;
        try{
            rdr = cmd.ExecuteReader();
            if (rdr.HasRows){
                while (rdr.Read()){
                    returnValue1 = rdr.GetString(0);
                    returnValue2 = rdr.GetString(1);
                }      
            }
            else{
                Console.WriteLine("No rows found.");
            }  
            rdr.Close();
        }
        catch (Exception err){
            // handle the error
            //messageInsert = false;
        }
        finally{ 
            conn.Close(); 
        }
    }
}
return new string[] {returnValue1,returnValue2};

因此ajax的设置如下:

$('.view-details').click(function (e) {
    e.preventDefault();
    $('#ticket-id').text("Ticket id: " + $(this).closest('tr').children().eq(1).html());
    $.ajax({
        type: "POST",
        url: "Default.aspx/PopulatePopUp",
        cache: false,
        data: "{'arg':'" + $(this).closest('tr').children().eq(1).html() + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg)
        {
            $("#CompleteMessage").text(msg.d[0]);
            $("#lblaka").text(msg.d[1]);
        }
    });
}

所以#lblaka显示了整个XML消息,但我需要将其分解为更可读的方式。那么,无论是在我的WebMethod还是Ajax函数中,我如何迭代rdr。GetString(1),所以类似于这个

foreach (var item in rdr.GetString(1))  {
    string 1 = xml node value 1 ..... etc
}

编辑:

下面是一个存储XML的示例。

<Person xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <AKA>
        <string>Name 1</string>
        <string>Name 2</string>
    </AKA>
    <Countries>
        <string>USA</string>
        <string>UK</string>
    </Countries>
    <Names>
        <string>Name 1</string>
        <string>Name 2</string>
    </Names>
    <Gender>Male</Gender>
</Person>

SQL中的XML字段

以下是如何使用jQuery:

声明此函数:

function GetNestedElements(aThis, name) {
 $(aThis).find(name).each(function(index){            
        $("#lblaka").append('<span>'+ name +' : ');
        $(this).find('string').each(function(index){            
             $("#lblaka").append($(this));
            });
        $("#lblaka").append('</span><br/>');
    });    
}

在你的成功电话中使用这个:

var xml = $.parseXML(msg),
$xml = $( xml );
$xml.find('Person').each(function(index){             
    GetNestedElements(this, 'AKA');
    GetNestedElements(this, 'Countries');
    GetNestedElements(this, 'Names');
    var gender = $(this).find('Gender').text();                 
            $("#lblaka").append('<span>Gender : ' + gender + '</span><br/>');
        });

请参阅此jsFiddle以获取工作版本(选择"显示人员"查看):

http://jsfiddle.net/MZ5Xs/2/

如果SQL字符串中有纯XLM,您可以将该字符串加载到和XDocument类似的位置,并使用linq进行查询,以使列表循环。

XDocument xDoc = XDocument.Parse(rdr.GetString(1));
var query = xDoc.Descendants("AKA").Elements("string").ToList();
//If you want to add them to an Array
string[] array = new string[query.Count() -1];
int i = 0
// this will add the values Name 1 and Name 2 to an array
foreach (var element in query)
{
     array[i] = element.Value;
     i++;
}