Как мне ссылаться на элемент DataRow по имени в наборе данных, полученном из SQL?
Вопрос
Итак, я создаю некоторый XML, используя XmlWriter
и a DataSet
но когда приходит время перебирать каждый DataRow
в DataSet
Я не могу понять, как сделать ссылку типа "userid" и такую, которая возвращается из хранимой процедуры.В коде страницы я вижу, что они делают это следующим образом Eval("userid")
или что бы там ни было, я использую ту же хранимую процедуру, но сейчас я использую ее в ASHX...смотрите раздел "ЧТО ЗДЕСЬ ПРОИСХОДИТ??" в приведенном ниже коде...
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();
}
Решение
Во-первых, ваш foreach неверен.Вам нужно зациклиться на getData.Tables[0].Rows
.Если имеется более 1 таблицы, вам нужно выполнить цикл по getData.Таблицы.
Но ответ в том, что это индексированное свойство.Итак, dr["userId"]
это принесет вам пользу.
foreach (DataRow dr in getData.Tables[0].Rows) {
/ * blah, blah */
writer.WriteAttributeString("userId", dr["userId"]);
}
Другие советы
Это довольно просто.Доступ к целочисленному столбцу в вашем datarow (dr) будет осуществляться с помощью:
int someVal = (int)dr["ColumnName"];
Проблема в вашем внутреннем foreach.
Должно быть
if(getData.Tables.Count > 0){
foreach(DataRow dr in getData.Tables[0].Rows){
writer.WriteAttributeString("userid", dr["UserID"]);
}
}
Вы захотите добавить уровень итерации - в данный момент вы выполняете итерацию по таблицам в вашем foreach(DataRow dr in getData.Tables)
, объекты DataRow находятся на один уровень ниже.
Попробуйте использовать Поток данных.Элемент Свойство, как показано ниже
dr["userid"]