在我最后一次转让,我需要提交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/dataFormSolutionquot;,你需要添加的命名空间命名空间管理
,然后在XmlDocument中,我们需要知道的XPath,这直接导致所需的XmlNode某些领域的价值。我们可以通过复制XPath选项,它可以在上下文菜单中找到所需quot领域的XPath数据Sourcesquot;标签
例如,要获得的quot; amountquot; XmlNode和后来字串,表示这个节点内的编号,我们可以使用下面的代码:
准备Accesss数据库连接要连接到Access数据库,可以使用的OLE DB提供者,正是。NET框架的OLE DB提供程序的命名空间System.Data.OleDB中。首先,你需要指定你的数据库连接字符串。因为我们使用的Web服务,它是存储在Web.config文件中的好主意。到Web.config文件中添加以下。XmlNode nAmount = node.SelectSingleNode("/dfs:IPDocument/my:myFields/my:prodList/my:product/my:amount", nsManager);
int amount = Convert.ToInt32(nAmount.InnerText);
后来,已经在您的Web服务的代码,你可以准备自己的属性,这会为您提供此连接字符串(你可以参考这个连接字符串几次,这是好事,有一个快捷方式在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服务方法的部分,直接或建立自己的一些数据访问层类。
public String ConStr
{
get { return ConfigurationManager.ConnectionStrings["myDB"].ConnectionString; }
}
这里没有什么太有趣了,如果你熟悉一些其他的ADO.NET类。只要注意,我使用参数化查询。 SQL命令中包含问号,这是后来当实际的OleDbCommand编译提供的参数取代。这是有关Web服务的,现在你需要回去和配置InfoPath表单连接到Web服务。InfoPath表单连接到Web服务确定现在让我们回到InfoPath表单设计的。文档提交给此Web服务,您将添加新的数据源选择数据提交- GT; Web服务。比本地化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();
}
{A}
现在只给你一个完整的想法的方法这里是被提交到Web服务的XML。但是,如果该文件是保存为XML(如在SharePoint文档库),DFS命名空间是没有出现。
{A2}<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>