20 нояб. 2013 г.

Profiler для SQL Server Management Studio Express

У Microsoft есть замечательная традиция — делать базовые инструменты для разработчиков бесплатными. Конечно, бесплатные версии продуктов не могут конкурировать с платными в плане функциональности, но тем не менее.

Не обошла эта традиция и SQL Server Management Studio. Урезанная бесплатная версия называется SQL Server Management Studio Express и позволяет творить с SQL-сервером почти все, что душа пожелает. Лично мне в этом пакете программ не хватает только профайлера.

Profiler поставляется с полной платной версией, легальных способов использовать его совместно с SQL Server Management Studio Express нет.

Но не стал бы я писать эту статью, если бы все было так плохо. Дело в том, что профайлер — всего лишь пользовательский интерфейс для функциональности, которая изначально присутствует в SQL Server.

Разумеется, есть сторонние приложения, которые дают доступ к этой функциональности. И многие из них совершенно бесплатны. Кроме того, в сети есть примеры кода, позволяющие за несколько минут набросать в Visual Studio собственный примитивный профайлер.

Тем, кому лень писать или искать (одним словом, настоящим программистам), рекомендую ExpressProfiler — простую, понятную, бесплатную утилитку, копирующую основные функции оригинального профайлера, но работающую пошустрей.

4 мая 2013 г.

Страница, открытая с помощью showModalDialog, открывается в новом окне при обновлении

Что делать, если страница, открытая с помощью showModalDialog, открывается в новом окне при сабмите или обновлении?

Ответ прост: добавьте в секцию <head> страницы <base target="_self" />, например, так:

<head>
    <base target="_self" />
    <title>Hello World</title>
</head>

3 мая 2013 г.

Как всегда возвращать непустую таблицу

Очень часто бывает нужно получить какое-нибудь поле записи из таблицы. Предположим, мы хотим получить имя пользователя по его ID:

SELECT UserName FROM UserDataBase WHERE UserID = 10

Этот простейший запрос вернет нам таблицу с одной записью, которая будет содержать имя указанного пользователя. Но что он вернет, если пользователя с таким ID не существует? Пустую таблицу.

С этим могут возникнуть проблемы, если дальнейшая обработка требует непустой таблицы. Простейший способ заставить SQL всегда возвращать одну запись в таблице — использование встроенных функций, например, MIN() или MAX().

SELECT MAX(UserName) FROM UserDataBase WHERE UserID = 10

Такой запрос вернет то же, что и предыдущий, если найдет пользователя с указанным ID. Если же такого пользователя в базе не окажется, таблица будет содержать единственную запись со значением NULL.

11 янв. 2013 г.

Под какой учетной записью работают программы, запущенные через xp_cmdshell?

Задача: узнать, под каким системным аккаунтом выполняются приложения, запущенные с помощью команды xp_cmdshell в MS SQL Server.

Решение: выполнить запрос xp_cmdshell 'whoami.exe'.

8 янв. 2013 г.

JavaScript: Как открыть окно не больше видимой части экрана

Задача: с помощью JavaScript открыть окно браузера так, чтоб его размеры не выходили за видимую область экрана.

Решение: открыть окно с помощью JS очень просто. Для этого достаточно вызвать функцию window.open() с нужными параметрами. Вроде ничего сложного: если стандартные размеры окна больше, чем размер экрана, уменьшаем их. А само окно центрируем на экране.

Вот только есть здесь несколько подводных камней. Во-первых, параметры функции window.open, отвечающие за размер окна, задают его внутренний размер без учета размеров заголовка, тулбаров, скролбаров и т.п. Во-вторых, есть слабодокументированные параметры outerWidth и outerHeight, но они не работают в IE. В-третьих, при попытке установить размеры только что открытого окна с помощью его свойств outerWidth и outerHeight, можно нарваться на политику безопасности эксплорера.

Решение все-таки есть, и (по браузерным меркам) довольно элегантное. Функция window.resizeTo() в IE позволяет задать внешние габариты окна.

Таким образом, наш код превращается в:

// Задаем максимальные размеры окна
var w = 1000;
var h = 700;


// Если размеры окна больше рабочей области экрана, уменьшаем их соответственно.
if (w > screen.availWidth) w = screen.availWidth;
if (h > screen.availHeight) h = screen.availHeight;


// Высчитываем координаты, чтобы центрировать окно на экране.
var left = (screen.availWidth - w) / 2;
var top = (screen.availHeight - h) / 2;
 

// Параметры окна
WindowFeatures = 'position=absolute top=' + top + 'px left=' + left + 'px scrolling=no menubar=no resizable=yes scrollbars=yes status=no toolbar=no';

// Открываем окно и сразу устанавливаем внешние размеры.

window.open(path, 'MyPopup', WindowFeatures).resizeTo(w, h);