Вырезаем числовую часть из начала строки в transact-sql

Имеем сроку, начинающуюся с целого числа, вида 112-ОМГ, желаем вырезать из нее числовую часть. На stackoverflow приводится следующий код

declare @str varchar(50) 
set @str = '112-ОМГ '
select  left(@str, patindex('%[^0-9]%', @str + '.') - 1)
select patindex('%[^0-9]%', @str) -- для иллюстрации работы patindex

Небольшое пояснение к механике его работы. Функция left вырезает левую часть строки с заданным количеством симоволов.

Функция pathindex находит начальную позицию для заданного шаблона, нумерация начинается с 1.

Читать далее

Пул соединений с базой данных в ADO.NET / OleDb - как избежать проблем с утечкой соединений в ASP.NET (перевод)

Открытие соединения с базой данных требует значительного количества времени и ресурсов. Пул соединений повышает производительность веб-приложений, повторно используя активные соединения с базой данных вместо создания нового соединения для каждого запроса. Менеджер пула соединений управляет открытыми соединениями. Когда приходит запрос на новое соединение, менеджер ищет неиспользуемые соединения в пуле и возвращает одно из них, если таковое имеется в наличии. Если все соединения в пуле заняты и максимальный размер пула не достигнут, создается новое соединение и добавляет в пул. После достижения максимального размера пула все новые запросы ставятся в очередь и ожидают освобождения одного из соединений в пуле или истечения времени ожидания.

Работа пула соединения регулируется параметрами в строке соединения. Следующие четыре параметра контролируют большую часть поведения пула соединений:

- Connect Timeout - время ожидания в секундах при запросе нового соединения, в случае превышения будет выброшено исключения.

- Max Pool Size - определяет максимальный размер пула соединений. По умолчанию 100. Большинство веб-сайтов используют не более 40 одновременных соединений под самой тяжелой нагрузкой, но это зависит от того, сколько времени занимает выполененние ваших запросов к базе

- Min Pool Size - начальное количестов соединений, который будут добавлены в пул после его создания. По умолчанию ноль, но вы можете заменить его небольшим числом, если вашему приложению требуется постоянно время ответа даже после многочасового простоя. В таком случае пользователю не придется ждать открытия этих соединений.

- Pooling - включает и выключает использование пула. Как вы наверно догадываетесь по умолчанию true. Ниже я опишу те ситуации, в которых вы можете использовать Pooling=false.

Читать далее

ASP .Net MVC, JQuery и AJAX - отсылаем данные на сервер

Задача: отослать данные на сервер, в действие (action) контроллера ASP MVC через AJAX-запрос на JavaScript. Идея тестого примера примитивна до предела - отсылаем что-то аяксом на сервер, с сервера отправляем обратно на форму и выводим в диалоговое окно.

На тестовом представлении должно быть следующее (заменить br стилями по своему вкусу):

<button id="ajaxTestButton1" type="button">Простая загрузка данных</button>
<br><br>
<input type="text" id="ajaxTesStr1" value="test2222" /> 
<button id="ajaxTestButton2" type="button">Отсылка одной строки</button>
<br><br>
<input type="text" id="ajaxTesStr3-1" value="test3-1" />
<input type="text" id="ajaxTesStr3-2" value="test3-2" />
<input type="text" id="ajaxTesStr3-3" value="test3-2" />
<input type="text" id="ajaxTesStr3-4" value="test3-2" />
<button id="ajaxTestButton3" type="button">Отсылка набора данных</button>

В контроллере следующие тестовые методы (подразумевается умолчальный контроллер Home)
Читать далее

Разделитель тысяч и дробной части для decimal

Вид разделителей определяется классом System.Globalization.NumberFormatInfo и обычно зависит от страны, в терминах .Net определяемой культурой System.Globalization.CultureInfo. Чтобы получить нужные разделители нужно взять формат числа от соответствующей культуры. Если культура не устраивает - переписать соотвествующие параметры

			var numberFormatInfo = new System.Globalization.CultureInfo("ru-Ru", false).NumberFormat;
			string testDecimalStr = 2401000.22M.ToString("N", numberFormatInfo); // "2 401 000,22"

			numberFormatInfo = new System.Globalization.CultureInfo("en-Us", false).NumberFormat;
			testDecimalStr = 2401000.22M.ToString("N", numberFormatInfo); // "2,401,000.22"

			numberFormatInfo = new System.Globalization.CultureInfo("en-Us", false).NumberFormat;
			numberFormatInfo.NumberGroupSeparator = " ";
			testDecimalStr = 2401000.22M.ToString("N", numberFormatInfo);  // "2 401 000.22"

			numberFormatInfo = new System.Globalization.CultureInfo("en-Us", false).NumberFormat;
			numberFormatInfo.NumberGroupSeparator = " ";
			numberFormatInfo.NumberDecimalSeparator = ",";
			testDecimalStr = 2401000.22M.ToString("N", numberFormatInfo);  // "2 401 000,22"

