среда, 4 июня 2008 г.

О горячих сочетаниях клавиш редактора Visual Studio

1. Для того, чтобы выделить текст в редакторе VS колонкой, удерживайте клавишу Alt.
2. Редактор Visual Studio предоставляет возможность сохранять в буфере обмена по несколько фрагментов. Для того, чтобы выбрать, какой фрагмент из буфера вставлять нажмите Ctrl + Shift+V.
3. Нажатие сочетания Ctrl+K+C позволяет закомментировать выделенный участок текста, а Ctrl+K+U – снять комментарии.
4. Для показа подсказчика кода (IntelliSense) нажмите Ctrl+J.
5. Для быстрого перехода от открытой скобки (знака /*, начала региона #region) к ее паре нажмите Ctrl + ].

Как получить абсолютный путь к web странице

В ASP.NET получить абсолютный путь к странице достаточно легко. Для этого можно использовать метод VirtualPathUtility.ToAbsolute.
string absolutePath = VirtualPathUtility.ToAbsolute("~/test/MyWebForm.aspx");
Uri newUri = new Uri(Request.Url, absolutePath);

Об операторе ?? (C#)

Оператор ?? возвращает значение выражения, стоящего слева от него, если оно не является null, иначе возвращает значение выражения, стоящего справа.
Например:
//err = param, если param не null
string err = param ?? "No errors";

вторник, 3 июня 2008 г.

Оптимизация SQL запроса update

Предположим, в программе стоит задача обновить запись в базе данных, если такая запись имеется и вставить запись, если такой записи еще нет. Конечно, можно сначала выполнить SQL запрос на проверку существования записи, потом выполнить запросы Insert или Update в зависимости от его результата. Но все эти операции можно совместить в одном SQL запросе следующим образом:
IF EXISTS(SELECT * FROM имя_таблицы WHERE Id = @id)
BEGIN
UPDATE имя_таблицы SET имя_поля1 = @newValue1, имя_поля2 = @newValue2, … WHERE Id = @id
END
ELSE
BEGIN
INSERT INTO Table1 (Id, имя_поля1, имя_поля2,…) VALUES (@id, @newValue1, @newValue2, …)
END

Как проиграть в программе стандартные Windows звуки

Иногда, хочется оформить приложение звуками. Если Вы используете .NET 2.0 и выше, то можете воспользоваться для этого пространством имен System.Media и его классом SystemSounds.
Чтобы воспроизвести, например, классический звук «сообщение», вы можете использовать следующий код:
System.Media.SystemSounds.Beep.Play();

Для воспроизведения звука «вопрос»:
System.Media.SystemSounds.Question.Play();

Процедура вычисления MD5 кода строки

Для хранения паролей в базе данных зачастую используют MD5 шифрование. Вот процедура, позволяющая получить MD5 код строки.
public string CalculateMD5Hash(string input)
{
// step 1, calculate MD5 hash from input
MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
byte[] hash = md5.ComputeHash(inputBytes);
// step 2, convert byte array to hex string
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
sb.Append(hash[i].ToString("X2")); //для получения хеша в верхнем регистре
// sb.Append(hash[i].ToString("x2")); //для получения хеша в нижнем регистре

}
return sb.ToString();
}

Пример вызова:
string hash = CalculateMD5Hash("abcdefghijklmnopqrstuvwxyz");

…выходная строка будет выглядеть так:
C3FCD3D76192E4007DFB496CCA67E13B

Выводить отладочные сообщения просто!

Visual Studio предоставляет разработчику множество средств отладки, позволяет оттрассировать код строка за строкой. Однако в некоторых случаях, когда вам требуется, к примеру, узнать значение некоторой переменной в определенной области кода, более рациональным решением будет использование отладочных сообщений.
Эти сообщения можно выводить при помощи методов Write* класса System.Diagnostics.Debug. Красота класса Debug состоит в том, что когда вы станете компилировать ваш проект с конфигурацией Release, строки кода с классом Debug не будут компилироваться. Это означает, что вам не придется вычищать код программы от отладочных сообщений перед финальной компоновкой.
Для использования класса Debug необходимо добавить в раздел объявлений:
using System.Diagnostics;

После этого вы можете использовать метод Debug .Write например так:
Debug.Write("Hello, Debugger!");

Помимо метода Write существуют методы WriteIf, WriteLine и WriteLineIf, например:
Debug.WriteLineIf(логическое выражение, "A conditional Hello!");

понедельник, 2 июня 2008 г.

Шифрование паролей

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

То как вы храните пароли в базе данных очень важно. Если вы храните их в обычном текстовом виде, то злоумышленник, получив доступ к базе, сможет сделать все, что захочет, получив пароли администраторов системы. Именно поэтому пароли следует хешировать.

В пространстве имен System.Security.Cryptography namespace есть класс HashAlgorithm, являющийся базовым классом для всех классов алгоритмов хеширования, таких как SHA1, MD5 и др.

Метод этого класса ComputeHash принимает на вход массив типа byte с текстом, который необходимо хешировать и возвращает массив типа byte хешированного текста.

HashAlgorithm hashAl = HashAlgorithm.Create("MD5");
byte[] myPasswordInBytes = Encoding.Unicode.GetBytes(txtPassword.Text);
byte[] myHashedPassword = hashAl.ComputeHash(myPasswordInBytes);

Теперь вы можете хранить в базе хешированный пароль. А когда пользователь будет входить в свой аккаунт, введенный им пароль необходимо хешировать тем же алгоритмом и сравнить полученный хеш с хешем, хранящемся в базе данных, например так:
private bool CompareHashPasswords(byte[] hashedNewPass, byte[] hashedPass)
{
if (hashedNewPass == null || hashedPass == null || hashedNewPass.Length != hashedPass.Length)
return false;
for (int i = 0; i <>
{
if (hashedPass[i] != hashedNewPass[i])
return false;
}
return true;
}




Добавление контрола в меню или на панель инструментов

При помощи класса ToolStripControlHost вы можете добавить контрол в меню, контекстное меню или на панель инструментов.
Для этого нужно передать ссылку на контрол в конструктор класс ToolStripControlHost, а затем добавить экземпляр класса ToolStripControlHost в меню как MenuItem.
Пример:
private void Form1_Load(object sender, EventArgs e)
{
MonthCalendar picker = new MonthCalendar();
picker.DateSelected += new DateRangeEventHandler(picker_DateSelected);
ToolStripControlHost host = new ToolStripControlHost(picker);
fileToolStripMenuItem.DropDownItems.Insert(2,host);
}

void picker_DateSelected(object sender, DateRangeEventArgs e)
{
MonthCalendar picker = ((MonthCalendar)sender);
this.Text = picker.SelectionStart.ToString("yyyy/MMM/dd");
}



Как заполнить ComboBox значениями из базы данных

private SqlConnection cn = new SqlConnection(Properties.Settings.Default.oborudConnectionString);
private DataSet myDS = new DataSet();

dAdapt = new SqlDataAdapter("select * from имя_таблицы", cn);
dAdapt.Fill(myDS, "имя_таблицы");
comboBox1.Items.Clear();
int i = 0;
for (i = 0; i < myDS.Tables["имя_таблицы "].Rows.Count; i++)
{
comboBox1.Items.Add(myDS.Tables["имя_таблицы"].Rows[i][1].ToString());
}

Как раскрасить строки dataGridView в разные цвета

Для того, чтобы раскрасить строки dataGridView в разные цвета в зависимости от значения какого-либо поля можно использовать следующий код:
private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (e.RowIndex > -1 && e.RowIndex < dataGridView1.RowCount - 1)
{
if (dataGridView1.Rows[e.RowIndex].Cells[10].Value.ToString() == "1")
((DataGridView)sender).Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightBlue;

if (dataGridView1.Rows[e.RowIndex].Cells[10].Value.ToString() == "2")
((DataGridView)sender).Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightCyan;
}
}


воскресенье, 1 июня 2008 г.

Процедура выполнения SQL запроса на C#

При программировании на языке C# в среде Visual Studio бывает достаточно утомительно каждый раз писать по 5 строк, для того, чтобы выполнить обычный SQL запрос  insert, delete или update. Поэтому можно написать для этотй цели такую процедуру:
public int no_result_query(string query, SqlConnection connection)
//Процедура выполнения SQL запроса, не возвращающего результата
//такого, как insert, delete, update
//возвращает кол-во затронутых рядов, -1 в случае неудачи
{
SqlCommand myCommand = new SqlCommand(query, connection);
myCommand.Connection.Open();
int q_result = myCommand.ExecuteNonQuery();
myCommand.Connection.Close();
myCommand.Dispose();
return q_result;
}

Как сделать blogspot блог dofollow блогом

Во первых, что такое dofollow? По умолчанию, ссылки на сайт комментатора в blogspot блогах, как и во многих других закрыты атрибутом nofollow, который не позволяет передавать PR блога страницам, на которые он ссылается.

Этот атрибут можно убрать, и тогда PR блога будет передаваться через ссылки на страницы комментаторов, что в принципе может привлечь комментаторов на блог. О том как это сделать на blogspot блоге я и расскажу в этой статье.

Зайдите в админку блога, выберете Макет-> Изменить HTML

Нажмите на ссылку «Загрузить весь шаблон» и сохраните файл шаблона у себя на компьютере.
Откройте файл шаблона в любом редакторе и найдите строку
a expr:href='data:comment.authorUrl' rel='nofollow'

сотрите rel='nofollow', сохраните шаблон.
С помощью кнопки «Обзор» в админке выберете путь к измененному шаблону, нажмите кнопку «Загрузить», нажмите кнопку «Сохранить шаблон».
Все. Ваш блог теперь dofollow. Можно обрадовать этим фактом комментаторов.

Использование файла конфигурации проекта

При подключении к базе данных MsSQL из среды Visual Studio зачастую приходится использовать следующую конструкцию:
private SqlConnection cn = new SqlConnection('Data Source=...;Initial Catalog=...;Persist Security Info=True;User ID=...;Password=...');

во многих местах проекта. Для того, чтобы при изменении строки подключения изменять ее только в одном месте, а не во всех модулях, целесообразно использовать файл конфигурации проекта app.config, в котором можно описать переменную строки подключения в следующем формате xml:

add name="Название проекта.Properties.Settings.oborudConnectionString"
connectionString="Data Source=...;Initial Catalog=...;Persist Security Info=True;User ID=...;Password=..."
providerName="System.Data.SqlClient"



Тогда в любом модуле программы для получения строки подключения можно использовать такую конструкцию:
Properties.Settings.Default.MyConnectionString

Например:
private SqlConnection cn = new SqlConnection(Properties.Settings.Default.MyConnectionString);

И при изменении строки подключения ее нужно будет поменять только в файле app.config.
Этот файл так же можно редактировать не вручную, а щелкнув в Solution Explorer по значку проекта правой кнопкой мыши, выбрать в контекстном меню пункт Properties, далее вкладку Settings, на которой уже в удобной форме можно добавлять и редактировать переменные файла app.config.