[英]Passing dates to the stored procedure and get details in return to display in html table
[英]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.