Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

В тридцать шестом выпуске рассылки '.Net Собеседник' вы можете узнать о том,


Информационный Канал Subscribe.Ru

.Net Собеседник #36

Содержание
  1. От автора
  2. Обзор новостей
  3. Как удалить запись, если у неё есть подчинённые записи
  4. Время кода - Отображение превью изображения перед загрузкой его на сервер
  5. Форумы .Net на www.sql.ru

От автора

Здравствуйте, коллеги!

Если есть необходимость сохранить настройки приложения в файл, то можно воспользоваться возможностью сериализации объекта в файл.

//структура для хранения сохраняемой в файл информации
    public struct Options
    {
        public string connection;
        public string mailto;
        public string file_store_path;
        public string smtpmail;

    }
///
/// Класс для сериализации объекта в xml-файл
///

    public class FEServerConfig 
    {
//Лишаем возможности создавать объекты этого класса
        private FEServerConfig (){}
        public static void CreateSettings(object o)
        {
            XmlSerializer myXmlSer = new XmlSerializer(o.GetType());
            StreamWriter myWriter = new StreamWriter(Application.StartupPath+@"\myconfig.config");
            myXmlSer.Serialize(myWriter,o);
            myWriter.Close();
        }

        public static void LoadSettings(ref Options o)
        {
                XmlSerializer myXmlSer = new XmlSerializer(typeof(Options));
                FileStream mySet = new FileStream(Application.StartupPath+@"\myconfig.config", FileMode.Open);
                o = (Options)myXmlSer.Deserialize(mySet);
                mySet.Close();
        }
    }

Использование такого класса очевидно -

Options o = new Options();
if (File.Exists(Application.StartupPath+@"\myconfig.config"))
{
 Console.WriteLine("Reading configuration options...");
 FEServerConfig.LoadSettings(ref o);
}
else
{
 Console.WriteLine("Creating configuration options..."); 
 o.mailto = "hdrummer@mail.ru";
 o.connection = "data source=...";
 o.file_store_path = @"c:\temp\";
 o.smtpmail = "...";
 FEServerConfig.CreateSettings(o);
}


Более подробное и полное обсуждение сохранения настроек приложения можно посмотреть здесь.

На этом всё - желаю интересного чтения.

{К содержанию}

Обзор новостей

  1. Бесплатные приложения на платформе .Net
    Уважаемые коллеги! Если вы создали бесплатное приложение, работающее на платформе .Net и хотите познакомить с ним как можно большее число людей, я готов разместить информацию о таком приложении в рассылке. Если заинтересовались - пишите на email.
  2. Дни разработчика Весна'05
    Место события: Санкт-Петербург, Екатеринбург, Казань, Нижний Новгород, Москва, Волгоград, Новосибирск, Самара. Подробнее по ссылке.
  3. Вышел ReSharper 1.5
    Один из лучших инструментов-добавок к VS .NET 2003: 8 новых рефакторингов, улучшение быстродействия и т.п.
  4. Вышел .net Charting для ASP.NET Версии 3.1
    Очередное обновление компонента. Теперь доступна полнофункциональная версия для разработки без ограничений по времени использования.
  5. Вышел Aspose.Word 2.2
    Aspose.Word – это .Net компонент для создания отчётов в формате Word, также позволяющий вам считывать и записывать документы в формате Word без использования Microsoft Word. Последний выпуск поддерживает .NET Framework 2.0 и Visual Studio 2005.
  6. Превью и список особенностей Aspose.Workflow
    Aspose.Workflow - расширяемый каркас автоматизации делопроизводства, включающий стандартную его реализацию, полностью основанную на спецификациях WFMC. Aspose.Workflow использует XPDL как основной формат.

{К содержанию}

Статья номера

Как удалить запись, если у неё есть подчинённые записи

ЯЗЫК: C#
Автор статьи: Tadas Budvytis

ПЕРЕВОД: Чужа В.Ф. ака hDrummer
КОД К СТАТЬЕ: GetRelatedRec.zip

Проблема

Часто бывает, что при удалении записи из таблицы необходимо что-то проделать с подчинёнными записями – удалить их, переназначить другой записи, убрать информацию о подчинении. Механизм, описанный ниже, позволит вам решать такие проблемы. Допустим, у вас есть таблица Employees и таблица дефектов – Defects, а одна из записей первой таблицы должна быть удалена. Отсюда дилемма – что делать с подчинёнными записями таблицы Defects: удалить их, оставить без подчинения или переназначить другой записи? Проблема становится непростой, если есть многоуровневые отношения. Что же делать? Читайте дальше.

Предлагаемая план-схема действий.

  1. Пользователь хочет удалить некую запись.
  2. Вытаскиваем все зависимые записи (ID и внешние ключи) из БД в DataSet.
  3. Оценить полученный DataSet на зависимые записи. В простейшем сценарии приложение может информировать пользователя о них и ограничить удаление. Или может просить подтверждение удаления/переназначения этих записей.
  4. Сохранить изменения в БД.

1. Пользователь хочет удалить некую запись.

