Надеюсь данная публикация не даст читателям повторить мои ошибки и поможет сделать изначально правильный выбор. Первое с чего бы хотелось начать это с настоятельной рекомендации: «Программируя под .NET всегда пользуйтесь MySQL .NET — Коннектором!». Можно конечно и через ADO подключаться к базе но это чревато тем что в будущем вам просто будет необходимо вносить изменения при переходе на Windows Vista и выше.
Маленькое отступление: MySQL очень удобно использовать при программировании для мобильных устройств на базе Windows. Стандартные библиотеки работают и на мобильном устройстве под .NET CF точно так-же как и на сервере или рабочей станции. (Имеются ввиду те случаи, когда необходимо обращение с мобильного компьютера к базе данных на сервере. На самом мобильном устройстве сервер MySQL установить нельзя.) И в дополнение. Крайне не советую использовать на мобильном устройстве SQL.CE для больших баз данных (свыше 50000 записей в таблице) при росте базы быстродействие сильно падает. На мой взгляд гораздо лучше продумать свою систему хранения данных. Но об этом в отдельной публикации.
Для работы с MySQL вам понадобится «MySQL Connector / NET».
Однажды русская и немецкая компании договорились провести совместные соревнования по гребле на восьмиместных байдарках.
Обе команды долго и упорно тренировались и когда обе были на пике формы устроили соревнования, но…
Немцы победили с преимуществом в 1 км.
После поражения русская команда была деморализована.
Топ-менеджмент решил выяснить причину провала.
Была создана рабочая группа для подготовки предложений по изменению и реструктуризации в команде.
После многих недель изысканий было установлено, что в немецкой команде гребли семеро и один рулевой…
а в русской – один на веслах и семеро рулевых!
Топ-менеджментом русской компании была привлечена консалтинговая компания для подготовки и проведения реструктуризации команды.
Получив солидный гонорар и внедрив показатели KPI, ССП и ISO 9001 и проведя маркетинговые исследования, консалтинговая фирма пришла к выводу:
Слишком много сотрудников в русской команде подает команды и слишком мало гребет….
После реструктуризации русская команда выглядела так:
– четыре рулевых…
– два старших рулевых,
– один рулевой директор,
– и один гребец.
Кроме того для гребца была введена персональная система оценки показателей эффективности и расширен круг обязанностей, чтобы повысить его ответственность.
На следующий год немецкая команда опять убедительно победила с отрывом в 2 км.
В результате очередного поражения, топ менеджментом русской компании была нанята консалтинговая компания по аудиту и оценке эффективности команды. Было принято решение расформировать гребную команду…
Гребец, как основной виновник неэффективности команды был уволен, все плановые инвестиции на 2014-2015 годы в новую лодку и весла были отменены.
Рулевым была объявлена благодарность, а сэкономленные деньги были выплачены топ-менеджменту в качестве премии.
Самый простой способ хранить пароли в базе это положить их в таблице пользователей в открытом виде, допустим в поле с типом VARCHAR. Но при таком подходе, в случае попадания базы в руки злдоумышленника, все пароли 100% становятся ему известны.<br/>
Чтобы этого не произошло, пароль лучше хранить в зашифрованном виде, использовав алгоритмы шифрования md5, sha1 и т.п.
Всегда считал что у .NET в System.IO существует какой нибудь метод который реализует копирование папки с содержимым, включая все подкаталоги и файлы. Оказалось что я ошибался, и такого метода нет. Поэтому привожу пример реализации этого действия, довольно простой функцией, при помощи System.IO.DirectoryInfo.
Команды манипулирования данными SELECT, UPDATE, DELETE работают сразу с группами строк. Эти группы, вплоть до отдельных строк, можно выбрать с помощью опции WHERE. А если надо перебрать строки некоторой таблицы последовательно, одну за другой? На этот случай в языке SQL существуют курсоры. Курсор (current set of record) – временный набор строк, которые можно перебирать последовательно, с первой до последней.
При работе с курсорами используются следующие команды.
Объявление курсора:
DECLARE имя_курсора CURSOR FOR SELECT текст_запроса
Любой курсор создается на основе некоторого оператора SELECT.
Из архива...
Недавно пришлось сделать простенькую подгонялку фотографий в заданные рамки, так чтобы пользователь мог собственноручно выбрать область на фото источнике и вырезать её. Впринципе ничего сложного, самое сложное пожалуй — это отрисовка прямоугольника выделения, когда нажали на кнопку мыши и перемещаем её по изображению — выделяя необходимую нам область.
Сначала самое важное. У картинки pictureBox сразу включаем свойство SizeMode в AutoSize, ни в коем случае ни какие нибудь там Zoom-ы если конечно нет желания поразбираться с масштабированием.
Далее — надо сделать так — чтобы работал скроллинг при выделении мышкой. Так уж получилось что это больное место в .NET (не работает оно само собой и всё тут).
Пример обработки XML файла, средствами языка C#.
Простой пример, наглядно показывает как легко разобрать по кусочкам XML файл.
string prm = "";
XmlTextReader reader = new XmlTextReader(fi.Name.Replace(fi.Extension, ".XML"));
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // Узел является элементом.
prm = prm + ("<" + reader.Name);
while (reader.MoveToNextAttribute()) // Чтение атрибутов.
prm = prm + (" " + reader.Name + "='" + reader.Value + "'");
prm = prm + (">");
break;
case XmlNodeType.Text: // Вывести текст в каждом элементе.
prm = prm + (reader.Value);
break;
case XmlNodeType.EndElement: // Вывести конец элемента.
prm = prm + ("</" + reader.Name);
prm = prm + (">");
break;
}
}
MessageBox.Show(prm);
reader.Close();
Из архива
Расскажу об одном небольшом нюансе который поможет сэкономить время и нервы. Эта особенность мною была замечена только в MySQL (проявлялась как в 5 так и пока в тестовом 6-ом). Заключается она в необходимости особого наименования процедур, для правильного восстановления базы из архива (дампа MySQL).
Смысл заключается в алфавитном порядке функций. При создании дампа базы все элементы сохраняются в алфавитном порядке, тоесть если в процедуре proc1 вызвать процедуру proc2 — то при восстановлении из дампа вылетит ошибка поскольку первой будет восстанавливаться процедура proc1 — которой требуется proc2 — но её в базе на момент воссоздания ещё не будет.
Здесь я приведу некоторые очень полезные вещи при разработке на .NET Compact Framework.
Итак, приступаем:
Узнаём версию .NET Compact Framework
FrmTxt.Text = Environment.Version.ToString();
Узнаём версию операционной системы
OsVersion.Text = Environment.OSVersion.ToString();
Из архива - вдруг пригодится...
Вроде бы нет ничего проще открытия картинки с диска в C#. А нет, И тут есть свои грабли!
Здесь просто приведу два примера.
Первый способ (неправильный):
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
Image img = Image.FromFile(openFileDialog1.FileName);
pictureBox1.Image = img;
}