返回首页

在我最后一次转让,我需要提交InfoPath表单重复表来访问数据库的内容。
的形式必须是SharePoint网站上公布 - 所以我不能直接提交给数据库,但我是被迫使用Web服务(因为Web启用的形式不容许直接访问数据库)
{ BR}所以我构建一个Web服务方法,它允许我向重复表的一行到数据库中,我认为我将能够提交一些InfoPath表单内的循环,每行。它没有工作,我只是能够提交第一行所有的时间而已

所以我决定提交quot;整个formquot;和Web服务方面比解析。这里是如何做到这一点的一个简短的例子。
准备InfoPath表单
首先让我们简单的InfoPath表单创建一个重复表(如产品清单)


创建Web服务
在Web服务中,您将需要一种方法,这需要的XmlDocument和将解析这个XML文档表示的InfoPath表单和它的值存储到数据库中。

[WebMethod]

public void SubmitDocument(XmlDocument doc)

{           

  XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable); 

  nsManager .AddNamespace(formNamespace, formURI);

  nsManager .AddNamespace("dfs",

"http://schemas.microsoft.com/office/infopath/2003/dataFormSolution");



  XmlNode root = doc.DocumentElement;

  XmlNodeList list = root.SelectNodes("/dfs:IPDocument/my:myFields/my:prodList/my:product", nsManager);



  foreach (XmlNode node in list)

  {

    string name = node.SelectSingleNode("/dfs:IPDocument/my:myFields/my:prodList/my:product/my:name", nsManager).InnerText;

    string price = node.SelectSingleNode("/dfs:IPDocument/my:myFields/my:prodList/my:product/my:price", nsManager).InnerText;

    string amount = node.SelectSingleNode("/dfs:IPDocument/my:myFields/my:prodList/my:product/my:amount", nsManager).InnerText;



    SubmitToDataBase(name,price, amount);

  }

}



在这个方法中我们首先初始化的XmlNamespaceManager。这个经理,我们将添加2命名空间。第一个是InfoPath文档的数据源的命名空间。这其中我们可以发现在InfoPath客户端的导航属性- GT;细节

现在,当InfoPath提交到Web服务的形式,它增加了一个标记为文件命名空间:与URL的HTTP DFS :/ / schemas.microsoft.com/office/infopath/2003/dataFormSolutionquo​​t;,你需要添加的命名空间命名空间管理

,然后在XmlDocument中,我们需要知道的XPath,这直接导致所需的XmlNode某些领域的价值。我们可以通过复制XPath选项,它可以在上下文菜单中找到所需quot领域的XPath数据Sourcesquot;标签

例如,要获得的quot; amountquot; XmlNode和后来字串,表示这个节点内的编号,我们可以使用下面的代码:

XmlNode nAmount = node.SelectSingleNode("/dfs:IPDocument/my:myFields/my:prodList/my:product/my:amount", nsManager);



int amount = Convert.ToInt32(nAmount.InnerText);

准备Accesss数据库连接要连接到Access数据库,可以使用的OLE DB提供者,正是。NET框架的OLE DB提供程序的命名空间System.Data.OleDB中。首先,你需要指定你的数据库连接字符串。因为我们使用的Web服务,它是存储在Web.config文件中的好主意。到Web.config文件中添加以下。
<connectionStrings>

  <add name="myDB" providerName="Microsoft.Jet.OLEDB.4.0" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myDB.accdb"/>

</connectionStrings>

后来,已经在您的Web服务的代码,你可以准备自己的属性,这会为您提供此连接字符串(你可以参考这个连接字符串几次,这是好事,有一个快捷方式在Web.config参考) 。
public String ConStr

{

  get { return ConfigurationManager.ConnectionStrings["myDB"].ConnectionString; }

}

以下是一个简单的实现方法存储在数据库中的数据。您可以您的Web服务方法的部分,直接或建立自己的一些数据访问层类。
    public void SubmitToDataBase(String name, String price, String amount)

    {

      OleDbConnection con = new OleDbConnection(ConStr);

      

      String cmd = "INSERT INTO products(name,price,amount)values(?,?,?)";

      OleDbCommand command = new OleDbCommand(cmd, con);

      

      OleDbParameter pName = new OleDbParameter();

      pName.Value = name;

      command.Parameters.Add(pName);



      OleDbParameter pPrice = new OleDbParameter();

      pPrice.Value = Convert.ToInt32(price);

      command.Parameters.Add(pName);

      

      OleDbParameter pAmount = new OleDbParameter();

      pAmount.Value = Convert.ToInt32(amount);

      command.Parameters.Add(pAmount);



      con.Open();

      command.ExecuteNonQuery();

      con.Close();



    }

这里没有什么太有趣了,如果你熟悉一些其他的ADO.NET类。只要注意,我使用参数化查询。 SQL命令中包含问号,这是后来当实际的OleDbCommand编译提供的参数取代。这是有关Web服务的,现在你需要回去和配置InfoPath表单连接到Web服务。InfoPath表单连接到Web服务确定现在让我们回到InfoPath表单设计的。文档提交给此Web服务,您将添加新的数据源选择数据提交- GT; Web服务。比本地化Web服务发现,你刚刚创建的,比终于在数据连接向导"选择"提交整个表单。

{A}

现在只给你一个完整的想法的方法这里是被提交到Web服务的XML。但是,如果该文件是保存为XML(如在SharePoint文档库),DFS命名空间是没有出现。

<dfs:ipdocument xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution"><my:myfields xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-05-18T07:21:28" xml:lang="en-us">

 <my:prodlist>

  <my:product>

   <my:name>



   <my:price xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

   <my:amout xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  </my:amout></my:price></my:name></my:product>

 </my:prodlist>

</my:myfields>

</dfs:ipdocument>

{A2}

回答

评论会员:会员8533328 时间:2012/01/26
在您的文章,你说:

"第一个是这其中我们可以发现在InfoPath客户端的导航属性- GT;,InfoPath文档的数据源的命名空间。详情"

我无法找到。你能告诉我具体如何在InfoPath 2010中找到此信息
评论会员:KobidaMaceda 时间:2012/01/26
您好,

我跟着你这里所说的步骤,但是当我开始运行的形式保存在数据库中,它不仅节省了重复表中的第一条记录。能否请你给我一个头,就这一个吗?感谢一堆
评论会员:!madhupremnathan 时间:2012/01/26
nsManager.AddNamespace("我","http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-09-06T14:32:16")

在InfoPath 2007文件>另存为源文件,并选择目标。
然后打开文件sampledata.xml获得命名空间{S3}