C# 编码以从InfoPath 2003表单生成SQL表,而无需事先知道字段

C# 编码以从InfoPath 2003表单生成SQL表,而无需事先知道字段,c#,xml,web-services,parsing,infopath,C#,Xml,Web Services,Parsing,Infopath,使用:InfoPath 2003(及其XML)、Microsoft SQL Server 2005、Visual Studio 2005、C#(创建web服务) 我一直在努力寻找一些可以做到这一点的东西,要么我的谷歌技能失败了,要么根本不可能,因为我不敢相信有人已经不需要了 我正在尝试创建一个web服务,该服务采用InfoPath表单,从表单中获取所有字段的列表(如果用户为验证而烦恼,则获取其相关的预期数据类型),并在SQL数据库中创建一个具有相同字段和预期类型的表(可能使用varchar作为默

使用:InfoPath 2003(及其XML)、Microsoft SQL Server 2005、Visual Studio 2005、C#(创建web服务)

我一直在努力寻找一些可以做到这一点的东西,要么我的谷歌技能失败了,要么根本不可能,因为我不敢相信有人已经不需要了

我正在尝试创建一个web服务,该服务采用InfoPath表单,从表单中获取所有字段的列表(如果用户为验证而烦恼,则获取其相关的预期数据类型),并在SQL数据库中创建一个具有相同字段和预期类型的表(可能使用varchar作为默认类型,而不使用验证)。我不能提前列出字段,因为理论上,经理和工程师将为各种目的制作新表单,我需要避免混淆它们或让它们直接访问服务器

我以前从未做过类似的事情,也没有使用过XML(或C#,就这一点而言)。在我试图让每件事都运转起来之前,我需要知道:这可能吗?我知道XML文档基本上是由用户定义的标记组成的,我不知道是否有任何方法可以将表单字段与正确呈现文档相关的任何其他标记区分开来。我也不知道是否有方法可以获得预期的数据类型。如果这些东西是可能的,任何指导如何将不胜感激


更新

从XML级别的InfoPath表单判断,所有字段似乎都包含在
标记中。它还包含
标记,因此现在我必须弄清楚如何在忽略该字段的同时访问所有字段


我仍然不知道我是否在尝试做一些奇怪的、不可能的事情,或者是不好的做法,所以欢迎了解情况的人提供建议。

是的,这是完全可能的。您需要确保的唯一一件事是,经理/工程师根据您的web服务提交他们的表单,如本屏幕截图所示

您需要以字符串形式提交表单的原因很简单—您无法将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,请务必查看此链接

您需要对使用您的web服务的人强制执行一些特定规则,例如,当有人将“my:myFields”重命名为“my:MyBlablabla”(这是可能的)并将其表单提交到您的web服务时会发生什么情况。我还建议使用非常严重的错误日志记录,因为这样一种通用方法可能(也将!)出错

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


希望这有帮助:-)

这确实很有帮助!我必须试一试。请注意,我使用IP2010进行了尝试,但这并不重要。。。此外,如果您需要任何进一步的帮助,请随时与我联系,这听起来是一个非常有趣的项目:-)