Рассылка закрыта
При закрытии подписчики были переданы в рассылку "BloggLand и Я | Блоггландия" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
В восьмом выпуске рассылки '.Net Собеседник' вы можете познакомиться с обзором
Информационный Канал Subscribe.Ru |
.Net Собеседник #8
Содержание- От автора
- Обзор новостей
- Практическое использование особенностей .Net CLR в новой версии сервера MS SQL ‘Yukon’
- Время кода - Автозаполнение комбобокса
- Форумы .Net на www.sql.ru
От автора
Здравствуйте, коллеги!
1. Database Engine
2. Analysis services
3. DTS
4. ADO.NET
Ну, а если вы хотите узнать о MS SQL Server'e больше, рекомендую вам рассылку, автором которой является Александр Гладченко - 'MS SQL Server - дело тонкое...'
{К содержанию}
Обзор новостей
-
Функциональность
Windows Explorer’a с помощью FileView.Net Control 5.1
- Sky Software представляет версию 5.1 своего элемента управления FileView.Net Control, который привнесёт в ваше приложение Windows Forms функциональность Windows-Explorer’a. Он имитирует функциональность Windows Explorer’a, включая поддержку различных стилей в различных режимах просмотра , автообновление, технологию перетащи-и-брось, иконки, контекстные меню элементов и фона, виртуальные элементы, обработку клавиш по умолчанию, переименование и подсказки.
-
Увидел свет Aspose.Spell 1.6
- Aspose.Spell – многоязычный компонент для платформы .Net, позволяющий вам проверять правописание на 23 языках.
-
Вышел Aspose.Word 1.2
- Aspose.Word - .Net компонент, позволяющий вам читать и писать документы Word без использования Microsoft Word. Полный список возможностей и особенностей вы найдёте по ссылке.
-
Вышел
FusionCharts Instrumentation Suite 1.0
- InfoSoft выпустила FusionCharts Instrumentation Suite 1.0, новый член известного семейства продуктов FusionCharts. FusionCharts Instrumentation Suite – это набор элементов управления, написанных с использованием Macromedia Flash, таких как Angular, Meter, LED, Linear, Cylinder, Real Time Line и Bulb Gauge, использующихся для разработки реалистичных панелей инструментов и финансовых приложений.
-
DeKlarit был
выбран лучшим инструментом для моделирования, оптимизации и анализа .NET
приложений
- DeKlarit (http://www.deklarit.com) был выбран лучшим инструментом для моделирования, оптимизации и анализа .NET приложений в журнале .NET Developers.
-
Active
Up выпустила ActiveTree V1.1
- ActiveTree – мощный компонент типа TreeView, позволяющий легко строить древовидные системы навигации и системы выбора. Удобная привязка к данным позволит вам заполнить дерево буквально несколькими строками кода. Наш уникальный редактор компонент, встроенный в Visual Studio.NET позволит вам создать дерево, используя полностью WYSIWYG интерфейс. Древовидную структуру можно полностью загрузить из внешнего XML-файла или с помощью тэгов на ASPX-страницах.
-
Kapow RoboSuite 5.0:
веб-интеграция для .NET
-
RoboSuite позволит вам:
- превратить существующий веб-сайт в веб-сервис
- собрать информацию о ценах с нескольких веб-сайтов и сгенерировать страничку, сравнивающую их
- вырезать html-код из существующего сайта и вставить его в свой портал в изменённом виде, но с полностью работающими ссылками
Для скачивания доступна пробная версия.
Я для себя практически ничего интересного там не нашёл :(, а весит ок. 130МБ.
Для скачивания доступна пробная версия.
Практическое использование особенностей .Net CLR в новой версии сервера MS SQL ‘Yukon’
Практическое использование особенностей .Net CLR в новой версии сервера MS SQL ‘Yukon’
ЯЗЫК: C#
Адрес оригинальной статьи: http://www.sqljunkies.com/
Автор: Kent Tegels
Дата публикации оригинала: 26.01.2004 г.
ПЕРЕВОД: Чужа В.Ф. ака hDrummer
Проблема
Я работаю в ведущей архитектурной компании в Омахе, Небраска: HDR,
Inc. У компании есть офисы не только в Омахе; по большому счёту, HDR обладает
более чем 100 офисами и стройплощадками. Это значит, что обычным явлением для
наших работников является перемещение от офиса к офису по мере работы над
различными проектами. Такие путешествия часто совершаются на самолётах и часто
люди не уверены в том, какой из аэропортов является ближайшим к тому или иному
офису. Как же я мог им помочь?
Поскольку я всегда мыслю категориями баз данных, моей первой мыслью было
создание простой БД:
- Таблица, содержащая информацию о местонахождении стройплощадок - Sites.
- Таблица, содержащая информацию о местонахождении аэропортов - Airports.
- Таблица, ассоциирующая каждую стройплощадку с одним или несколькими аэропортами — SitesAirports.
Такой подход имеет несколько проблем. Во-первых, человек, который будет вводить данные, должен знать, какой из аэропортов самый близкий к данной площадке и при добавлении нового офиса этот вопрос будет подыматься снова и снова. Если же аэропорт будет закрыт или открыт новый, то опять же возникнет похожая проблема. Ну и потом может возникнуть такой вопрос - что мы понимаем под ‘самый близкий’?
Геометрия проще вычислений
Одним из приятных моментов работы в компании HDR является то, что меня окружают
люди, которым нравится использовать технологии для решения существующих
проблем. В HDR работает несколько профессионалов в области геоинформационных
систем (ГИС). Основная ценность ГИС в том, что эта система позволяет вам
соотнести объекты физического мира с информационно-управляемыми моделями и это
именно то, что я собирался сделать. В информационно-управляемой системе мне
нужно было соотнести сущности – площадки и аэропорты. Почему бы не
позаимствовать фундаментальные концепции ГИС – широту и долготу?
dlon = lon2 - lon1
dlat = lat2 - lat1 a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2 c = 2 * atan2(sqrt(a), sqrt(1-a)) d = 3956 * c |
Значение 3,956 – меридианный радиус Земли, от полюса к полюсу в
милях.
Поскольку мы можем вычислить расстояние между данной площадкой и аэропортом, то
теперь нам будет просто соотнести их как более близкие или более отдалённые
объекты.
И хотя наша формула выглядит достаточно простой, всё же она более сложна, чем,
скажем, вычисление налога с продаж. Поэтому именно здесь будет интересно
использовать функции CLR в Yukon.
Поскольку нам необходимо использование этих вычислений в запросах, один из
наших DBA разработал такую пользовательскую функцию:
CREATE FUNCTION dbo.udfComputeDistance
( @lat1 float, @lon1 float, @lat2 float, @lon2 float ) RETURNS float AS begin -- dLong представляет разницу в долготе -- а dLat в широте declare @dLong float declare @dLat float -- для лучшей читаемости -- мы упростили вычисления, разбив их на части -- эта переменная временно хранит значение первого вычисления declare @temp float -- перевод десятичных градусов в радианы set @lat2 = radians(@lat2) set @lon1 = radians(@lon1) set @lat1 = radians(@lat1) set @lon2 = radians(@lon2) -- вычисление разностей set @dLong = @lon2 - @lon1 set @dLat = @lat1 - @lat2 -- вычисление первой части уравнения set @temp = (square(sin(@dLat/2.0))) + cos(@lat2) * cos(@lat1) * (square(sin(@dLong/2.0))) -- возвращаем приблизительное расстояние в милях -- заметьте, что 3956 приблизительный меридианный радиус Земли return (2.0 * atn2(sqrt(@temp), sqrt(1.0-@temp)))*3956.0 end |
Мы используем эту функцию для нахождения всех аэропортов в радиусе 100 миль от каждой площадки с помощью простого запроса:
select s.name
,s.city ,s.state ,a.name ,a.iatacode, dbo.udfComputeDistance(s.latitude,s.longitude ,a.latitude,a.longitude) as distance from sites s, airports a where dbo.udfComputeDistance(s.latitude,s.longitude ,a.latitude,a.longitude) <= 100.0 order by 1,4 |
Query Analyzer доложил, что на выполнение этого запроса ушло около 7 секунд и упорядочивание результата заняло меньше 1% времени выполнения запроса. Поскольку эта информация используется не часто, мы поместили этот запрос в хранимую процедуру (ХП). И хотя это простое и работающее решение, эти семь секунд меня немного обеспокоили. Ведь всё-таки мы используем не первое поколение Пентиумов для работы наших SQL-серверов!
Прозрение
Не является сюрпризом тот факт, что вычисления с помощью T-SQL на
SQL Server Yukon не выдержали проверки временем. Движок запросов не был создан
для того, чтобы выдавать процессору набор инструкций, оптимизированных для
такого типа вычислений. Однако CLR разработан именно с такой оптимизацией.
Размещение CLR в SQL Server Yukon – лучший подход, поскольку мы можем выдать
процессору набор оптимизированных инструкций для числовых вычислений и, что не
менее важно, нам не нужно повторно изобретать велосипед, который уже встроен в
.NET Framework.
Используем CLR
Итак, если и есть какая-то хитрость в программировании, которую я постиг за 20 лет работы в этой области, то она звучит так – начинай с того, что знаешь. В этом случае я решил сразу избавиться от возможных багов в создаваемой функции, путём отладки её в Visual Studio .NET (VS .NET) "Whidbey" IDE. Это гораздо проще, чем отлавливать их после переноса функции на сервер. Сначала я создал консольный проект на языке C# и начал кодирование в Class1.cs:
using System;
using System.Data; using System.Data.SqlTypes; namespace test { class Class1 { private const double PI_OVER_180 = 0.0174532925; private static double radians(double DecimalDegrees) { return DecimalDegrees * PI_OVER_180; } public static SqlDouble ComputeDistance(SqlDouble FromLat, SqlDouble FromLong, SqlDouble ToLat, SqlDouble ToLong) { double lat1, lat2, lon1, lon2, dLong = 0.0, dLat = 0.0, subCalc = 0.0; lat1 = radians((double)(FromLat)); lon1 = radians((double)(FromLong)); lat2 = radians((double)(ToLat)); lon2 = radians((double)(ToLong)); dLong = (double)(lon2 - lon1); dLat = (double)(lat2 - lat1); subCalc = (Math.Pow(Math.Sin(dLat / 2.0), 2.0)) + Math.Cos(lat2) * Math.Cos(lat1) * (Math.Pow(Math.Sin(dLong / 2.0), 2)); return ((2.0 * Math.Atan2(Math.Sqrt(subCalc), Math.Sqrt(1.0 - subCalc))) * 3956.0); } [STAThread] public static void Main(string[] args) { Console.WriteLine( ComputeDistance(40.7539,-96.6428, 41.28692,-96.07023)); Console.ReadLine(); } } } |
Из своих предыдущих исследований с использованием MapPoint, я
узнал, что ресторан, в котором готовят моего любимого Цыплёнка в Ореховом
Масле, находится примерно в 50 милях от места, где я живу. Указав свои
координаты широты и долготы в своей тестовой программе, я определил, что я
нахожусь меньше чем в 48 милях от ресторана. Как по мне, довольно близко, чтобы
получить желаемое!
- ClrCppModule.dll
- Sqlaccess.dll
- Microsoft.VisualStudio.DataTools.SqlAttributes.dll
После указания имени проекта и его расположения, вам предложат
указать соединение с БД. Можно выбрать соединение уже известное Server
Explorer’у или создать новое.
using System;
using System.Data.Sql; using System.Data.SqlTypes; using Math = System.Math; public class CDistanceLibrary { private const double PI_OVER_180 = 0.0174532925; private static double radians(double DecimalDegrees) { return DecimalDegrees * PI_OVER_180; } public static SqlDouble ComputeDistance(SqlDouble FromLat, SqlDouble FromLong, SqlDouble ToLat, SqlDouble ToLong) { double lat1, lat2, lon1, lon2, dLong = 0.0, dLat = 0.0, subCalc = 0.0; lat1 = radians((double)(FromLat)); lon1 = radians((double)(FromLong)); lat2 = radians((double)(ToLat)); lon2 = radians((double)(ToLong)); dLong = (double)(lon2 - lon1); dLat = (double)(lat2 - lat1); subCalc = (Math.Pow(Math.Sin(dLat / 2.0), 2.0)) + Math.Cos(lat2) * Math.Cos(lat1) * (Math.Pow(Math.Sin(dLong / 2.0), 2)); return ((2.0 * Math.Atan2(Math.Sqrt(subCalc), Math.Sqrt(1.0 - subCalc))) * 3956.0); } } |
Этот код выглядит знакомым для вас, не так ли? Я уже тестировал его
в консольном приложении и уверен, что он будет работать. Единственные заметные
различия – отсутствие функции main() и другое имя класса - CDistanceLibrary.
Просто компилируем её, инсталлируем и всё?
Проект SQL Server Workbench
Процесс регистрации сборки в SQL Server Yukon на самом деле прост. Запустим SQL Server Workbench и создадим новый запрос. Выглядит он так:
USE [Your Database Name Goes Here]
DROP FUNCTION clrComputeDistance GO DROP ASSEMBLY asmDistanceLibrary GO CREATE ASSEMBLY asmDistanceLibrary FROM '[The path to your DLL]\asmDistanceLibrary.dll' WITH PERMISSION_SET = SAFE GO |
Заметьте, что вам нужно будет изменить этот запрос в соответствии с
той БД, для которой вы будете регистрировать сборку. Также не забудьте изменить
путь, по которому в действительности находится ваша библиотека.
CREATE FUNCTION dbo.clrComputeDistance
( @lat1 as float, @lon1 as float, @lat2 as float, @lon2 as float ) RETURNS float AS EXTERNAL NAME asmDistanceLibrary:CDistanceLibrary::ComputeDistance GO |
Если вы не работали с расширенными ХП, единственной новой вещью для
вас будет строка AS EXTERNAL NAME. Всё, что делает этот код - просит SQL Server
Yukon зарегистрировать точку входа для метода ComputeDistance сборки
asmDistanceLibrary класса CDistanceLibrary.
SELECT dbo.clrComputeDistance(40.7539,-96.6428, 41.28692,-96.07023) |
И наконец, мы можем вернуться к нашей проблеме, определив ближайшие аэропорты к нашим площадкам. Вот такой простой запрос:
SELECT site.name,site.city,site.state
,airport.name,airport.iataCode ,ROUND(DBO.UDFCOMPUTEDISTANCE(site.LATITUDE,site.LONGITUDE,airport.LATITUDE,airport.LONGITUDE),2) AS distance FROM sites site,airports airport WHERE DBO.CLRCOMPUTEDISTANCE(site.LATITUDE,site.LONGITUDE,airport.LATITUDE,airport.LONGITUDE) <= 100 ORDER BY site.name,distance |
Выводы
Мы рассмортели почему и как мы можем использовать SQL Server Yukon
совместно со сборками .NET, созданными в VS .NET Whidbey. Как по мне, есть
четыре области применения данной технологии. Первая – наличие сложной
математики, задействованной в вычислениях, на подобие тех, что были
продемонстрированы выше. Выгодой стало существенное увеличение
производительности. Ещё одной полезной областью применения будет та, для
которой T-SQL не предназначен, например разбор строк, разделённых запятыми, в
список значений. Третий момент – если вы хотите сделать нечто, для чего T-SQL
сам по себе вообще не годится. Предположим, например, что вы разработали ХП,
возвращающую результат запроса в виде фрагмента XML документа, но вы хотели бы
получить результат, уже переведенный в HTML, после наложения таблицы стилей XSL
к этому фрагменту XML. Это практически не возможно сделать с T-SQL, но довольно
просто выполнить с помощью .NET CLR. И последняя область применения – уйти от
создания и поддержки расширенных ХП на C++. Не потому, что C++ плох, а потому,
что создание сборок намного проще.
Время кода
Автозаполнение комбобокса
ЯЗЫК: C#
АВТОР: Mike Chroman, http://www.csharphelp.com/
ПЕРЕВОД: Чужа В.Ф ака hDrummer
Следующий код демонстрирует, каким образом можно организовать
автозаполнение комбобокса на языке C#.
Использование: в событии на отпускание кнопки элемента
управления поместим следующий код:
private void ComboBox1_KeyUp(Object
sender,System.Windows.Forms.KeyEventArgs e) { AutoCompleteCombo(ComboBox1,e); } |
Сам метод AutoCompleteCombo выглядит так:
public static void
AutoCompleteCombo(ComboBox cbo,KeyEventArgs e) { String sTypedText; Int32 iFoundIndex; Object oFoundItem; String sFoundText ; String sAppendText ; // Для некоторых кнопок отключим автозаполнение switch (e.KeyCode) { case Keys.Back: break; case Keys.Left: break; case Keys.Right: break; case Keys.Tab: break; case Keys.Up: break; case Keys.Delete: break; case Keys.Down: break; } //Получаем набранный текст и ищем его в списке sTypedText = cbo.Text; iFoundIndex = cbo.FindString(sTypedText); //Если находим, применяем автозаполнение if (iFoundIndex > = 0) { // Получаем Item из списка (Возвращаемый тип зависит от того, был ли это источник данных DataSource // или созданный список List) oFoundItem = cbo.Items[iFoundIndex]; //Используем ListControl.GetItemText для получения свойства Name в случае, если комбобокс //был привязан к данным sFoundText = cbo.GetItemText(oFoundItem); // Теперь присоединяем найденный текст к набранному sAppendText = sFoundText.Substring(sTypedText.Length); cbo.Text = sTypedText.ToString() + sAppendText.ToString(); // Отмечаем присоединённый текст как выбранный cbo.SelectionStart = sTypedText.Length; cbo.SelectionLength = sAppendText.Length; } } |
От себя добавлю, что в этот код можно ввести небольшие изменения – по существу, код размещённый в операторе switch, не выполняет задуманной функциональной нагрузки. Для того, чтобы автозаполнение не работало при нажатии BackSpace и других перечисленных кнопок, его можно изменить таким образом:
public static void
AutoCompleteCombo(ComboBox cbo,KeyEventArgs e) { String sTypedText; Int32 iFoundIndex; Object oFoundItem; String sFoundText ; String sAppendText ; // Добавим флаг автозаполнения bool CancelAutoComplete = false; // Для некоторых кнопок отключим автозаполнение switch (e.KeyCode) { case Keys.Back: CancelAutoComplete = true; break; case Keys.Left: CancelAutoComplete = true; break; case Keys.Right: CancelAutoComplete = true; break; case Keys.Tab: CancelAutoComplete = true; break; case Keys.Up: CancelAutoComplete = true; break; case Keys.Delete: CancelAutoComplete = true; break; case Keys.Down: CancelAutoComplete = true; break; } //И используем этот флаг для задействования или незадействования //автозаполнения if (CancelAutoComplete!=true) { //Получаем набранный текст и ищем его в списке sTypedText = cbo.Text; iFoundIndex = cbo.FindString(sTypedText); // и так далее… } } |
Тут вариантов может быть много, это всего лишь один из возможных.
Форумы .Net - вопросы оставшиеся без ответа
Альтернатива Enum.IsDefined
ExpandableObjectConverter - как сделать проще всего?
WebBrowser.Navigate... и proxy
Внутренний метод скрыт системным.
пример р2р-программы
Имя юзера?
массив
Настройка прав доступа к шарам из ASP
web.config
Пронумерованные букмарки
Обьекты в типизированном DataSet
Общие вопросы коннекта...
Работа с миллисекундами
Xml Serialization. Проблемы
two byte UTF-16 Unicode
На этом восьмой выпуск .Net Собеседника закончен.
До следующего номера.
Чужа Виталий Ф. aka hDrummer,
hdrummer@sql.ru - жду ваши предложения, вопросы и замечания.
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||