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

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


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

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

Содержание
  1. От автора
  2. Обзор новостей
  3. SQL Server "Yukon" и CLR: использование данных сервера  
  4. Время кода - Меняем URL’ы на лету
  5. Форумы .Net на www.sql.ru

От автора

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

Иногда необхожимо узнать имя машины, на которой запущена программа, имя пользователя, который в данный момент работает на этой машине и, возможно, другую информацию о системе. Раньше ннеобходимо было использовать функции Windows API для получения этой информации или лезть в системный реестр. Теперь же достаточно обратиться к свойствам классов SystemInformation и System.Environment - и можно получить необходимую информацию.

Вот небольшой пример:

using System;
using System.Windows.Forms;


namespace hDrummer.Sysinfo
{
class SysInformer
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("*** Информация о системе ***");
Console.WriteLine("-------------------------------------------------------------------------------");
Console.WriteLine("- посредством класса System.Environment из пространства имён System -");
Console.WriteLine("-------------------------------------------------------------------------------");
Console.WriteLine("Имя машины: {0}",System.Environment.MachineName);
Console.WriteLine("Версия ОС: {0}",System.Environment.OSVersion);
Console.WriteLine("Система в работе (мс): {0}",System.Environment.TickCount);
Console.WriteLine("Системный каталог: {0}",System.Environment.SystemDirectory);
Console.WriteLine("Имя каталога Program Files: {0}",System.Environment.SpecialFolder.ProgramFiles);
Console.WriteLine("Текущий каталог: {0}",System.Environment.CurrentDirectory);
Console.WriteLine("Версия CLR: {0}.{1}",System.Environment.Version.Major,System.Environment.Version.Minor);

Console.WriteLine("-------------------------------------------------------------------------------");
Console.WriteLine("- посредством класса SystemInformation из пространства имён System.Windows.Forms -");
Console.WriteLine("-------------------------------------------------------------------------------");
Console.WriteLine("Имя ПК: {0}",SystemInformation.ComputerName);
Console.WriteLine("Имя домена: {0}",SystemInformation.UserDomainName);
Console.WriteLine("Имя пользователя: {0}",SystemInformation.UserName);
Console.WriteLine("Находится ли пользователь в сети: {0}",SystemInformation.Network);
Console.WriteLine("Кол-во мониторов на ПК: {0}",SystemInformation.MonitorCount);
Console.WriteLine("-------------------------------------------------------------------------------");
} } }

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

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

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

  1. ActiveUp выпустила Active Calendar V2.1
    Active Calendar - это серверный элемент управления ASP.NET с системой событий на стороне клиента, позволяющий пользователю быстро выбирать дату или время. При этом не происходит отсылки страницы на сервер и не используются внешние скрипты.
  2. Вышел DotNetBar 3.7 с поддержкой навигации в стиле панели
    DotNetBar Suite 3.7 включает навигационную панель в стиле Outlook 2003. Также в этом наборе сделано много улучшений и добавлено много новых особенностей. DotNetBar Suite включает меню, панели инструментов, плавающие окна, боковые панели, подсказки и многое другое с полной поддержкой тем Office 2003/XP/2000 и Windows XP. DotNetBar - это на 100% родной .NET компонент, написанный с использованием управляемого кода. На нашем сайте вы найдёте бесплатную пробную версию и скриншоты продукта.
  3. Вышел Dundas Chart для .NET версии 4.0
    Dundas Software объявила о выходе компонента Dundas Chart версии 4.0 для .NET, последней версии в линейке компонентов визуализации данных. Версия 4.0 содержит улучшенную анимацию, рендеринг в формат Flash, поддержку шаблонов и новые типы финансовых диаграмм. Эти улучшения совместно с существующими особенностями дают возможность разработчику добавить действительно необходимую функциональность к приложениям, написанным для платформы .NET.
  4. Шаблон C# Smart Editors для RapTier
    Этот шаблон (с открытым исходным кодом) разработан для улучшенной работы с БД Microsoft SQL Server и реализует следующие отличия от шаблона по умолчанию, доступного в RapTier* : генерацию веб-сервисов; раздельные страницы для редактирования; фильтрацию данных; пакетное удаление записей; улучшенный WebForm UI и т.д..
    *RapTier - генератор кода ASP.NET, C#, VB.NET и SQL, который поможет вам быстро и легко разработать мощные приложения на платформе .NET. Доступна бесплатная версия.
  5. Вышел 7th Paladin DateSetBrowserForm v1.02!
    DataSetBrowserForm - полезный элемент управления для разработки .Net WinForm приложений, работающих с БД. Этот элемент может быть интегрирован с вашим приложением как диалоговое или всплывающее окно для просмотра DataSet.
  6. Храним и считываем строки соединения, закодированные по стандарту Base64 из Web.Config
    Многие хранят строку соединения с БД в файле web.config. Однако, файл web.config, будучи XML-файлом, хранит данные в текстовом виде. Поэтому некоторые данные, особенно строки соединения, необходимо шифровать. В этой статье мы увидим, как можно хранить и считывать данные, зашифрованные по протоколу Base64 в файле web.config.
  7. Developer Express выпустила набор компонент для .NET Windows Forms
    Набор включает 8 продуктов, специально разработанных для Visual Studio.NET и полностью оптимизирован для .NET Framework – доступен по цене $499. Купив этот продукт, вы сможете двумя щелчками мыши добавлять к вашему приложению возможность навигации, парковки, просмотра данных, редактирования и создания отчётов, используя компоненты XtraBars, XtraNavBar, XtraEditors, XtraGrid, XtraTreeList, XtraVerticalGrid, XtraReports и XtraPrinting Library.
  8. Доступна бета-версия PlusSuite
    Olvio IT, Inc. объявила о выпуске тестовой бета-версии нового набора элементов управления для .NET Framework. PlusSuite содержит такие элементы управления как боковые панели, мощные списки и выпадающие списки. Все элементы управления настраиваются и поддерживают темы Windows XP.
  9. Axosoft выпустила бету OnTime Defect Tracker V4.0
    Новая версия инструмента доступна для публичного бета-тестирования в версиях для веб и Windows. Новая версия включает поддержку безопасности на уровне проектов, пользовательские поля, аудит и т.д.
  10. Xlinesoft выпустила ASPRunner.NET 1.02
    ASPRunner.NET создаёт набор страниц ASP.NET для доступа и модификации данных СУБД Oracle, SQL Server, MS Access, DB2, MySQL, FileMaker или источников данных ODBC. Используя сгенерированные страницы, пользователи могут редактировать, удалять, добавлять данные к БД и осуществлять их поиск.
