编码从InfoPath 2003表单生成SQL表而不事先知道字段

时间:2011-08-16 12:14:38

标签: c# xml web-services parsing infopath

使用: InfoPath 2003(及其XML),Microsoft SQL Server 2005,Visual Studio 2005,C#(用于制作Web服务)

我一直在努力找到能够做到这一点的事情,而且我的谷歌技能都失败了,或者实际上不可能,因为我无法相信某人不需要这样做。

我正在尝试创建一个采用InfoPath表单的Web服务,从表单中获取所有字段的列表(如果用户对验证感到困扰,则获取相关的预期数据类型),并在SQL数据库中创建表具有相同的字段和预期类型(可能使用varchar作为未使用验证的默认类型)。我不能提前列出这些字段,因为从理论上讲,管理人员和工程师将为各种目的制作新表格,我需要避免混淆或让他们直接访问服务器。

我之前从未做过任何此类事情,也没有使用过XML(或C#)。在我疯狂地试图让一切工作之前,我需要知道:这可能吗?我知道XML文档基本上由用户定义的标签组成,我不知道是否有任何方法可以将表单字段与任何其他与正确呈现文档相关联的标签区分开来。我也不知道是否有可用于获取预期数据类型的方法。如果这些东西是可能的,任何指导如何将被赞赏。


更新

从XML级别的InfoPath表单判断,似乎所有字段都包含在<my:myFields>标记中。它还包含<xd:SchemaInfo>标记,所以现在我必须弄清楚如何访问所有字段而忽略那个字段。

我仍然不知道我是否正在尝试做一些奇怪的事情,不可能出于其他原因或不好的做法,所以知道事情的人的建议总是受欢迎的。

1 个答案:

答案 0 :(得分:1)

是的,这完全有可能。您需要确保的唯一事情是,经理/工程师将此表单作为字符串提交给您的Web服务,如此屏幕截图所示。

enter image description here

您需要将表单作为字符串提交的原因很简单 - 您无法配置IP以直接发送XmlDocument对象。但是,您可能需要在您/您的同事创建的每种形式中使用自定义代码,因此我建议您使用无代码解决方案。

以下是如何实现Web服务方法。

[WebMethod]
public void CreateTable(string infoPathData)
{
    var doc = new XmlDocument();
    doc.LoadXml(infoPathData);

    //gets the namespace uri - it is unique for each form
    string nsUri = doc.ChildNodes[3].Attributes["xmlns:my"].Value;

    var nsManager = new XmlNamespaceManager(doc.NameTable);
    nsManager.AddNamespace("my", nsUri);

    //select the myField node
    var root = doc.SelectSingleNode("my:myFields", nsManager);

    var sqlStatement = new StringBuilder();
    sqlStatement.Append("CREATE TABLE ....");

    foreach (XmlNode n in root.ChildNodes)
    {
        //n.Name - gets the name of the node (incl. NS)
        //n.InnerText - gets the field value 

        //append to sqlStatement
    }

    //execute sql statement ...
}

您从提交的IP数据构建XmlDocument,然后迭代它的字段。根据您的要求,您可能还需要迭代子节点(即,如果表单包含文件夹/重复表等),但这真的取决于您; - )

如果您以前从未使用过XmlDocument,请务必查看此链接http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx

您需要对使用您的网络服务的用户强制执行某些特定规则,例如当有人将“my:myFields”重命名为“my:myBlaBla”(可能)并将其表单提交给您的网络服务时会发生什么情况。此外,我建议非常严重的错误记录,因为这样的通用方法可能(并且会!)出错。

我能想到的唯一问题是如何确定每个字段的数据类型,因为它不包含在InfoPath表单数据中。您可以尝试常用的C#转换方法(如Int32.TryParse等)。

希望这会有所帮助: - )