2009-10-06 61 views
1

我正在循环使用.net中的一些xml,并将Xml元素分配给字符串变量。在.net中循环xml使用.net

这些变量被传递到一个带有三个参数的方法中。该方法在SQL Server 2005中运行一个存储过程,该存储过程用这三个参数查询数据库。

当手动传递参数时,方法和sproc运行正常。但是,当我尝试从xml文件中获取参数时Visual Studio说“过程或函数usp_CreateOrgDataSet指定的参数太多。”

这是下面

private void GenChart_Click(object sender, EventArgs e) 
    { 


     //Open Connection 
     conn_Org.ConnectionString = Set_OrgChartConn(); 
     conn_Org.Open(); 

       //Load xml Config file 
       XmlDocument doc = new XmlDocument(); 
       doc.Load("Config.xml"); 

       XmlElement root = doc.DocumentElement; 
       XmlNodeList nodes = root.SelectNodes("/root/Org"); 

       foreach (XmlNode node in nodes) 
       { 
        string Title1 = node["OC_Ttl1"].InnerText; 
        string Title2 = node["OC_Ttl2"].InnerText; 
        string OrgName = node["OC_OL31"].InnerText; 



        //Grab Chart data 
        GetChartData(Title1, Title2, OrgName); 
       } 
     conn_Org.Close(); 


       } 

该方法的代码是这样的getChartdate方法

private void GetChartData(string OC_Ttl1, string OC_Ttl2, string OC_OL31) 
    { 
     OC_Ttl_1 = OC_Ttl1; 
     OC_Ttl_2 = OC_Ttl2; 
     OC_OL3_1 = OC_OL31; 



     //Execute Stored Procedure 
     cmd_Org.Connection = conn_Org; 
     cmd_Org.CommandText = "dbo.usp_CreateOrgDataSet"; 
     cmd_Org.CommandType = CommandType.StoredProcedure; 
     cmd_Org.Parameters.AddWithValue("@OC_Ttl_1", OC_Ttl1); 
     cmd_Org.Parameters.AddWithValue("@OC_Ttl_2", OC_Ttl1); 
     cmd_Org.Parameters.AddWithValue("@OC_OL3_1", OC_OL31); 


     //Output xml 
     DataSet orgDataSet = new DataSet(); 
     orgDataSet.ReadXml(cmd_Org.ExecuteXmlReader(), XmlReadMode.Auto); 
     orgDataSet.WriteXml("InputXMLFiles/" + OC_OL3_1.Replace(" ","_") + ".xml"); 





    } 

这是XML

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <Org> 
    <OC_Ttl1>Test1</OC_Ttl1> 
    <OC_Ttl2>Test1</OC_Ttl2> 
    <OC_OL31>OrgName1</OC_OL31> 
    </Org> 
    <Org> 
    <OC_Ttl1>Test2</OC_Ttl1> 
    <OC_Ttl2>Test2</OC_Ttl2> 
    <OC_OL31>OrgName2</OC_OL31> 
    </Org> 
    <Org> 
    <OC_Ttl1>Test3</OC_Ttl1> 
    <OC_Ttl2>Test3</OC_Ttl2> 
    <OC_OL31>OrgName3</OC_OL31> 
    </Org> 
</root> 

在误差当地人的点窗口具有以下值:

OC_Ttl1 “Test2的” 串 OC_Ttl2 “Test2的” 串 OC_OL31 “ORGNAME2” 串

第一迭代成功,但是未能在第二。

+1

第一次迭代成功了吗? – 2009-10-06 11:19:43

+0

是的第一次迭代成功,编辑了问题。谢谢。 – MrBliz 2009-10-06 11:38:33

回答

2

您正在向每次迭代的命令添加参数,这会导致第二次迭代抛出此错误。您需要添加参数一次,然后在每次迭代中设置值。你也可以通过确保cmd_Org在GetChartData中的作用域来解决这个问题。

private void GetChartData(string OC_Ttl1, string OC_Ttl2, string OC_OL31) 
    { 
     OC_Ttl_1 = OC_Ttl1; 
     OC_Ttl_2 = OC_Ttl2; 
     OC_OL3_1 = OC_OL31; 


     //Execute Stored Procedure 
     SqlCommand cmd_Org.Connection = conn_Org; 
     cmd_Org.CommandText = "dbo.usp_CreateOrgDataSet"; 
     cmd_Org.CommandType = CommandType.StoredProcedure; 
     cmd_Org.Parameters.AddWithValue("@OC_Ttl_1", OC_Ttl1); 
     cmd_Org.Parameters.AddWithValue("@OC_Ttl_2", OC_Ttl1); 
     cmd_Org.Parameters.AddWithValue("@OC_OL3_1", OC_OL31); 


     //Output xml 
     DataSet orgDataSet = new DataSet(); 
     orgDataSet.ReadXml(cmd_Org.ExecuteXmlReader(), XmlReadMode.Auto); 
     orgDataSet.WriteXml("InputXMLFiles/" + OC_OL3_1.Replace(" ","_") + ".xml"); 





    } 
+0

将getChartData添加到问题。谢谢。 – MrBliz 2009-10-06 11:40:41

+0

Doh!谢谢。 – MrBliz 2009-10-06 11:54:27

2

总之 - 我不认为这与你的xml代码有关,也没有发布任何代码 。我希望你将不得不澄清其他代码(GetChartData)为我们提供的帮助。

好,对我来说:

foreach (XmlNode node in nodes) 
{ 
    string Title1 = node["OC_Ttl1"].InnerText; 
    string Title2 = node["OC_Ttl2"].InnerText; 
    string OrgName = node["OC_OL31"].InnerText; 

    Console.WriteLine(Title1 + "/" + Title1 + "/" + OrgName); 
} 

输出:

Test1/Test1/OrgName1 
Test2/Test2/OrgName2 
Test3/Test3/OrgName3 

所以它似乎很好地工作。高音检查你的xml,并重新检查你的报告方法(GetChartData)。在你发布的代码中,这一切似乎都很好。

0

什么是您正在执行的SP和SQL的原型?

你只是追加到每个迭代循环的查询?

将该功能置于问题中。

0

没有必要从文档元素开始。实际上,请尝试// Org作为到节点列表的xpath。