2009-10-06 63 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。