BUGs, FIXes and HOW TO's -
  1. A System.Resources.MissingManifestResourceException exception occurs when you try to access a localized resource
  2. FIX: Error when you update an ADO client-side recordset when data source does not support schemas
  3. How to create an Outlook Calendar folder by using WebDAV with Visual C# .NET
  4. BUG: The first enabled Button control receives the RaisePostBack event when the ENTER key is pressed
  5. BUG: You cannot use the ImageList property to add images whose size is 32x32
  6. How to create an Outlook Calendar folder by using WebDAV with Visual C# .NET
  7. A System.Resources.MissingManifestResourceException exception occurs when you try to access a localized resource
  8. How to deploy Visual Studio .NET 2003 by using Systems Management Server
  9. FIX: Visual Studio cannot open a Web site if a duplicate Web site exists
  10. How to debug managed-client applications that are started by using a URL in Visual Studio .NET
  11. BUG: The first enabled Button control receives the RaisePostBack event when the ENTER key is pressed

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

SQL Server "Yukon" и CLR: использование данных сервера

SQL Server "Yukon" и CLR: использование данных сервера

ЯЗЫК: VB.Net
Автор статьи: Mike Gunderloy, http://www.developer.com/

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


В предыдущей статье я показал вам, как написать простую функцию на Visual Basic .NET и затем вызвать её из T-SQL кода на SQL Server’a "Yukon". Но это только часть рассказа об интеграции CLR в следующую версию SQL Server’a. Важной частью этого рассказа, которую я опустил, будет рассказ о внутрипроцессном управляемом провайдере ADO.NET, который используется функциями CLR для прямого взаимодействия с вызвавшим их SQL Server'ом. В этой статье я покажу вам основы использования этой технологии.

