вторник, 30 ноября 2010 г.

Visual Studio С# 2010 Express. Не сохраняются данные в базе.

 Я потерял часа три на то, что бы понять, почему, когда я вызываю функцию DataContext.SubmitChanges(), данные в базе данных не обновляются. При этом никаких ошибок нет. Если в точно такую же ситуацию попали и вы, советую почитать вот здесь:
http://www.visualstudiodev.com/visual-c-express-edition/tableadapter-not-inserting-rows-to-the-database-43671.shtml
Если коротко, то при отладке программы в Visual Studio C# Express, файл базы данных копируется в каталог "(ProjectDir)\bin\Debug\mydatabase.mdb" и все изменения происходят уже в этой базе. Их не увидишь, пока не сделаешь еще одно подключение в проекте на этот файл базы данных. Ну а если эти данные важны для вас, то придется вручную заменить оригинальный файл базы данных на файл временной  базы. До этого я использовал Visual Studio Web Developer 2008 Express, ничего такого там не было.

суббота, 13 ноября 2010 г.

Осваиваем LINQ to XML

Как я описал в предыдущем посте Разбор HTML в Microsoft C Sharp запрос по URL  http://sberbank-ast.ru/PurchaseList.aspx возвращает данные  в XML формате. Нам нужно их разобрать. Как раз есть повод применить LINQ to XML. Сразу посоветую книжку для изучения. Авторы: Джозеф Албахари, Бен Албахари. Название - "LINQ карманный справочник". Очень доходчиво написано.
В этой книжке также есть ссылка на программу LINQPAD, где можно поупражняться в написании запросов на LINQ. Программа бесплатная, но за такой сервис, как "autocompletion" (аналог intellisense в Visual Studio) придется заплатить. Итак имеем XML структуру :

Допустим нам нужно найти purchID по определенному фильтру. Вот как выглядит код:


То есть мы выводим идентификаторы тех аукционов, которые в своем наименовании содержат слово "Поставка", и их ID больше 58061, и в описании встречаются или "Саратов" или "Москва".
Есть один момент, который меня не устраивает в этом коде. Хотелось бы, чтобы фильтр был универсальным. Например, я хочу включить несколько городов.  Понятно, что здесь нужно использовать деревья-выражения. Вот здесь мне и помог  Джозеф Албахари. Он написал универсальные extension функции для типа Expression < Func <T,TResult>>. По этой ссылки вы найдете их определения и примеры использования.
Dynamically Composing Expression Predicates
А теперь как изменился код:




Обратите внимание на Compile(). Мне пришлось использовать эту функцию для того что перевести дерево-выражение в лямбда-выражение , так как запрос локальный и возвращает тип IEnumerable, а не интерпретируемый, который возвращает IQueryable. Разница между двумя типами  описана в книге "LINQ карманный справочник".

среда, 10 ноября 2010 г.

Разбор HTML в Microsoft C Sharp

Приятно когда опытные программисты делятся полезными идеями и даже кодом своих программ. Вот один из примеров. Для своего нового проекта мне понадобился разборщик HTML. Мне нужен очень простенький, где я мог бы для определенного атрибута вытащить его значение. В принципе в сети нашел несколько вариантов. Но остановился вот на этом:
Parsing HTML in Microsoft C#.
Очень советую. Все просто и нагладно показано.   Вот пример как я его использую. Мне нужно получить реестров аукционов с сайта http://sberbank-ast.ru/PurchaseList.aspx  Посмотрев HTML -код страницы нашел тег input c атрибутом name="ctl00$ctl00$phWorkZone$xmlData"  - это для меня ключ поиска, но а потом у этого же тега вытаскиваю значение атрибута value со списком новых аукционов < input name="ctl00$ctl00$phWorkZone$xmlData" text="text" value="..здесь данные которые мне нужны...      Вот код для получения этих данных:



tag ["value"].Value не совсем еще XML. Просто вместо "<" стоит &lt  поэтому и понадобилась процедура для замены. Вот код этой процедуры



Вывод программы примерно следующий: