簡體   English   中英

將 XMLDocument 傳遞給存儲過程

[英]Passing XMLDocument to Stored Procedure

我當前的設置如下:

客戶端 Javascript JSON 字符串化 object 傳遞給服務器 function

客戶:

var requestObject = JSON.stringify(clientObject);

$.ajax({
    url: 'ServerClass.aspx/ServerFunction',
    data: requestObject,
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    cache: false,
    context: document.body,
    type: 'POST',
    success: saveSuccessfulFunction
});

服務器:

[WebMethod(EnableSession = true)]
public static int SaveAllReportOptions(string requestObject)
{
    XmlDocument xdoc = JsonConvert.DeserializeXmlNode("{\"root\":" + clientObject + "}", "roots");            

    DBClass.Save(xdoc);            
}

public int Save(XmlDocument clientObject)
{
    SqlCommand dCmd = new SqlCommand("MyStoredProcedure", conn);
    dCmd.CommandType = CommandType.StoredProcedure;
    dCmd.Parameters.AddWithValue("@objectXML", SqlDbType.Xml).Value = clientObject.InnerXml;

     SqlParameter returnValue = dCmd.Parameters.Add("@ret", SqlDbType.Int);
     returnValue.Direction = ParameterDirection.ReturnValue;

     conn.Open();
     dCmd.ExecuteNonQuery();
     conn.Close();

     int i = Convert.ToInt32(dCmd.Parameters["@ret"].Value);
     return i;
}

存儲過程成功地從傳入的 XMLDocument 中提取了不同的節點/屬性,並繼續執行相關的更新/插入命令。

SELECT tab.col.value('att1[1]','NCHAR(10)') as attribute1,
      tab.col.value('att2[1]','INT') as attribute2...
FROM @objectXML.nodes('/roots/root') AS tab(col)

我的問題不在於上述代碼,而在於從各種在線/內部軟件編碼標准中觀察到的某些注意事項。

來源 1

X 不要使用 XmlNode 或 XmlDocument 來表示 XML 數據。 傾向於使用 IXPathNavigable、XmlReader、XmlWriter 的實例或 XNode 的子類型。 XmlNode 和 XmlDocument 不是為在公共 API 中公開而設計的。

來源 2

✓ 使用 XmlReader、IXPathNavigable 或 XNode 的子類型作為輸入或接受或返回 XML 的成員的 output。使用這些抽象而不是 XmlDocument、XmlNode 或 XPathDocument,因為這將方法與內存中 XML 文檔的特定實現分離並允許他們使用公開 XNode、XmlReader 或 XPathNavigator 的虛擬 XML 數據源。

來源 3

X 如果要創建表示底層 object model 或數據源的 XML 視圖的類型,請不要子類 XmlDocument。

基本上,我想知道將 XMLDocument 用於上述目的是否足夠安全可靠。 如果沒有,是否有更適合我的場景的替代方案。

我使用了這種方法 - 例如,您有多個訂單(子類)的客戶 object

1. 在客戶端- 在兩個類中分配值之后

customerObject = JSON.stringify(cls_m_Customer, function(k, v){ return v === "" ? "" : v });

2. 在服務器端-

JavaScriptSerializer jss = new JavaScriptSerializer();

cls_m_Customer objCustomer = new cls_m_Customer();

objCustomer = jss.Deserialize<cls_m_Customer>(customerData);

3. 在業務 Class - 為客戶和訂單類創建兩個字典並將這些表添加到數據集,然后將 ds 轉換為 xml 就像 -

Dictionary<string, cls_m_Customer> dic_Customer = new Dictionary<string, cls_m_Customer>();
dic_Customer.Add("1", this);

DataSet ds = new DataSet();

DataTable dtCustomer = DictionaryToDataTable.ConvertTo<cls_m_Customer>(dic_Customer, "Customer");
DataTable dtOrders = DictionaryToDataTable.ConvertTo<cls_m_Order>(this._Order, "Orders");

ds.Tables.Add(dtCustomer);
ds.Tables.Add(dtOrders);

DataRelation drQ = new DataRelation("Customer Related Orders", dtCustomer.Columns["_CustomerID"], dtOrders.Columns["_CustomerID"]);

drQ.Nested = true;

ds.Relations.Add(drQ);

customerXml = ds.GetXml();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM