我在.net中循环一些xml并将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>
在错误点处,locals窗口具有以下值:
OC_Ttl1“Test2”字符串 OC_Ttl2“Test2”字符串 OC_OL31“OrgName2”字符串
第一次迭代成功,但第二次失败。
答案 0 :(得分: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
)。在您发布的代码中,这一切似乎都很好。
答案 1 :(得分: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 :(得分:0)
你正在执行的sp和sql的原型是什么?
您是否只是在每个迭代循环中追加一个查询?
将该功能放入问题中。
答案 3 :(得分:0)
无需从文档元素开始。实际上,尝试将// Org作为节点列表的xpath。