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

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


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

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

Содержание
  1. От автора
  2. Обзор новостей
  3. Как создать класс-помощник для создания таблиц на Visual C# .NET
  4. Время кода - Ещё раз о Repeater'e
  5. Форумы .Net на www.sql.ru

От автора

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

Получил сегодня январский номер журнала SQL Server, а там злая такая заметка Джо Селко об интеграции .Net Framework и SQL Server 2005. Ссылка вот, заметка называется «Ключи к базе данных». (Кстати, сам по себе журнал толковый, часто попадаются очень интересные статьи. На этом же сайте они выложены в архивах.)
Попробую разобрать её по абзацам.

Во-первых, автор сразу агрессивно берёт «быка за рога», ну прямо чуть не с низкого старта:

«Microsoft вовсю рекламирует применение CLR в следующей версии SQL Server 2005…»

Получается, что сам факт рекламы применения CLR должен вызвать у читателя возмущение. А почему? Чем Microsoft в этом отношении (будем говорить пока только о праве рекламировать) хуже других? Ничем.

Далее.

«Я выбираю COBOL, так как 78% программ во всем мире написано на этом языке.»

С одной стороны звучит как: «Я буду ездить на Запорожце, потому что 78% страны на нём ездит», с другой – ну выбирайте, кто ж вам мешает? :)

Смотрим дальше -

«Я хочу подчеркнуть следующее: «на любом из языков» подразумевает, что вы будете писать на одном из языков Microsoft. А что делать, если вы любите Java, а не C#?»

Есть такая особенность– Microsoft фактически создала многоязычную платформу, в то время как Java получился многоплатформенным языком. Но в тоже время нужно помнить, что Java – собственность компании Sun и наверняка за использование его на платформе .Net нужно платить лицензионные отчисления. Кроме того, поддерживать технологию конкурента – топить самого себя. Ну и C# всё же не так уж и не похож на Java, брат-близнец практически, переход особых сложностей не вызовет. Хотя чем чёрт не шутит, помня относительно недавние лобзания глав Sun и Microsoft, может и выпустят Java для .Net.
Далее.

“Продолжим цитирование. «Многие задачи, которые было неудобно или затруднительно программировать на Transact­SQL, лучше реализовать средствами управляемого кода...» С этим я согласен. Но это не те задачи, которые следует программировать в рамках базы данных. … Единственная задача SQL — извлечение данных и манипулирование ими. Точка.”

Вот с этим соглашусь. Если внимательно приглядеться к тем новым особенностям и функциям SQL Server’a 2005, которые декларируются, то кажется, что из него действительно решили сделать некий универсальный инструмент на все случаи жизни, а как известно универсальный инструмент обычно хорошо не делает ничего. С другой стороны, 2005 версия ещё не вышла в окончательном варианте; кроме того использовать или не использовать интеграцию с CLR – решать программистам, а ведь есть уже примеры, когда использование такой интеграции даёт ощутимый прирост в скорости работы приложения – например, как описано здесь .

Следующая часть статьи называется «Меняем плохое на ужасное!»

Что такое «плохое» не совсем ясно. Толи это о SQL Sever’e 2000, как предшественнике Yukon’a, толи о языках программирования, которые применяются на платформе Windows, толи ещё о чём. Автор не стал особо вдаваться в подробности, просто слово Microsoft ассоциируется у него со словом «плохое» - и всё тут. Ну а будущее технологий от Microsoft – со словом «ужасное». Всё просто, ясно и… бездоказательно. Если не считать доказательством попытку опровергнуть цитату от тех же Microsoft “«Вы сможете лучше применить знания и опыт, ранее приобретенные при написании кода»”. Честно говоря, ничего плохого в этой цитате я не вижу – ну что плохого в том, что я применяю приобретённые ранее знания при написании кода? Или программисты на COBOL так не делают? ;) Затем идёт тезис о том, что «смешение нескольких языков в рамках СУБД приведёт организацию коллапсу». Ну на самом-то деле язык остался один – T-SQL, просто хранимые процедуры и функции можно писать теперь на языках .Net. Хотя технология, безусловно, усложнилась. И, добавлю от себя, использование её выглядит несколько сырой – уж больно много операций приходится выполнять вручную. Но, опять же, будем помнить о том, что окончательной версии Server’a 2005 мы ещё не видели. Кроме того, возможно, что все эти операции будут автоматизированы в Visual Studio 2005.
Далее –
«Уничтожение послойной архитектуры — фундаментально неверный подход. Он угрожает целостности данных и возвращает нас в худшие времена файловых операций при обработке данных.»
Об уничтожении послойной архитектуры речь и не идёт. Скорее – о перекидывании дополнительных мостиков между этими слоями. А это уже совершенно разные вещи.
Последнее предложение вообще звучит презрительно-надменно.
«Несомненно, маленький Джонни, получивший сертификат администратора БД, считает себя профессионалом и способен пролезть внутрь СУБД, но может ли кто-то ответить мне, что за преимущества получит его фирма?»
Такое ощущение, что в мире существует только один-единственный человек, имеющий право называться профессионалом. И зовут его, конечно, Джо Селко.

