Como faço referência a um elemento DataRow pelo nome em um DataSet recuperado do SQL?
Pergunta
Então, eu estou construindo alguns XML usando um XmlWriter
e uma DataSet
mas quando chega a hora de percorrer cada DataRow
na DataSet
não consigo descobrir como fazer referência como "UserID" e tal que voltar a partir do procedimento armazenado . No código da página os vejo fazendo isso como Eval("userid")
ou o que quer que eu estou usando o mesmo procedimento armazenado, mas eu estou usando-o em uma ASHX agora ... ver o 'O QUE VAI AQUI ??' no código abaixo ...
DataSet getData;
getData = SqlHelper.ExecuteDataset(ConfigurationManager.ConnectionStrings["connstr"].ConnectionString, CommandType.StoredProcedure, "Course_NewReportGet_Get_Sav", objPAra)
//COUNT NUMBER OF RESULTS FOR COUNT ATTRIBUTE (must add!)
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = (" ");
using(XmlWriter writer = XmlWriter.Create("data.xml", settings))
{
writer.WriteStartElement("changes");
writer.WriteAttributeString("clientname", foundCompany.CompanyName);
writer.WriteAttributeString("clientid", foundCompany.Abbreviation);
//writer... INSERT COUNT ATTRIBUTE
foreach(DataRow dr in getData.Tables)
{
writer.WriteStartElement("change");
writer.WriteStartElement("user");
writer.WriteAttributeString("userid", dr... WHAT GOES HERE??;
}
writer.WriteEndElement();
}
Solução
Em primeiro lugar, o seu foreach está errado. Você precisa loop sobre getData.Tables[0].Rows
. Se há mais de uma tabela, você precisa varrer getData.Tables.
Mas, a resposta é que é uma propriedade indexada. Então, dr["userId"]
você irá obter o valor.
foreach (DataRow dr in getData.Tables[0].Rows) {
/ * blah, blah */
writer.WriteAttributeString("userId", dr["userId"]);
}
Outras dicas
É bastante simples. Uma coluna inteira em sua datarow (dr) iria ser acessado com:
int someVal = (int)dr["ColumnName"];
Seu foreach interior é a questão.
Deve ser
if(getData.Tables.Count > 0){
foreach(DataRow dr in getData.Tables[0].Rows){
writer.WriteAttributeString("userid", dr["UserID"]);
}
}
Você vai querer adicionar um nível iteração - você está actualmente a iteração sobre tabelas em seu foreach(DataRow dr in getData.Tables)
, os DataRow objetos estão um nível abaixo
Tente utilizar o DataRow.Item propriedade como mostrado abaixo
dr["userid"]