繁体   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