Небольшое предостережение перед тем, как я начну своё повествование: Microsoft позволила нам поработать с Yukon на ранней стадии разработки. И хотя эта версия была представлена на PDC и копии находятся в руках многих бета-тестеров, тем не менее, она ещё далека до завершения. К моменту выхода конечного продукта почти наверняка изменится множество деталей – пространства имён, имена атрибутов и т.д. Тем не менее, я буду удивлён, если код из этой статьи не заработает в финальной версии продукта, поскольку похоже на то, что общий подход по взаимодействию SQL Server’a и CLR уже не изменится.

Использование объекта SqlContext

При инсталляции SQL Server’a "Yukon" происходит установка сборки с пространством имён System.Data.SqlServer. Это и есть внутрипроцессный управляемый провайдер: новый ADO.NET провайдер, чьей задачей является взаимодействие CLR с SQL Server. Но он не взаимодействует с любым SQL Server’ом (для этого существует System.Data.SqlClient). Вместо этого, во время загрузки вашего CLR-кода в Yukon (путём объявления его сборкой), внутрипроцессный управляемый провайдер позволяет вам подсоединиться к серверу, на котором находится ваш код. Вы можете использовать эту возможность для получения данных с сервера или отсылки данных на сервер.

Вот первый простой пример в виде функции, определённой пользователем, которая использует данные с вызвавшего её сервера:


Imports System.Data.SqlServer
Imports System.Data.Sql

Namespace NorthwindExtras
Public Class Products

<SqlFunction(DataAccess:=DataAccessKind.Read)> _
Public Shared Function InventoryValue( _
ByVal ProductID As Integer) As Double
'Создание объекта SqlCommand, указывающего на родительскую БД
Dim cmd As SqlCommand = SqlContext.GetCommand()
cmd.CommandType = CommandType.Text
cmd.CommandText = "SELECT UnitsInStock * UnitPrice " & _
"FROM Products WHERE ProductID = " & CStr(ProductID)
'Выполнение команды и возвращение результата
InventoryValue = CDbl(cmd.ExecuteScalar())
End Function

End Class
End Namespace

Если вы уже использовали ADO.NET для работы с SQL Server’ом, этот код покажется вам знакомым. Ключевое отличие в том, что этот код не использует объект SqlConnection. Вместо этого используется объект SqlContext, который можно представить себе как объект SqlConnection, который указывает прямо на базу, в которой произошел вызов пользовательской функции. В этом случае был использован объект SqlContext для формирования объекта SqlCommand с последующим выполнением в этом объекте оператора SELECT. Результат выборки используется как возвращаемое значение функции.

Вот таким образом я могу использовать сборку в SQL Server "Yukon" после компиляции (в первой статье этот процесс описан более подробно):

CREATE ASSEMBLY NorthwindExtras
FROM 'C:\NorthwindExtras\bin\NorthwindExtras.dll'
GO
CREATE FUNCTION InventoryValue(@ProductID INT)
RETURNS FLOAT
EXTERNAL NAME NorthwindExtras:[NorthwindExtras.Products]::InventoryValue
GO
SELECT dbo.InventoryValue(1)
GO

----------------------
702

(1 row(s) affected)

Кстати, этот пример использует для работы БД Northwind, поскольку в коде на VB .NET используется одна из таблиц этой базы.

Использование объекта SqlPipe

Вторым важным объектом является объект SqlPipe. Этот объект – ключ к отсылке данных назад на SQL Sever "Yukon" из вашего CLR-кода. Аналогом объекта SqlPipe может быть объект ASP.NET Response; все, что вы пишете в SqlPipe, выскакивает с другой стороны в T-SQL коде. Например, при написании хранимой процедуры (ХП) в CLR, можно использовать объект SqlPipe для передачи результатов её работы назад на сервер. Я добавлю ещё один член к классу Products для демонстрации того, как это работает:

<SqlMethod()>
Public Shared Sub GetProspects(ByVal State As String)
' устанавливаем канал для результатов отработки ХП
Dim sp As SqlPipe = SqlContext.GetPipe()
' соединяемся с другой базой на SQL Server’e
Dim cnn As System.Data.SqlClient.SqlConnection = _
New System.Data.SqlClient.SqlConnection
cnn.ConnectionString = _
"Data Source=(local);Initial Catalog=pubs;Integrated Security=SSPI"
cnn.Open()
' Получаем данные
Dim cmd As System.Data.SqlClient.SqlCommand = cnn.CreateCommand()
cmd.CommandText = "SELECT au_fname + ' ' + au_lname AS Prospect " &
_
"FROM authors WHERE state = '" & State & "'"
Dim dr As System.Data.SqlClient.SqlDataReader = cmd.ExecuteReader()
' И возвращаем результаты
sp.Send(dr)
cnn.Close()
End Sub