А может быть он и есть «маленький Джонни»?

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

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

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

  1. Live Journal блог от hDrummer'a
    Есть идея собрать все выпуски рассылки в один chm файл. Нужно это кому-нибудь или идея ненужная? А может быть уже кто-то сам сделал такой вариант? Жду ваших ответов.
  2. Обновление .netCHARGE 4.2
    Поддержка интеграции без dll или дополнительных зависимостей. Поддержка нового процессора/шлюза Concord EFS (First Data).
  3. Spatially Aware выпустила дополнение “США в растре” (растрированные США ;) для Map Suite
    Этот компонент работает как в Winforms, так и в Webforms-приложениях, а также в редакции Map Engine приложения Map Suite.
  4. Вышел модуль UML: SDE 2.0 для Visual Studio .NET
    Visual Paradigm объявила о выходе SDE 2.0 для Visual Studio.NET, мощного модуля UML для VS.NET. Инструмент поддерживает последние диаграммы и нотации UML, генерацию кода, реверсный инжиниринг для языков .NET, включая C++, C#, VB.NET и ASP.NET.
  5. Вышел form.suite4.net
    form.suite4.net – дизайнер графического интерфейса для приложений Microsoft .NET Windows и Web Forms. Главное назначение этого дизайнера – увеличить продуктивность разработки за счёт устранения повторяющихся этапов разработки – например, привязки форм к бизнес-классам.
  6. Вышел Calendar Tools 2.0 для .NET
    Содержит 6 элементов управления Windows Forms, обладающие общими свойствами и методами, что делает лёгким обмен данными.
  7. Вышел RapidSpell Desktop .NET 3.5
    Keyoti выпустила RapidSpell Desktop .NET v3.5, проверщик орфографии Windows Form с кучей новых функций.
  8. Вышел DotNetBar Suite 4.7
    DevComponents LLC объявила о выходе DotNetBar Suite 4.7. Новый релиз содержит стиль подобный на Office 2003 и множество новых улучшений и особенностей. DotNetBar Suite включает меню, панели инструментов, плавающие окна, боковые панели, панели с закладками, всплывающие подсказки и т.д. С поддержкой темl Office 2003, XP, 2000 и Windows XP.

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

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

Как создать класс-помощник для создания таблиц на Visual C# .NET

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

ПЕРЕВОД: Чужа В.Ф. ака hDrummer

Обзор

В этой статье рассказывается как реализовать и использовать класс DataSetHelper, который содержит простой код для создания таблицы на основе списка полей и типо полей, разделённого запятыми. Также здесь существует второй метод создания таблицы – уже с ключевыми полями.
Класс DataSetHelper включает переменную класса DataSet. Выборочно можно присвоить существующий объект класса DataSet переменной-члену класса. Если переменная указывает на правильный DataSet, все объекты типа DataTable, созданные с помощью метода CreateTable добавляются в него. В другом случае метод возвращает ссылку на объект класса DataTable.

Класс-оболочка DataSetHelper

Создадим класс в Visual Studio .NET из шаблона Class Library и заменим его содержимое на:

public class DataSetHelper
{
public DataSet ds;
public DataSetHelper(DataSet DataSet)
{
ds = DataSet;
}
public DataSetHelper()
{ ds = null; }
}

Метод CreateTable (Вариант 1)

Вызов метода в первом случае будет выглядеть так:

DataTable dt = dsHelper.CreateTable("CT1", "Name String, ID Int32 Required, Field3 String Name + ID");

Этот код создаёт новый объект класса DataTable с именем TableName равным CT1 и тремя полями (Name, ID, and Field3). Поля Name и Field3 имеют тип System.String, a поле ID имеет тип System.Int32 и обязательно для заполнения. Field3 содержит результат выражения "Name + ID".
Для указания полей в списке полей используйте такой синтаксис:
fieldname datatype[ REQUIRED|expression], ...

  1. Поддерживаемые типы данных – все члены пространства имён System, такие как Int32 или String. Нельзя использовать типы, спецефичные языку, такие как int или Integer. Также не надо явно указывать пространство имён System в списке полей.
  2. По умолчанию все поля опциональны, т.е. на добавлять слово REQUIRED после типа данных для того, чтобы запретить значения NULL в этом поле.
  3. Выражением является любое корректное выражение, поддерживаемое классом DataColumn.
Для создания метода CreateTable добавим следующий код к нашему классу-оболочке:

public DataTable CreateTable(string TableName, string FieldList)
{
DataTable dt = new DataTable(TableName);
DataColumn dc;
string[] Fields= FieldList.Split(',');
string[] FieldsParts;
string Expression;
foreach(string Field in Fields)
{
FieldsParts = Field.Trim().Split(" ".ToCharArray(), 3); // allow for spaces in the expression
// добавляем имя поля и тип данных
if (FieldsParts.Length == 2)
{
dc = dt.Columns.Add(FieldsParts[0].Trim(), Type.GetType("System." + FieldsParts[1].Trim(),true,true));
dc.AllowDBNull = true;
}
else if (FieldsParts.Length == 3)
// добавляем имя поля, тип данных, выражение
{
Expression = FieldsParts[2].Trim();
if (Expression.ToUpper() == "REQUIRED")
{
dc = dt.Columns.Add(FieldsParts[0].Trim(), Type.GetType("System." + FieldsParts[1].Trim(), true, true));
dc.AllowDBNull = false;
}
else
{
dc = dt.Columns.Add(FieldsParts[0].Trim(), Type.GetType("System." + FieldsParts[1].Trim(), true, true), Expression);
}
}
else
{
throw new ArgumentException("Invalid field definition: '" + Field + "'.");
}
}
if (ds != null)
{
ds.Tables.Add(dt);
}
return dt;
}

Метод CreateTable (Версия 2)

Здесь мы рассмотрим второй вариант метода CreateTable, который практически такой же как и первый, кроме того, что он дополнительно устанавливает свойство DataTable.PrimaryKey.
Пример вызова метода CreateTable:

DataTable dt = dsHelper.CreateTable("CT2","Name String, ID Int32 Required, Field3 String Name + ID", "ID");

Этот код создаёт новый DataTable с именем TableName равным CT2 и тремя полями. В этом коде поле ID является главным ключом. Можно указать больше чем одно ключевое поле (например, ID и Name).
Для создания метода CreateTable добавим следющий код в наш класс-оболочку:

public DataTable CreateTable(string TableName, string FieldList , string KeyFieldList)
{
DataTable dt = CreateTable(TableName, FieldList);
string[] KeyFields = KeyFieldList.Split(',');
if (KeyFields.Length > 0)
{
DataColumn[] KeyFieldColumns= new DataColumn[KeyFields.Length]; int i;
for (i = 1; i==KeyFields.Length-1 ; ++i)
{
KeyFieldColumns[i] = dt.Columns[KeyFields[i].Trim()];
}
dt.PrimaryKey = KeyFieldColumns;
}
return dt;
// нет необходимости добавлять к DataSet – вызов метода CreateTable это делает
}

Использование класса

using System.Data
DataSet ds;
DataSetHelper dsHelper;
ds = new DataSet();
dsHelper = new DataSetHelper(ds);
DataTable dt = dsHelper.CreateTable("CT1", "Name String, ID Int32 Required, Field3 String Name + ID");
dt.Rows.Add(new Object[] {"Jones", 4});
dt.Rows.Add(new Object[] {"Jones", 8});
dt.Rows.Add(new Object[] {"Thompson", 42});
dataGrid1.SetDataBinding(ds,"CT1");

DataTable dt = dsHelper.CreateTable("CT2","Name String, ID Int32 Required, Field3 String Name + ID", "ID");
dt.Rows.Add(new Object[] {"Tom Jones", 45});
dt.Rows.Add(new Object[] {"Will Smith", 58});
dt.Rows.Add(new Object[] {"Davey Jones", 84});
dt.Rows.Add(new Object[] {"Rob Thompson", 42});
dataGrid1.SetDataBinding(ds, "CT2");

Что можно улучшить:

Можно улучшить парсер так, чтобы можно было указывать максимальную длину строковых полей. Например, можно использовать такой синтаксис:
String(50)

Проблемы

Выражение не должно содержать запятых, даже в кавычках. Пример неправильного выражения:  LastName+", "+FirstName

Вот и всё.

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

Время кода

Ещё раз о Repeater'e

ЯЗЫК: C#
АВТОР: Чужа В.Ф.,
dotnetgrains.sql.ru

В последнее время все отчёты, которые требуются в моих веб-приложениях, я создаю только на базе Интернет Эксплорера. Весь процесс описан мною в статье «Создаём отчёты своими руками», которая будет опубликована в первом номере журнала «Алгоритм», а один интересный момент я опишу здесь.

Касается этот момент использования метода класса для вывода информации в шаблон Repeater’a. Допустим у нас есть некий запрос, мы его исполнили, наполнили таблицу DataTable, а затем привязали к шаблону в Repeater’e.

<ItemTemplate>
<tr>
<td><%#GetIdentityQ1%>
</td>
<td><%#GetIDcode(Container.DataItem)%>
</td>
<td><%#DataBinder.Eval(Container.DataItem, "fio")%>
</td>
<td align="right"><%#GetCost4Tax(Container.DataItem)%></td>
</tr>
</ItemTemplate>

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

protected string GetCost4Tax(object o)
{
decimal osc = 0;
if ((o as DataRowView)["Cost4Tax"]!=DBNull.Value)
{
osc = Convert.ToDecimal((o as DataRowView)["Cost4Tax"]);
}
return osc.ToString("0.00")+" грн.";
}

Конечно, есть и другие способы для достижения такого эффекта, но сегодня мы познакомились именно с этим.

На этом всё.


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

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

Про запрос
можно ли из ActiveX на HTML page вызвать функцию скрипта
подключать разные Item при определенных условиях
подскажите с классами на asp.net страничках


На этом тридцать четвёртый выпуск .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
Отписаться

В избранное