Желательно заблокировать запись, чтобы только один пользователь мог с ней работать.

2. Вытаскиваем все зависимые записи.

Вытаскиваем все зависимые записи (ID и внешние ключи) для того, чтобы принять решение о том, что делать с этими записями. Для этого существуетспециальная функция, которая возвращает подчинённые записи из разных таблиц.

Вы можетет найти её в классе DBDeleteHelper, в пространстве имён MohawkIDEAS.Utils.

public DataSet GetRelatedTables(SqlConnection con, string strTableName, string strFieldName ,int iID);

con - активное соединение.
strTableName – имя таблицы, которой принадлежит запись.
strFieldName – имя ключевого поля.
iID – id записи, для которой вы хотите вытащить зависимые записи.

Таблицы организованы так, что первыми идут самые «дальние» таблицы, последней идёт главная таблица.
Итак, если вы хотите удалить запись из таблицы Employee с id 12, то можете написать так:

DataSet _ds=GetRelatedTables(con, "employees","ID",12);

3. Оценка полученного DataSet

После получения DataSet неплохо бы проверить, есть ли там вообще какие-нибудь записи. Например, в таблице Defects.

if (_ds.Tables["Defects"].Rows.Count>0 )
{
 …
}

Если есть несколько подчинённых записей, то можно пойти такими путями:

1. Проинформировать пользователя о том, что запись не может быть удалена, поскольку имеет подчинённые записи и отменить удаление.
2. Все подчинённые записи также удаляются.

foreach (System.Data.DataRow _row in _ds.Tables["Defects"].Rows)
 {
     _row.Delete();
 }

3. Подчинённые записи переназначаются на другую запись путём изменения значения внешнего ключа.

int _iID;
 _iID = ChooseNewResposibleEmploee();
              
foreach (System.Data.DataRow _row in _ds.Tables["Defects"].Rows)
{
  _row[“EmployeeID”]= _iID; 
//Другой Employee
}

4. Сохранить изменения в БД.

Если удаление не было отменено, то обновлённый набор данных DataSet должен быть отослан для внесения изменений в БД.

DataAdapter.Update(_ds);

Вот и всё.

{К содержанию}

Время кода

Отображение превью изображения перед загрузкой его на сервер

ЯЗЫК: C#
АВТОР: Siddharth Ray,
http://www.codeproject.com/
ПЕРЕВОД: Чужа В.Ф ака hDrummer

Есть простой способ использования функциональности превью на ваших веб-страницах. Идея состоит в том, чтобы иметь на странице некую область для предосмотра, в которой пользователь может увидеть изображение перед отправкой его на сервер.Функция ShowPreview() в приведенном ниже коде покажет привью в тэге <img> и сохранит данные из поля file объекта <FORM>. Этот способ может быть легко расширен для поддержки большей функциональности. Фактически можно использовать отдельное окно для отображения превью изображения.

Веб-форма с функцией на JavaScript

Первая функция isGraphics() проверит является ли файл файлом картинки или нет. Если это файл картинки, то будет показана картинка предосмотра. Тэг img содержит предварительно загруженную картинку просто для того, чтобы избежать всем знакомое изображение Красного Креста. Вторая функция setImage() будет использовать метод getElementById для нахождения id превью и установки источника изображения, которое будет загружено.

<%@ Page Language="vb" Codebehind="WebForm2.aspx.vb"

Inherits="Match.WebForm2"%>
<HTML>
<HEAD>
<script language=javascript>
function isGraphics(filename)
{
var i=filename.length; // get file length
i=filename.lastIndexOf('.')+1; // find extension
var ext=filename.substr(i); // pull out extension

switch(ext.toLowerCase())
{
case "gif": // GIF
case "jpg": // JPG
case "jpeg": // JPG
return true;
break;
default:
return false;
}
}
function setImage(file)
{

var image=document.getElementById("Preview");
if(file.value.length) if(isGraphics(file.value))
if(image.src!=file.value) image.src=file.value;
}
</script>

<title>Preview</title>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<TABLE id="Table1" cellSpacing="1"
cellPadding="1" width="100%" border="0">
<TR></TABLE></form></body></HTML>

На этом всё.


{К содержанию}

Форумы .Net - вопросы оставшиеся без ответа

Проблема с подключением БД VC++ и ADO.NET
Как правильно использовать fill (oracle & NET)
Crystal reports!
компонент с поддержкой транзакций
про вызов dts package из asp.net
Linux.Mozila.JS - особенности ...ного программирования - кто подскажет...
Проблема при запросе данных и таблицы
Ещё раз про DLL
accessibility of ClassView
Аппликативное нахождения портов и IP адресов
Как правильно задать код символа из Charmap ?


На этом тридцать шестой выпуск .Net Собеседника закончен.
До следующего номера.



Чужа Виталий Ф. aka hDrummer, MCAD, MCDBA, MCP
hdrummer@sql.ru - жду ваши предложения и замечания.


Рассылки Subscribe.Ru
.Net Собеседник - Новости мира Net, C#, ASP.Net

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.dotnetgrains
Отписаться

В избранное