В этом коде использовано несколько новых вещей. Во-первых, атрибут SqlMethod, указывающий Yukon’у трактовать этот метод как ХП (предполагая, что на стороне БД он правильно зарегистрирован). Объект SqlPipe формируем с использованием объекта SqlContext, предоставляя коду канал обратной связи с вызвавшей его БД. А в этом конкретном случае я ещё открываю соединение к другой БД. Заметьте, что для этого я использую объекты пространства имён System.Data.SqlClient, поэтому я использую полную квалификацию имён - для того, чтобы компилятор знал о том, что используется стандартный, а не внутрипроцессный провайдер для соединения с SQL Server.

В конце процедуры я использую метод Send объекта SqlPipe для отсылки результатов в вызывающий T-SQL код. У этого метода есть несколько перегруженных вариантов; он принимает строку, объект SqlError или объект, реализующий ISqlReader или ISqlRecord. В этом случае стандартный класс SqlDataReader реализует интерфейс ISqlReader.
Регистрация и использование ХП выглядит так:

CREATE ASSEMBLY NorthwindExtras
FROM 'C:\NorthwindExtras\bin\NorthwindExtras.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS
GO
CREATE PROCEDURE GetProspects (@State nvarchar(2))
AS EXTERNAL NAME NorthwindExtras:[NorthwindExtras.Products]::GetProspects
GO
GetProspects 'CA'
GO

varchar
-------------------------------------------------------------
Johnson White
Marjorie Green
Cheryl Carson
Michael O'Leary
Dean Straight
Abraham Bennet
Ann Dull
Burt Gringlesby
Charlene Locksley
Akiko Yokomoto
hDrummer ;)
Stearns MacFeather
Livia Karsen
Sheryl Hunter
Heather McBadden

(15 row(s) affected)

Как вы видите, я добавил ещё одну опцию к команде CREATE ASSEMBLY. По умолчания, сборка, зарегистрированная в SQL Server "Yukon" не имеет разрешения на использование ресурсов вне локальной БД. Такой подход заблокирует использование объектов из пространства имён System.Data.SqlClient (также как и многие другие операции). Использование хинта WITH PERMISSION_SET = EXTERNAL_ACCESS говорит SQL Server’у "Yukon" о том, что я хочу предоставить сборке доступ к внешним ресурсам. Есть ещё один хинт - WITH PERMISSION_SET = UNSAFE, для запуска кода, который является неуправляемым; вы должны оставить его для исключительных случаев, поскольку его использование спорно с точки зрения безопасности.

Команда CREATE PROCEDURE очень похожа на CREATE FUNCTION. И я запускаю эту ХП после создания также, как и любую другую ХП.

Что дальше

Где же можно применить этот новый код? Я уже размышлял по поводу причин, которые могут вас побудить перенести процедуры в управляемый код: например, по соображениям скорости и упрощения написания кода или доступа к ресурсам вне SQL Server’a. Что особенно привлекло моё внимание – так это объект SqlPipe и его способность возвращать всё, что реализует IDataReader. Реализация интерфейса достаточно проста в .NET (и станет ещё проще с выходом Visual Studio .NET "Whidbey"), так что это предоставляет нам возможность возвращать практически любые данные как результат выполнения ХП SQL Server’a. Представьте себе возвращаемый набор из ключей реестра или объектов Active Directory или записей лога IIS, или... вобщем все, что можно представить в виде набора записей и столбцов. Никто не знает, для чего реально будет использоваться CLR-код code с SQL Server "Yukon," но я уверен, что гибкость и мощь такой связки даст очень интересные результаты.

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

Время кода

Меняем URL’ы на лету

ЯЗЫК: C#
АВТОР: Jeff Prosise,
Меняем URL’ы на лету
ПЕРЕВОД: Чужа В.Ф ака hDrummer

О чём: Используем метод HttpContext.RewritePath для подмены URL внутри приложения

