October 2012 Blog Posts

Visual Foxpro dbf To MS SQL Server

27 October 2012 |

Задача – обновлять данные используя в качестве источника данных регулярно обновляемые файлы dbf, которые формируются средствами Visual Foxpro.

Применялось решение: импортировать средствами DTS данные напрямую в MS SQL Server и потом уже работать с промежуточной базой. Нормальный рабочий вариант, объемы данных не большие, обновления выполняются редко. В связке WindowsXP + MS SQL 2008R2 с использованием драйвера “Microsoft OLE DB Provider for Visual FoxPro 9.0” всё работало и не было поводов о чем либо задумываться.

Мир разработки программного обеспечения изменчив – наступил момент перехода на MS SQL 2012, а он требует Windows 7. После такого радикального обновления программного обеспечения у специалиста занимающегося разработкой и поддержкой синхронизации с Foxpro возникли трудности. Далее будет описание решения задачи получение данных из базы Foxpro средствами MS SQL Server 2012 и граблей на этом пути.

Итак имеем Windows 7 + MS SQL Server 2012 + набор dbf файлов.

Установка провайдера для Foxpro

Заходим на Visual FoxPro Developer Center, видим:

Visual FoxPro ODBC Driver
The VFPODBC driver is no longer supported. We strongly recommend using the Visual FoxPro OLE DB provider as a replacement. Please refer to the following article for more information and related links to issues when using the VFPODBC driver: 
http://support.microsoft.com/kb/277772  .

Скачиваем Microsoft OLE DB Provider for Visual FoxPro 9.0, устанавливаем.

Попытки использовать установленного (Microsoft OLE DB Provider for Visual FoxPro) поставщика данных приведет к ошибке “OLE DB Core Services”, выглядит примерно так:

Всемирная сеть по этому вопросу молчит, а данные импортировать надо… Зато есть отличная статья Импорт dbf в SQL Server и описанный в ней способ работает практический во всех случаях, за исключением когда формат dbf – Visual FoxPro 3.0 – как раз наш случай.

Установка и настройка Linked Servers

Эксперименты показывают что OLE DB Provider for Visual FoxPro не совсем мертвый, если его использовать программно то он работает.

Подключим наши dbf как LinkedServer к MS SQL, но сначала нужно сделать настройку для VFPOLEDB в MS SQL, а именно включить настройку “Allow inprocess”.

Скрип создающий LinkedServer

EXEC master.dbo.sp_addlinkedserver
@server = N'VFPTest',
@srvproduct=N'Microsoft Visual FoxPro OLE DB Data Provider',
@provider=N'VFPOLEDB',
@datasrc=N'C:\Temp',
@provstr=N'VFPOLEDB.1'

где C:\Temp папка содержащая dbf файлы.

Момент истины выполняем запрос:

select * from VFPTest...tbl

tbl это имя файла tbl.dbf, находящегося в папке C:\Temp

При удачном стечении обстоятельств запрос должен вернуть данные, но могут быть проблемы с правами доступа, в этом случае рекомендуется посмотреть закладку Security в свойствах созданного linked server-а и права непосредственно на папку и файлы dbf.

В заключении нужно сделать важное замечание 64 битной версии провайдера не существует, поэтому необходимо использовать либо 32 битную версию SQL Server 2012 либо обходной способ через формирование и запуск пакетов SSIS в 32 битном режиме, подробности: Working with 32 bit providers and 64 bit SQL Server

Science + Church = Drug

17 October 2012 |

Если в наше время кто-то еще проповедует религию, то вовсе не потому, что религиозные представления продолжают нас убеждать; нет, в основе всего скрывается желание утихомирить народ, простых людей. Спокойными людьми легче управлять, чем неспокойными и недовольными. Их и легче использовать или эксплуатировать. Религия — это род опиума, который дают народу, чтобы убаюкать его сладкими фантазиями, утешив таким образом насчет гнетущих его несправедливостей. Недаром всегда так быстро возникает альянс двух важнейших политических сил, государства и церкви. Обе эти силы заинтересованы в сохранении иллюзии, будто добрый боженька если не на земле, то на небе вознаградит тех, кто не возмущался против несправедливостей, а спокойно и терпеливо выполнял свой долг. Вот почему честная констатация того, что этот бог есть просто создание человеческой фантазии, считается худшим смертным грехом

Поль Дирак (Лауреат Нобелевской премии по физике)

Началось с Помолясь сейчас В МИФИ откроют кафедру теологии, продолжите ряд, ответы будут опубликованы в прессе через год.

Светское государство на бумаге, если бы не множество религий на одной территории, то давно бы уже оформили как “божье”, так и сделают если удастся отупить народ быстрей чем сами протухнут.

Кафедра теологии в МИФИ это тоже самое что и выступление Pussy Riot в храме. Знают что так делать не надо и именно поэтому делают – провокация, в нормальном государстве две стратегии либо либерально относиться ко всему (классическая демократия), либо мочить всех (Китай), а так что одних поддерживать, а других мочить это раскол общества – разделяй и властвуй.

Посмотрите на настоящих людей:

Turn Off Monitor

14 October 2012 |

Идя на обед блокирую компьютер, из-за чего-то иррационального ещё и выключаю монитор (хотя он и сам по себе через некоторое время отключится), если два монитора – каждый отключается “лично”.

Простая, мелкая, но приятная фича – автоматически выключать мониторы при блокировки компьютера – как? – случайно в новостной рассылке увидел. Придется написать код и оформить как положено – это плюс или минус…

Вот: How to turn off your monitor when you lock your machine

Dynamic LINQ

11 October 2012 |

Вопрос: Можно ли динамически составлять LINQ выражения?

Ответ: Конечно можно.

Вопрос: А как?

Ответ: … уже сложней. Встречный вопрос: А зачем?

Ответ: К примеру формировать сложные/разнообразные условия для поиска. Раньше для таких задач динамически формировали SQL, сейчас LINQ, а уж SQL провайдер сам сгенерирует.

Первое что выдает поиск по данной теме: Dynamic LINQ, так же есть LinqTextQueryBuilde, какого-то официального удобного способа нет, что сразу же настораживает и может быть разумней выбрать альтернативное решение, чтобы не увеличивать риски разработки.

Рискнул попробовать, использовал Dynamic LINQ – представляет собой C# файл на 2000 строчек кода. Сразу же столкнулся с проблемами: к примеру не поддерживается оператор Contains – решается с помощью напильника Advanced Linq - Dynamic Linq query library: Add support for 'Contains' extension, не может корректно сравнивать Guid и Guid?, решается расширением интерфейса:

interface IEqualitySignatures : IRelationalSignatures
{
    void F(bool x, bool y);
    void F(bool? x, bool? y);
    void F(Guid x, Guid y);
    void F(Guid? x, Guid? y);

}

И прочие подобные мелочи, исходный код доступен поэтому всё можно решить, но главное понять “оно вам надо” – если сильно хочется то можно.