¿Cómo hago referencia a un objeto DataRow elemento por su nombre en un conjunto de datos obtenido de SQL?
Pregunta
Así que estoy construyendo algo de XML usando un XmlWriter
y un DataSet
pero cuando se trata de tiempo para recorrer cada uno de los DataRow
en el DataSet
Yo no puedo entender cómo hacer referencia como "userid", y esos que vienen de vuelta del procedimiento almacenado.En el código de la página que veo como Eval("userid")
o lo que sea que estoy utilizando el mismo procedimiento almacenado, pero la estoy usando en un ASHX ahora...ver el '¿QUÉ PASA AQUÍ??' en el siguiente código...
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();
}
Solución
En primer lugar, el foreach es erróneo. Es necesario para recorrer getData.Tables[0].Rows
. Si hay más de 1 mesa, es necesario un bucle sobre getData.Tables.
Sin embargo, la respuesta es que es una propiedad indexada. Así, dr["userId"]
le dará el valor.
foreach (DataRow dr in getData.Tables[0].Rows) {
/ * blah, blah */
writer.WriteAttributeString("userId", dr["userId"]);
}
Otros consejos
Es bastante sencillo. Una columna de número entero en su DataRow (dr) se accede con:
int someVal = (int)dr["ColumnName"];
Su foreach interior es el problema.
En caso de ser
if(getData.Tables.Count > 0){
foreach(DataRow dr in getData.Tables[0].Rows){
writer.WriteAttributeString("userid", dr["UserID"]);
}
}
Vas a querer añadir un nivel de iteración - que está iterando sobre las tablas actualmente en su foreach(DataRow dr in getData.Tables)
, los objetos DataRow están por debajo de un nivel
Trate de usar la DataRow.Item propiedad como se muestra a continuación
dr["userid"]