[英]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.