Создаем расширенный Control в WinForms наследуясь от существующего

Задача: немного изменить внешний вид и/или поведение существующего элемента управления Windows Forms. В теории все крайне просто для знакомых с основами объектно-ориентированного программирования людей - мы просто создаем класс-наследник для уже существующего элемента и добавляем новые свойства и метода или переопределяем существующие (для тонких изменений внешнего вида можно изменить работу функции отрисовки на экране). Например нам надо вводить числа, но клиенты очень не любят виде 0 для тех полей, где нет данных. Если возраст человека не указан, это еще не значит что возраст человека 0 лет. Таким образом числа надо вводить как текст (с NumericUpDown есть еще несколько мелких неудобств) автоматически проверяя на отсутствие бреда в пользовательском вводе и заменяя сохраненные в базе нули на пустые строки. Сделать это можно просто добавив пару функций к стандартному текстбоксу.

Поводом для создания это заметки стала небольшая порция шаманства, связанная с особенностями работы Visual Studio и Windows Forms - наследоваться надо не просто так, а выполнив ряд простых но несколько нелогичных шагов, согласно вот этому руководству.

Проще говоря:

1. К проекту добавляем новый элемента из пункта Add User Control
2. В появившемся далоговом окне выбрать Custom Control
3. В добавленном компоненте найти то место где описано наследование в духе

 public partial class CustomControl1 : Control 

и заменить базовый класс на нужный нам, например

 public partial class TextBoxPlus : TextBox 

Читать далее

Вставка строк и изменение границ ячеек в Excel Interop из C#

Задача: вставить строки в таблицу Excel и проставить границы ячеек. Вставка строки может потребовать если ниже динамически заполняемой таблицы находятся еще какие-то данные, например подвал документа с подписями и/или статистикой.

при наличии

using Excel = Microsoft.Office.Interop.Excel;
// разный код
private Excel.Worksheet _workSheet;

вставка строки будет выглядеть так

        public void InsertRow(int rowNum)
        {
            Excel.Range cellRange = (Excel.Range) _workSheet.Cells[rowNum, 1];
            Excel.Range rowRange = cellRange.EntireRow;
            rowRange.Insert(Excel.XlInsertShiftDirection.xlShiftDown, false); 
        }

При этом надо учитывать то, что во вставляемую строку будет копироваться стиль текста предыдущей строки, но не будет копироваться стиль границ.Избавится от копирования стиля текста из шапки таблицы можно тупо начав встовлять строки со второй, но вот границы придется проставлять вручную.
Читать далее

Как прочитать данные из удаленного DataRow в DataTable

В DataTable удаленная строка сначала просто помечается как DataRowState.Deleted или DataRowState.Detached. Это удобно при работа с базой данных, но прочитать из нее какие-то данные просто так не получится, вылетит ошибка "Невозможно получить доступ к удаленной информации строки через данную строку." или Deleted row information cannot be accessed through the row. Достучаться до таких данных можно с помощью несколько неочевидного синтаксиса

someDataRow["SOME_COLUMN", DataRowVersion.Original]

Проблемы с кодировкой при копировании русского текста из MS SQL Studio в Outlook/Word/Office

Забавный глюк внутри семейства Microsoft - при попытке скопировать текст из редактора запросов MS SQL Studio в их же программу вроде Outlook портится кодировка русского текста. ЧСХ, при копировании в любую другую программу вроде бесплатного и открытого Notepad++ все нормально. Если мы не понимаем толстых намеков, то решить проблему можно пересохранив SQL файлы в студии через пункт "Сохранить как/Save as" и после нажатия на стрелку рядом с кнопкой "Сохранить/Save" выбрав пункт "Сохранить с кодировкой / Save with encoding" и выбрав там нормальный Unicode (UTF-8) вместо богомерзкого Win-1251.

Копирование в буфер кода Transact SQL

Как проверить, существует ли таблица в MS SQL Server перед удалением/созданием

create table TEST_TABLE
(
TEST_COLUMN int
)
drop table TEST_TABLE

IF OBJECT_ID('TEST_TABLE','U') is not null begin  drop table TEST_TABLE end

How to drop table if exists in SQL Server 2005?
SQL Server: Check if table exists
EXISTS (Transact-SQL)
OBJECT_ID (Transact-SQL)