Одним из наиболее слабоосвещённых – но потенциально полезных – методов .NET Framework в части, касающейся ASP.NET, является метод класса HttpContext RewritePath. Этот метод используется ASP.NET для получения сессионного идентификатора из URL’a, при задействованном состоянии сессии без использования куки. Метод RewritePath также может быть использован и для подмены URL’a внутри приложения. Для демонстрации предположим, что у нас есть следующий ASPX-файл, который мы назовём RewritePath.aspx:

<html>
<body>
<h2><asp:Label ID="Output" RunAt="server" /></h2>
</body>
</html>

<script language="C#" runat="server">
void Page_Load (Object sender, EventArgs e)
{
string id = Request.QueryString["ID"];
if (id != null && id != String.Empty) {
switch (id) {
case "1":
Output.Text = "Give me chastity and " +
"continence, but not yet.";
break;

case "2":
Output.Text = "A programmer is a device " +
"for turning coffee into code.";
break;

case "3":
Output.Text = "Blessed is the man who, " +
"having nothing to say, abstains from " +
"giving wordy evidence of the fact.";
break;
}}}
</script>

Если эту страницу поместить в виртуальный каталог Foo, то следующие три URL’a отобразят три разных утверждения:

http://./foo/rewritepath.aspx?id=1
http://./foo/rewritepath.aspx?id=2
http://./foo/rewritepath.aspx?id=3

А теперь представьте, что вы хотите предоставить вашим пользователям получать эти утверждения с использованием вот таких ‘фантомных’ URL’ов:
http://./foo/quotes/page1.aspx
http://./foo/quotes/page2.aspx
http://./foo/quotes/page3.aspx
Этого можно добиться, использовав немного магии – на лету превратив URL вида ./quotes/page1.aspx в URL вида ./rewritepath.aspx?id=1 – использовав метод HttpContext.RewritePath. Хитрость состоит в сборе запросов вида /quotes/page1.aspx, /quotes/page2.aspx из ASP.NET HTTP-канала и превращения их в запрос вида /rewritepath.aspx?id=1, /rewritepath.aspx?id=2 и т.д.. Вот файл Global.asax который это и делает:


<script language=C# runat="server">
void Application_BeginRequest (Object sender, EventArgs e)

// TODO: превращение пути вида
// ./quotes/page1.aspx в путь вида
// ./rewritepath.aspx?id=1
//
HttpContext context = HttpContext.Current;
string oldpath = context.Request.Path.ToLower ();
string token = "/quotes/page";
int i = oldpath.IndexOf (token);
int len = token.Length;
if (i != -1) {
int j = oldpath.IndexOf (".aspx");
if (j != -1)
{ string id = oldpath.Substring (i + len, j - (i + len));
string newpath = oldpath.Replace (token + id + ".aspx", "/rewritepath.aspx?id=" + id);
context.RewritePath (newpath);
} } }
</script>

Application_BeginRequest вызывается в начале каждого запроса. В этой реализации происходит выделение части URL’a (например, /foo/quotes/page1.aspx), замена этой части на ссылку на реальной странице (например, /foo/rewrite.aspx?id=1) и вызов метода RewritePath для перенацеливания запроса. Попробуйте следующее: перепишите файл RewritePath.aspx в каталог wwwroot на вашем веб-сервере и попробуйте набрать в адресной строке вашего браузера следующее:

http://localhost/quotes/page1.aspx
Сгенерируется ошибка "page not found". Теперь скопируем Global.asax в wwwroot и попробуем ещё раз. На этот раз всё заработает благодаря смене URL’a в событии Application_BeginRequest.
RewritePath используется во многих приложениях. Например, вы можете использовать этот метод для занесения страниц, имеющих параметры в URL’e, в избранное. Этот метод также можно использовать для сокрытия реальных путей в вашем приложении из соображений безопасности. Ну а теперь, когда вы знаете, что метод RewritePath существует, то наверняка сможете найти ему и другое применение.


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

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

SqlCommand.CommandTimeot = 0 -> General Network Error
DataSet, BinaryFormatter, Remoting - кто как проблемы решает.
Проблема при компиляции типизированого DataSet
No Wait Transation
XML Схема и связи на ней!
my.XSD -> my.XML Подскажите, как из сделанной вручную схемы получить .XML
Инструменты Toolbox ?
textBox и DataBindings


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



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


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


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное