цикл через XML в .net - PullRequest
       189

цикл через XML в .net

1 голос
/ 06 октября 2009

Я перебираю некоторые XML в .net и присваиваю элементы Xml строковым переменным.

Эти переменные передаются в метод, который принимает три аргумента. Этот метод запускает хранимую процедуру в 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>

В точке ошибки окно localals имеет следующие значения:

OC_Ttl1 "Test2" строка OC_Ttl2 "Test2" строка OC_OL31 "OrgName2" string

Первая итерация завершается успешно, но не выполняется на второй.

Ответы [ 4 ]

2 голосов
/ 06 октября 2009

Вы добавляете параметры в команду на каждой итерации, что приводит к тому, что 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");





    }
2 голосов
/ 06 октября 2009

Короче - я не думаю, что это имеет какое-либо отношение к вашему 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 голосов
/ 06 октября 2009

Нет необходимости начинать с элемента документа. На самом деле, попробуйте // Org в качестве вашего xpath к списку узлов.

0 голосов
/ 06 октября 2009

Также, каков прототип sp и sql, который вы выполняете?

Вы просто добавляете запрос к каждому циклу итерации?

Поставьте функцию в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...