Fehler bei Verwendung von 2 DataReader

30/09/2009 - 13:07 von Dirk Herwig | Report spam
Hallo,

ich habe versucht, über 2 Datareader eine XML zu erstellen. Leider
funktioniert das nicht - Fehler:
"[System.InvalidOperationException] = {"Diesem Befehl ist bereits ein
geöffneter DataReader zugeordnet, der zuerst geschlossen werden muss."}".

Hier mein Versuch:
[WebMethod]
public XmlDocument GebeDaten()
{
XmlDocument doc = new XmlDocument();

SqlConnection cnn = null;
string sql = string.Format("Select * from LayoutGruppe order by name;");
SqlDataReader reader = null;
SqlDataReader reader2 = null;

try
{
XmlNode docNode = doc.CreateXmlDeclaration("1.0", "utf-8", null);
doc.AppendChild(docNode);

XmlNode rootNode = doc.CreateElement("Layouts");
XmlAttribute attr = doc.CreateAttribute("name");
attr.Value = "Layouts";
rootNode.Attributes.Append(attr);
doc.AppendChild(rootNode);

cnn = new
SqlConnection(ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString);
cnn.Open();

SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = sql;

SqlCommand cmd2 = new SqlCommand();
cmd2.Connection = cnn;

reader = cmd.ExecuteReader();
while (reader.Read())
{
XmlNode itemsNode = doc.CreateElement("item");

XmlAttribute attrRid = doc.CreateAttribute("Name");
attrRid.Value = reader.GetString(1);

XmlAttribute attrSep = doc.CreateAttribute("Value");
attrSep.Value = reader.GetInt64(0).ToString();

XmlAttribute attrWidth = doc.CreateAttribute("Folder");
attrWidth.Value = "1";

itemsNode.Attributes.Append(attrRid);
itemsNode.Attributes.Append(attrSep);
itemsNode.Attributes.Append(attrWidth);

cmd2.CommandText = string.Format("select * from Layouts where
GLID='{0}' order by name", reader.GetInt64(0));
reader2 = cmd2.ExecuteReader();

while (reader2.Read())
{
XmlNode itemNode = doc.CreateElement("file");

XmlAttribute inAttr1 = doc.CreateAttribute("Name");
inAttr1.Value = reader2.GetString(2);

XmlAttribute inAttr2 = doc.CreateAttribute("Value");
inAttr2.Value = reader2.GetInt64(0).ToString();

XmlAttribute inAttr3 = doc.CreateAttribute("Folder");
inAttr3.Value = "0";

itemNode.Attributes.Append(inAttr1);
itemNode.Attributes.Append(inAttr2);
itemNode.Attributes.Append(inAttr3);
itemsNode.AppendChild(itemNode);
}


rootNode.AppendChild(itemsNode);
}
}
catch (Exception ex)
{ }
finally
{
if (cnn != null)
cnn.Close();
if (reader != null)
reader.Close();
if (reader2 != null)
reader2.Close();
}

return doc;
}

Wie kann ich mein Problem lösen, damit ich eine ordentliche XML erzeuge?

Gruss

Dirk
 

Lesen sie die antworten

#1 Julia M
30/09/2009 - 14:10 | Warnen spam
On Sep 30, 1:07 pm, "Dirk Herwig" wrote:

Ich denke, eins Deiner Probleme ist hier zu suchen:
cmd.Connection = cnn;
...
cmd2.Connection = cnn;



Und ich denke auch nicht, daß die Datenbank allzu glücklich über
"order by name" sein dürfte, denn "name" ist im schlimmsten Fall ein
reserviertes Wort.

Im Prinzip erschließt sich mir nicht so ganz, was genau Du versuchst,
aber ließen sich beide Abfrage nicht zu einer verbinden, um sich
verschachtelte Reader nicht antun zu müssen?

Also sowas wie

Select * from [LayoutGruppe] as [t1],[Layouts] as [t2] where [t1].
[glid]=[t2].[glid] order by [t1].[name];


Schau Dir auch mal die Command-Parameters an. Das erspart Dir künftig
Aktionen wie die mit string.format().

Und um Xml rauszuschreiben, ist üblicherweise die Methode "WriteXml"
vorgesehen.

Ähnliche fragen