C# DataSet с XML. Нужно придумать решение...

ice-covered
Дата: 22.12.2009 21:18:53
DataRow [] dr = DSTEST.Tables["answer"].Select("1=1");
Есть вот такой набор ответов (атрибуты: text - ответ на вопрос, qId - id вопроса). Ответы могут быть даны на разные или одни и те же вопросы.
Вопросы хранятся в таблице question (атрибуты: id, name).
Суть в том, что мне надо знать, на какие вопросы вообще был дан хотя бы один ответ.
То есть, если бы это был запрос в SQL, я бы написала так:
SELECT DISTINCT qId FROM answer;
Вот как бы тут сделать аналог DISTINCT?
Буду благодарна за любую помощь!!! Самой в голову идут только какие-то сложные варианты с кучей циклов и проверками, попадал ли этот Id уже в массив, и если нет, то заносить, и так каждый раз.. Может, что по-проще кто придумает?
MAYAKOV_SV
Дата: 23.12.2009 09:42:47
ice-covered
Самой в голову идут только какие-то сложные варианты с кучей циклов и проверками, попадал ли этот Id уже в массив, и если нет, то заносить, и так каждый раз..


Так и нужно наверно делать.
Я так понял проверка нужна, чтобы проверить при ручном вводе пользователя, что ответел ли человек на данный вопрос или нет?
Тут просто перебором проходимся по ответам и ищем: есть ли там уже такой же id вопроса?
Чего тут еще можно придумать?
Не думаю, что там миллион ответов может быть
и что нужна какая-то особая оптимизация и хитроумный алгоритм.
MAYAKOV_SV
Дата: 23.12.2009 11:57:35
ice-covered,

Прошу прощения, я наверно тоже не выспался сегодня, не то я вам написал.

Я думаю можно попробывать проблему решить так:
 // дан ли на вопрос gld хотя бы один ответ ?
 if (DSTEST.Tables["answer"].Select("qld=" + gld.ToString()).Length > 0)
 {

 };

Работает это так:
К таблице answer делается запрос, в котором ищутся записи с id таблицы ответов gld.
В моем примере gld - это как раз и передаваемый id таблицы.
После Select возвращается массив DataRow[], в котором
храниться набор записей с ответами на заданный запрос.
К этому массиву применяем функцию Length, для того чтобы подсчитать число найденных записей.
Если есть хотя бы одна запись с ответом на заданный вопрос, то делаем какие-то действия.
Уфф, вроде все, я просто засунул все в одну строку, но надеюсь, что вы разберетесь.
ice-covered
Дата: 23.12.2009 13:07:34
Спасибо ) В общем-то, я тоже примерно так же предполагала, но Вы дооформили мои мысли! Спасибо!

Вообще мне еще подсказали, что можно как-то напрямую к DataSet-у SQL запросы писать, но я не нашла/не знаю/не помню, как это делать...
MAYAKOV_SV
Дата: 23.12.2009 13:54:34
ice-covered
Спасибо ) В общем-то, я тоже примерно так же предполагала, но Вы дооформили мои мысли! Спасибо!

Вообще мне еще подсказали, что можно как-то напрямую к DataSet-у SQL запросы писать, но я не нашла/не знаю/не помню, как это делать...

Я сам год только на C# пишу, отчеты, знаний у меня маловато.
Я не знаю как к DataSet можно применять SQL запросы.
Вы работаете с файлами XML, как я понимаю?
Думаю вам должно хватить функции Select класса DataTable, методов DataSet и других методов DataTable для обработки информации.
Те же запросы, только в виде кода на C# получится.
Слышал еще XPath есть такой язык - он вытаскивает данные из XML документов.
Но его дополнительно изучать надо, не знаю нужен ли он вам.
Вот такие дела...
vagner
Дата: 23.12.2009 14:45:11
ice-covered,

DataTable.Select
ice-covered
Дата: 25.12.2009 04:39:25
Дабы не забивать форум своими мелкими вопросами, пишу сюда же..
drDS[0]["mark"] = decimal.Parse(sender.ToString(), System.Globalization.NumberStyles.AllowDecimalPoint);
Ругается.
drDS[0]["mark"] = decimal.Parse(sender.ToString());
И так тоже ругается.
Дескать, не верный тип.

В xml вот так:
<xs:element name="mark" type="xs:decimal" minOccurs="0" />

Подскажите, как правильно, пожалуйста?
ice-covered
Дата: 25.12.2009 04:54:45
уже не надо, нашла сама.
decimal.Parse("0.5", System.Globalization.CultureInfo.InvariantCulture.NumberFormat)
MAYAKOV_SV
Дата: 25.12.2009 12:52:26
ice-covered
уже не надо, нашла сама.
decimal.Parse("0.5", System.Globalization.CultureInfo.InvariantCulture.NumberFormat)

Прекрасно!

Вот еще чего я вам нашел (сам не проверял код):
 // Устанавливаем разделитель целой и дробной части - десятичную точку
 System.Globalization.CultureInfo myCI =   (System.Globalization.CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
 myCI.NumberFormat.NumberDecimalSeparator = "."; 
 Thread.CurrentThread.CurrentCulture = myCI;
Как я понял, этот код нужно запустить в коде иницилизации программы, а потом все функции будут с точкой работать, а не запятой.
vagner
Дата: 25.12.2009 12:56:12
MAYAKOV_SV,

думается мне, у ice-covered была проблема не с точкой, а с сендером. Вряд ли источником события являлось число.