Как получить имя пользователя, компьютера и ip-адрес в C#

Используем классы System.Environment и System.Net.Dns

string userNameWin, compName, compIP, myHost;

// имя хоста
myHost = System.Net.Dns.GetHostName();
// IP по имени хоста, выдает список, можно обойти в цикле весь, здесь берется первый адрес
compIP = System.Net.Dns.GetHostEntry(myHost).AddressList[0].ToString();

userNameWin = System.Environment.UserName;
compName = System.Environment.MachineName;

Transact-SQL - сумма строк в нескольких таблицах, список таблиц в базе, проверка существования таблицы

Определяем суммарное количество строк в нескольких таблицах

select sum(KVO_STROK) as KVO_STROK_TOTAL
from 
(SELECT count(*) as KVO_STROK FROM SOME_TABLE
UNION ALL 
SELECT count(*) as KVO_STROK FROM SOME_TABLE_2
UNION ALL 
SELECT count(*) as KVO_STROK FROM SOME_TABLE_3
) as KVO_STROK_TABLE

Читать далее

Основные принципы работы сайтов. Разработка сайтов на WordPress для начинающих. Часть 1.

Немало времени я занимаюсь сайтами на WordPress (вы находитесь на одном из них) и хочу поделиться накопленным опытом. Я любитель и на данный момент сайтостроение не является моим основным заработком. Но я очень хорошо понимаю вопросы, встающие перед новичками и программистами, занимающимися другими технологиями. В наше время сайты нужны почти всем - хотя бы дневники и фотогаллереи, но их создание остается малопонятной и туманной областью. Хотя знание общих принципов сайтостроения пригодится даже при заказа сайта у профессионалов. Позже я затрону достаточно сложные вопросы вроде написания собственных расширений, работы с XML или Active Directory - но начну с самых простых вещей и подробно опишу основы.

Зачем вообще нужен сайт? Подобный вопрос в основном встает перед желающими завести личные странички - ведь есть масса бесплатных служб с дневниками и фотогалереями.

Преимущества самостоятельного дневника:
Читать далее

Ошибка при работе с файлом конфигурации C# The name 'ConfigurationManager' does not exist in the current context

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

using System.Configuration;
// какой-то код
string connString = ConfigurationManager.AppSettings["dbConnString"]; 

На самом деле все очень просто, надо не просто прописать using, но и добавить ссылку на библиотеку System.configuration в раздел References

Чтение и запись двоичных файлов в базу данных MS SQL 2005 из C# используя OleDb

Задача - хранить в базе данных MS SQL двоичные файлы. Это могут быть исполняемые файлы (для обновления приложения при запуске), документы Word или иные важные и нужные данные. Как и многие подобные задачи решается она просто, если знаешь за какие именно методы и свойства библиотечных классов надо дергать.

Двоичный данные в MS SQL 2005 хранятся в колонках типа VARBINARY(MAX). В более новых версиях сервера появились дополнительные средства, но на многих предприятиях до сих пор успешно работает 2005 версия, вполне удовлетворяя их потребности. В программе мы будем хранить их в массиве байтов byte[] - просто потому, что именно его поддерживаются соответствующие классы.

Что нам надо?

1. Прочитать файл с диска
2. Записать его в базу данных либо добавляя новую строку таблицы либо обновляя уже существующую
3. Прочитать с базы данных (под коду конкретного файла)
4. Записать на диск

Приступим!
Читать далее

Несуществующее значение в ComboBox

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

Проблема в следующем - если ввести строку отсутствующую в списке, то в невидимое значение SelectedValue попадает код для существующего элемента, первые символы которого совпадают с введенными.

Решается это очень простым, но неочевидным способом, надо изменить значения свойства DropDownStyle на DropDownList (из перечисления ComboBoxStyle). Теперь возможность ввода своих значений сохранится, но ввести можно будет только входящее в список значение и только если включена автоподсказка AutoCompleteMode вида Suggest или SuggestAppend. Правда при каждом вводе значения будет вызываться событие SelectedValueChanged, которое до этого вызывалась только по нажатии Enter.

Как заставить клавишу Enter работать аналогично Tab - переходить к следующему элементу управления

Заказчик захотел, чтобы после нажатия Enter пользователь переходил на следующий элемент управления, аналогично нажатию Tab. Основная идея проста - перехватываем нажатие клавиши Enter и посылаем форме нажатие Tab, но есть одна тонкость - если мы хотим разом установить подобное поведение для всей формы, а не каких-то конкретных управляторов, необходимо выставить в true свойство KeyPreview.

После чего вешаем код на соответствующее событие нашей формы, я выбрал KeyUp, используя свойство KeyCode параметра KeyEventArgs:

if (e.KeyCode == Keys.Enter)
{
    System.Windows.Forms.SendKeys.Send("{TAB}");
}

Вышеописанная связка может привести к интересному глюку, если мы реализуем ее в диалоговом окне, вызываемом с другой формы и переходим на него нажимая Enter на кнопке вызова диалогового окна (родительская форма может работать по аналогичной схеме). В таком случае диалоговое окно получит KeyUp и последующий Tab при нажатии на кнопку (Enter'ом) на родительской форме (и сразу перейдет на следующий элемент управления). Объяснения столь дивному чуду природы нет, есть лекарство - подписываемся на событие KeyPress, которое происходит только тогда, когда элемент находится в фокусе. Маленькая проблема, у класса KeyPressEventArgs нет свойства KeyCode, есть только KeyChar, так что определять нажатую клавишу придется немного иначе:

if (e.KeyChar == (char)Keys.Return)
{
    System.Windows.Forms.SendKeys.Send("{TAB}");
}

Чем отличается хороший программист от профессионала-программиста?

- Знаешь, чем отличается хороший программист от профессионала-программиста?
— Чем?
— Хороший программист пишет свой код качественно, когда у него хорошее настроение и интересная задача. А профессионал пишет качественный код ВСЕГДА

Как рассчитать возраст по дате рождения в C#

Казалось бы, все просто. Берем текущую дату, вычитаем из нее дату рождения, получаем собственно возраст. Но работа с датами в Net сделана крайне криво, приходится постоянно мастерить разнообразные костыли.

Методы вычитания дат вроде Subtract возвращают не DateTime, а TimeSpan. Максимальная единица времени, которую можно извлечь из TimeSpan автоматом - дни. Никаких месяцев и лет. Можно конечно высчитывать годы из дней (дни/365 и тд) - но работает это не очень хорошо.

Деваться некуда, применим костыль со Stack Owerflow

DateTime nowDate = DateTime.Today;
int age = nowDate.Year - birthDate.Year;
if (birthDate > nowDate.AddYears(-age)) age--;

Смысл костыля очень прост - сейчас 15 февраля. Если вы родились 16 февраля и позднее, простое вычитание лет даст результат на год больше. Его и исправляем в костыле.

Глюк с удалением значения в NumericUpDown

Имеем NumericUpDown, из которого по клике на кнопку берется значение и используется. Если мы просто вводим в него значения и меняем их - все в порядке. Но если мы удаляем значение и оставляем его пустым - компонент начинает вести себя очень странно. На форме остается пустое значение, а в свойстве Value сохраняется предыдущее значение, которое было до удаления.

Если мы просто введем 0, то все в порядке. Но пользователям сложно понять, почему нельзя просто удалить значение. Казалось бы решение трудности очевидно - привяжемся на событие изменения значения, проверим строку в свойстве Text на пустоту и проставим в Value значение 0.
Читать далее