Помощь в написании студенческих работ
Антистрессовый сервис

Сбор и хранение MAC адресов коммутаторов Cisco Catalyst с возможностью обращения к базе данных в которой они хранятся

Дипломная Купить готовую Узнать стоимостьмоей работы

Основным резальтатом работы является создание программного обеспечения, которое осуществляет поиск хоста по MAC адресу. Созданную программу можно использовать для работы в локальной сети предприятия. Рисунок 10. запуск менеджера (отправление запросов) Для запуска нажать на кнопку «Start Manager», после чего начинается отправление запросов на устройства c IP адрес 10. Get Table" — кнопка, после… Читать ещё >

Сбор и хранение MAC адресов коммутаторов Cisco Catalyst с возможностью обращения к базе данных в которой они хранятся (реферат, курсовая, диплом, контрольная)

Содержание

  • Введение
  • Глава1. Анализ существующих подходов к решению данной проблемы Коммутаторы
    • 1. 1. Подход первый — CommView
    • 1. 2. Подход второй — 10-Страйк: Мониторинг Сети
    • 1. 3. Подход третий — NETMON от RINET Software Team
    • 1. 4. Подход четвертый — Arpwatch под *nix
    • 1. 5. Подход, реализуемый в дипломе Глава2 Разработка архитектуры программы
    • 2. 1. Выбор средств программирования
    • 2. 2. Описание алгоритма работы Оконный интерфейс программы
  • Глава 3. Особенности программной реализации используемых алгоритмов программы и пример реализации
  • Глава 4. Анализ результатов
  • Заключение
  • Список использованной литературы Электроные ресурсы

Tables[tableName]. NewRow ();

DataRow newrow = MetroDS. Tables[tableName2]. NewRow ();

newrow[" deviceId" ] = id;

newrow[" IP_ADDRESS" ] = IPAddress;

newrow[" COMMUNITY" ] = Community;

newrow[" INTERVAL" ] = interval;

MetroDS.Tables[tableName2]. Rows. Add (newrow);

this.dAdapt.Update (MetroDS, tableName2);

MetroDS.Tables[tableName2]. AcceptChanges ();

Console.WriteLine («device updated successfully»);

}

catch (SqlException ex)

{

Console.WriteLine (string.Format («An exception of type {0} has been generated. The error message generated in {1}» ,

ex.GetType (),

ex.Message));

MessageBox.Show («Cannot save data into the Database «, «Save data error», MessageBoxButtons. OK, MessageBoxIcon. Exclamation);

}

finally

{

cn.Close ();

Console.ReadLine ();

}

}

/**

* Gets the device Id

*/

public int getDeviceId ()

{

cn.ConnectionString = this. connectString ();

int id = 0;

try

{

cn.Open ();

dAdapt = new SqlDataAdapter («Select max (deviceId) as maxid from device», conString);

// Create a new DataTable

DataTable dtResult = new DataTable ();

// Fill the DataTable with the result of the SQL statement

dAdapt.Fill (dtResult);

// Loop through all entries

foreach (DataRow drRow in dtResult. Rows)

{

if (!(drRow[" maxid" ]. ToString ()).Equals (««))

id = Convert. ToInt32(drRow[" maxid" ]. ToString ());

}

id = id + 1;

return id;

Console.WriteLine («device Id returned successfully»);

}

catch (SqlException ex)

{

Console.WriteLine (string.Format («An exception of type {0} has been generated. The error message generated in {1}» ,

ex.GetType (),

ex.Message));

MessageBox.Show («Cannot get data from the Database «, «Save data error», MessageBoxButtons. OK, MessageBoxIcon. Exclamation);

}

finally

{

cn.Close ();

Console.ReadLine ();

}

return id;

}

/**

* Deletes the device from database.

*/

public void DeleteDevice (int Id)

{

cn.ConnectionString = this. connectString ();

string del = @" delete from device where deviceId = «+ Id;

try

{

cn.Open ();

MetroDS = new DataSet («Metro»);

dAdapt = new SqlDataAdapter («Select * from device», conString);

dAdapt.Fill (MetroDS, tableName2);

builderTCurrent = new SqlCommandBuilder (dAdapt);

DataTable dt = MetroDS. Tables[tableName2];

string strSQL = «delete from device where deviceId = «+ Id;

SqlCommand objCommand2 = new SqlCommand (strSQL, cn);

SqlDataAdapter adapter2 = new SqlDataAdapter (objCommand2);

adapter2.Fill (MetroDS, tableName2);

adapter2.Update (MetroDS, tableName2);

MetroDS.Tables[tableName2]. AcceptChanges ();

Console.WriteLine («device updated successfully»);

}

catch (SqlException ex)

{

Console.WriteLine (string.Format («An exception of type {0} has been generated. The error message generated in {1}» ,

ex.GetType (),

ex.Message));

MessageBox.Show («Cannot delete data from the Database «, «delete data error», MessageBoxButtons. OK, MessageBoxIcon. Exclamation);

}

finally

{

cn.Close ();

Console.ReadLine ();

}

}

public string DBHost

{

get

{

return host;

}

set

{

host = value. ToString ();

}

}

public string DBName

{

get

{

return dbname;

}

set

{

dbname = value. ToString ();

}

}

public string DBUser

{

get

{

return dbUser;

}

set

{

dbUser = value. ToString ();

}

}

public string DBPass

{

get

{

return dbPass;

}

set

{

dbPass = value. ToString ();

}

}

}

}

file smnThreadRequest. cs

using System;

using System.Collections.Generic;

using System. Text;

using System.Net;

using SnmpSharpNet;

using System. Threading;

using System.Windows.Forms;

namespace Myproject

{

class SnmpThreadRequest

{

Object locker = new Object ();

private DateTime timeRequest;

private string macAddress;

private int interval = 0;

private string port = «» ;

public ListView lvwReceivedMessages;

private dbConnect dbConnection = new dbConnect ();

public List table;

private string ipAddress = «», communityString, oid;

private SnmpWalk walk;

public bool rep = false;

public delegate void AddListItem (String[] str);

public AddListItem respDelegate;

public void AddListItemResponse (String[] str)

{

ListViewItem item2 = new ListViewItem (str);

lvwReceivedMessages.Items.Add (item2);

}

// Constructor

public SnmpThreadRequest (String hostIp, String communityString, int intervalTime,

string dbConStr, ListView lv)

{

this.ipAddress = hostIp;

this.communityString = communityString;

this.interval = intervalTime;

lvwReceivedMessages = new ListView ();

dbConnection.setConString (dbConStr);

lvwReceivedMessages = lv;

}

//Entry point of thread.

public void startRequest ()

{

respDelegate = new AddListItem (AddListItemResponse);

do

{

Console.WriteLine («sending Snmp request on the host «+ this. ipAddress + «with community string «+ this. communityString);

try

{

this.rep = false;

{

lvwReceivedMessages.Invoke (respDelegate, new object[] { new string[] { DateTime.Now.ToString (), «Send request», this. ipAddress, «1» } });

this.rep = this. sendRequest ();

Thread.Sleep (TimeSpan.FromSeconds (5));

}

// Updates log information depending of the state of device.

if (this.rep == true)

lvwReceivedMessages.Invoke (respDelegate, new object[] { new string[] { DateTime.Now.ToString (), «Got response successfully», this. ipAddress, «1» } });

else

{

lvwReceivedMessages.Invoke (respDelegate, new object[] { new string[] { DateTime.Now.ToString (), «No Response «, this. ipAddress, «1» } });

lvwReceivedMessages.Invoke (respDelegate, new object[] { new string[] { DateTime.Now.ToString (), «Device is not in ready state», this. ipAddress, «1» } });

}

// Delay interval time before to send the request again

Thread.Sleep (TimeSpan.FromMinutes (this.interval));

}

catch (Exception ex)

{

Console.WriteLine (ex.Message);

}

} while (true);

}

public ListView getListV () {

return this. lvwReceivedMessages;

}

public bool sendRequest ()

{

this.rep = true;

//Заполняем таблицу VLANs

oid = «1.

3.6.

1.4.

1.9.

9.46.

1.3.

1.1. 2″ ;

List vlans = new List ();

walk = new SnmpWalk ();

try

{

vlans = walk. GetOidList (communityString, ipAddress, oid);

}

catch (SnmpException ex)

{

Console.WriteLine (string.Format («An exception of type {0} has been generated. The error message generated in {1}» ,

ex.GetType (),

ex.Message));

this.rep = false;

return this. rep;

}

catch (Exception ex)

{

Console.WriteLine (ex.Message);

this.rep = false;

return this. rep;

}

/*finally

{

return this. rep;

}*/

List intVlan = new List ();

// Cохранить все порты, которые принадлежат VLAN 1

foreach (string s in vlans)

{

string nvlan = s. Substring (oid.Length + 3);

nvlan = nvlan. Substring (0, nvlan. IndexOf ('*') — 1);

int i = Convert. ToInt32(nvlan);

if (i ≠ 1002 && i ≠ 1003 && i ≠ 1004 && i ≠ 1005)

{

intVlan.Add (i);

}

}

foreach (int i in intVlan)

{

string cmnt =

string.Format («{0}@{1}», communityString, i);

//Заподняем d1

oid = «1.

3.6.

1.2.

1.17.

4.3.

1.1″ ;

Dictionary d11 = new Dictionary ();

d11 = GetD1(cmnt, ipAddress, oid);

//Заполняем d2

oid = «1.

3.6.

1.2.

1.17.

4.3.

1.2″ ;

Dictionary d22 = new Dictionary ();

d22 = GetD2(cmnt, ipAddress, oid);

//Заполняем d4

oid = «1.

3.6.

1.2.

1.17.

1.4.

1.2″ ;

Dictionary d44 = new Dictionary ();

d44 = GetD4(cmnt, ipAddress, oid);

//Заполняем d6

oid = «1.

3.6.

1.2.

1.31.

1.1.

1.1″ ;

Dictionary d66 = new Dictionary ();

d66 = GetD6(cmnt, ipAddress, oid);

//Заполняем d3

Dictionary d33 = new Dictionary ();

d33 = GetD3(d11, d22);

//Заполняем d5

Dictionary d55 = new Dictionary ();

d55 = GetD5(d33, d44);

//Заполняем d7

Dictionary d77 = new Dictionary ();

d77 = GetD7(d55, d66);

// Соединить MAC-адреса к порту, на котором был прочитан адрес

foreach (KeyValuePair pair in d77)

{

dbConnection.updateTable (this.ipAddress, pair. Key, pair. Value, DateTime.Now.ToString ());

}

}

return this. rep;

}

public Dictionary GetD1(string community, string ip, string oid)

{

Dictionary retDict = new Dictionary ();

List mac = new List ();

try

{

// Сохранить список всех MAC адресов, которые были извлечены на все порты, которые принадлежат VLAN 1

mac = walk. GetOidList (community, ip, oid);

}

catch (SnmpException e)

{

MessageBox.Show («Can not get MAC Address for Ip address :» + this. ipAddress, «error», MessageBoxButtons. OK, MessageBoxIcon. Exclamation);

return retDict;

}

Dictionary d1 = new Dictionary ();

foreach (string s in mac)

{

string key = s. Substring (23);

key = key. Substring (0, key. IndexOf ('*') — 1);

string val = s. Substring (s.IndexOf ('*') + 2);

try

{

// Определяем МАС адрес:

d1.Add (key, val);

}

catch (ArgumentException e)

{

MessageBox.Show («Error cocured during the request «, «error», MessageBoxButtons. OK, MessageBoxIcon. Exclamation);

return retDict;

}

}

return d1;

}

public Dictionary GetD2(string community, string ip, string oid)

{

Dictionary retDict = new Dictionary ();

List ports = new List ();

try

{

// Cохранить порты для VLAN 1

ports = walk. GetOidList (community, ip, oid);

}

catch (SnmpException e)

{

MessageBox.Show («Can not get port for Ip address :» + this. ipAddress, «error», MessageBoxButtons. OK, MessageBoxIcon. Exclamation);

return retDict;

}

Dictionary d2 = new Dictionary ();

foreach (string s in ports)

// определяем порт который относится к MAC адресу string key = s. Substring (23);

key = key. Substring (0, key. IndexOf ('*') — 1);

string val = s. Substring (s.IndexOf ('*') + 2);

d2.Add (key, val);

}

return d2;

}

public Dictionary GetD3(Dictionary dx, Dictionary dy)

{

Dictionary dz = new Dictionary ();

foreach (KeyValuePair pair in dx)

{

string key = pair. Key;

if (dy.ContainsKey (key))

dz.Add (dx[key], dy[key]);

}

return dz;

}

public Dictionary GetD5(Dictionary dx, Dictionary dy)

{

Dictionary dz = new Dictionary ();

foreach (KeyValuePair pair in dx)

{

string val = pair. Value;

if (dy.ContainsKey (val))

{

dz.Add (pair.Key, dy[val]);

}

}

return dz;

}

public Dictionary GetD4(string community, string ip, string oid)

{

Dictionary retDict = new Dictionary ();

List ifindex = new List ();

try

{

// Используем walk для того, чтобы соотнести ifIndex значение с правильным названием порта.

ifindex = walk. GetOidList (community, ip, oid);

}

catch (SnmpException e)

{

return retDict;

}

Dictionary d4 = new Dictionary ();

foreach (string s in ifindex)

{

string key = s. Substring (oid.Length + 1);

key = key. Substring (0, key. IndexOf ('*') — 1);

string val = s. Substring (s.IndexOf ('*') + 2);

d4.Add (key, val);

}

return d4;

}

public Dictionary GetD6(string community, string ip, string oid)

{

Dictionary retDict = new Dictionary ();

List ifname = new List ();

try

{.

//Используем команду walk с ifName для того, чтобы соотнести ifIndex значение с правильным названием порта.

ifname = walk. GetOidList (community, ip, oid);

}

catch (SnmpException e)

{

return retDict;

}

Dictionary d6 = new Dictionary ();

//С известного порта определяем номер ifIndex

foreach (string s in ifname)

{

string key = s. Substring (oid.Length + 1);

key = key. Substring (0, key. IndexOf ('*') — 1);

string val = s. Substring (s.IndexOf ('*') + 2);

d6.Add (key, val);

}

return d6;

}

private Dictionary GetD7(Dictionary dx, Dictionary dy)

{

// С известного ifIndex мы определяем соответствующий порт Fast Ethernet:

Dictionary dz = new Dictionary ();

foreach (KeyValuePair pair in dx)

{

string val = pair. Value;

if (dy.ContainsKey (val))

{

dz.Add (pair.Key, dy[val]);

}

}

return dz;

}

file snmpwalk. cs

using System;

using System. Collections;

using System.Net;

using System.Collections.Generic;

using SnmpSharpNet;

namespace Myproject

{

class SnmpWalk

{

public SnmpWalk ()

{

}

public List GetOidList (string strCommunity, string strIP, string strOid)

{

List res = new List ();

OctetString community = new OctetString (strCommunity);

AgentParameters param = new AgentParameters (community);

param.Version = SnmpVersion. Ver1;

IpAddress agent = new IpAddress (strIP);

UdpTarget target = new UdpTarget ((IPAddress)agent, 161, 2000, 1);

Oid rootOid = new Oid (strOid);

// This Oid represents last Oid returned by

// the SNMP agent

Oid lastOid = (Oid)rootOid.Clone ();

// Pdu class used for all requests

Pdu pdu = new Pdu (PduType.GetNext);

// Loop through results

while (lastOid ≠ null)

{

// When Pdu class is first constructed, RequestId is set to 0

// and during encoding id will be set to the random value

// for subsequent requests, id will be set to a value that

// needs to be incremented to have unique request ids for each

// packet

if (pdu.RequestId ≠ 0)

{

pdu.RequestId += 1;

}

// Clear Oids from the Pdu class.

pdu.VbList.Clear ();

// Initialize request PDU with the last retrieved Oid

pdu.VbList.Add (lastOid);

// Make SNMP request

SnmpV1Packet result = (SnmpV1Packet)target.Request (pdu, param);

// You should catch exceptions in the Request if using in real application.

// If result is null then agent didn’t reply or we couldn’t parse the reply.

if (result ≠ null)

{

// ErrorStatus other then 0 is an error returned by

// the Agent — see SnmpConstants for error definitions

if (result.Pdu.ErrorStatus ≠ 0)

{

// agent reported an error with the request

Console.WriteLine («Error in SNMP reply. Error {0} index {1}» ,

result.Pdu.ErrorStatus,

result.Pdu.ErrorIndex);

lastOid = null;

break;

}

else

{

// Walk through returned variable bindings

foreach (Vb v in result.Pdu.VbList)

{

// Check that retrieved Oid is «child» of the root OID

if (rootOid.IsRootOf (v.Oid))

{

//Console.WriteLine («{0} ({1}): {2}» ,

// v.Oid.ToString (),

// SnmpConstants. GetTypeName (v.Value.Type),

// v.Value.ToString ());

res.Add (v.Oid.ToString () + «* «+ v.Value.ToString ());

lastOid = v. Oid;

}

else

{

// we have reached the end of the requested

// MIB tree. Set lastOid to null and exit loop

lastOid = null;

}

}

}

}

else

{

Console.WriteLine («No response received from SNMP agent.»);

}

}

target.Close ();

return res;

}

}

}

Глава 4 Анализ результатов После запуска программы пользователь видит главное окно программы.

Рисунок 4 — главное окно программы

Manager statusпоказывает статус менеджера

Manager closed — нет отправлений запросов к коммутатору.

Для запуски отправления запросов нужно нажать на кнопку «Start Manager»

AgentsВ состав управляемой системы входит компонент, называемый агентом, который отправляет отчёты управляющей системе. По существу SNMP агенты передают управленческую информацию на управляющие системы как переменные (такие как «свободная память», «имя системы», «количество работающих процессов»

В списке агентов есть 10.

200.

228.58 и 10.

200 229.

225.

Add Agent to List — Добавить агент в списки

Рисунок 5 — Окно добавления устройства

Device list — список устройства (Управление коммутаторов), т. е добавление удаление коммутаторов, т. е.IP адрес с интервалом времени;

Рисунок 6- Добавление устройства Рисунок 7-Устройство добавлено.

Рисунок 9. Удаление устройства Как показано на рисунке 9, для удаления устройства сначала выбирается устройство, а потом нажимается кнопку «Delete device».

Рисунок 10. запуск менеджера (отправление запросов) Для запуска нажать на кнопку «Start Manager», после чего начинается отправление запросов на устройства c IP адрес 10.

200.

228.128

Broadcast Message показывает интерфейс для логов и отображает списки коммутаторов, которые опрашиваются, т. е Broadcast Message выводит информацию, как происходит отправление запросов и ответы на них, а также коммутаторы, которые опрошены удачно, IP адрес и время, тип запроса (отравление, ответ) и SNMP версии.

Рисунок 11. Информация о полученных MAC адресах и портах после отправления запроса по IP адресу 10.

200.

228.128

Рис. 12. Конфигурация базы данных Имя хоста (сервера), на котором размещена база данных Microsoft SQL Server

имя базы данных Показывает имя базы данных, к которой устанавливается подключение. Чтобы использовать новую базу данных.

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

Password

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

Настройки подключения к базе данных .

«Get Table» — кнопка, после нажатия на которую данные полученные от коммутатора, записываются в Б. Д Струтура БД для сохранения информации в БД Таблица Device

deviceId int , — Идентификатор устройсва

IP_ADDRESS char (17) — IP адрес устройсва

Community char (17), — Community строка

Interval int — Интервал времени по корому будет происходить отправление запросов

Таблица Information

DEVICEID int — Идентификатро устройства

IP_ADDRESS char (17) -IP адрес устройсва

MAC_ADDRESS char (17), — MAC адресс найден после отправления запроса которму соотвествует данному порту

PORT char (17), -Порт найден после отправления запроса

TIME_REQUEST DATETIME — время по корому было сделан запрос Создание БД.

CREATE TABLE INFORMATIONS (//Таблица для сохранения полученных информация

id int

IDENTITY (1,1)

PRIMARY KEY CLUSTERED,

device_id int NOT NULL REFERENCES DEVICE (id),

ip_address varchar (20) NOT NULL,

port varchar (50) ,

mac_address varchar (50) ,

time_request DATETIME NOT NULL

)

CREATE TABLE DEVICE // Таблица устройств

(

id smallint

IDENTITY (1,1)

PRIMARY KEY CLUSTERED,

ip_address_device varchar (20) NOT NULL,

interval_time_request int NOT NULL

)

Структура всех классов приведена на рис. 13.

Рис. 13. Структура классов БД

Заключение

В локальных сетях часто возникает проблема распределения адресов. Многие люди пытаются получить неправильные или просто понравившиеся адреса. Если эти адреса в данное время не заняты (компьютеры-владельцы выключены), то им это удается, и настоящий владелец не может получить свой адрес. Таким образом, могут пострадать многие сетевые сервисы, так как адресация происходит именно по IP. Большинство брандмауэров также работает на уровне IP адресов, то есть произойдет подмена компьютеров, и защитные правила не будут работать для конкретной машины.

Основным резальтатом работы является создание программного обеспечения, которое осуществляет поиск хоста по MAC адресу. Созданную программу можно использовать для работы в локальной сети предприятия.

Список использованной литературы Троелсен Э. C# и платформа .NET. Библиотека программиста. — Спб.: Питер, 2002.

Оньон Ф. Основы ASP.NET с примерами на C#. — М.: Вильямс, 2003.

Волоха А.В. Microsoft SQL Server 2005

Новые возможности. — Спб.: Питер, 2006.

Митчелл С., Уолтер С., Севен Д. ASP.NET: советы, рекомендации, примеры. — М.: Вильямс, 2002.

Уилтон П. JavaScript. Основы. — Спб.: Символ-Плюс, 2002.

Сеппа Д. Microsoft ADO.NET. — М.: Русская редакция, 2003.

Ши Д., Хольцшлаг М. Философия CSS-дизайна. — М.: НТ Пресс, 2005.

Матросов А., Сергеев А., Чаунин М. HTML 4.0 в подлиннике. — Спб.: BHV-Петербург, 2005.

Электроные ресурсы

Lubarsky A. Сложные графики и диаграммы в ASP.NET. Часть третья — HttpHandler/System.Drawing.

http://aspnetmania.com/Articles/Article/42.html

Прохоров M. Сложные графики и диаграммы в ASP.NET. Часть четвёртая — ChartSpace.

http://aspnetmania.com/Articles/Article/55.html

Веденин В. Работа с Crystal Report.NET.

http://www.gotdotnet.ru/LearnDotNet/ NETFramework/85 842.aspx

Добсон Р. Азы Reporting Services. Windows IT Pro #08/2005 (

http://www.osp.ru/win 2000/2005/08/380 209/)

Temnov O. Обработка ошибок в ASP.NET приложении.

http://dotsite.ru/Publications/ Publication 152. aspx

Uvarov D. ASP.NET WebHandlers, или что такое .ashx файлы.

http://dotsite.ru/ Publications/Publication150.aspx

Jenihov E. Частичная проверка правильности ввода данных.

http://dotsite.ru/ Publications/Publication153.aspx

Митчелл С. Понимание состояния отображения ASP.NET.

http://www.Ruemind ru/Text.aspx?ArticleId=385

Franke D. An Introduction to Microsoft SQL Server 2000 Reporting Services.

http://aspnet 4guysfromrolla.com/articles/31 605−1.aspx

Siddiqui M. A. HTTP Handlers and HTTP Modules in ASP.NET.

http://www.5seconds com/issue/20 417.htm

Mitchell S. Dynamic Controls in ASP.NET.

http://aspnet.4guysfromrolla.om/articles 81 402−1.aspx

Mitchell S. Dynamic Web Controls, Postbacks, and View State.

http://aspnet.4guysfromrolla. om/articles/92 904−1.aspx

Начало

I = 0

I <= N NNN55gggggggnnndgnn NNNNNNNNNhNN NN

I = I +1

host = TableIP[i]

com = communityname

OID = .

1.3.

6.1.

4.1.

9.9.

46.1.

3.1.

1.2

snmpwalkc com host OID

Вывод MAC Address

Вывод Port

T = 0

T <= 300

T = T+1

Insert into macTable (id, MAcAdress, port, time_send)

Показать весь текст

Список литературы

  1. Троелсен Э. C# и платформа .NET. Библиотека программиста. — Спб.: Питер, 2002.
  2. Ф. Основы ASP.NET с примерами на C#. — М.: Вильямс, 2003.
  3. Волоха А.В. Microsoft SQL Server 2005. Новые возможности. — Спб.: Питер, 2006.
  4. С., Уолтер С., Севен Д. ASP.NET: советы, рекомендации, примеры. — М.: Вильямс, 2002.
  5. Уилтон П. JavaScript. Основы. — Спб.: Символ-Плюс, 2002.
  6. Сеппа Д. Microsoft ADO.NET. — М.: Русская редакция, 2003.
  7. Ши Д., Хольцшлаг М. Философия CSS-дизайна. — М.: НТ Пресс, 2005.
  8. А., Сергеев А., Чаунин М. HTML 4.0 в подлиннике. — Спб.: BHV-Петербург, 2005.
  9. Электроные ресурсы
  10. A. Сложные графики и диаграммы в ASP.NET. Часть третья — HttpHandler/System.Drawing. http://aspnetmania.com/Articles/Article/42.html
  11. M. Сложные графики и диаграммы в ASP.NET. Часть четвёртая — ChartSpace. http://aspnetmania.com/Articles/Article/55.html
  12. В. Работа с Crystal Report.NET. http://www.gotdotnet.ru/LearnDotNet/ NETFramework/85 842.aspx
  13. Р. Азы Reporting Services. Windows IT Pro #08/2005 (http://www.osp.ru/win 2000/2005/08/380 209/)
  14. O. Обработка ошибок в ASP.NET приложении. http://dotsite.ru/Publications/ Publication 152. aspx
  15. Uvarov D. ASP.NET WebHandlers, или что такое .ashx файлы. http://dotsite.ru/ Publications/Publication150.aspx
  16. E. Частичная проверка правильности ввода данных. http://dotsite.ru/ Publications/Publication153.aspx
  17. С. Понимание состояния отображения ASP.NET. http://www.Ruemind ru/Text.aspx?ArticleId=385
  18. Franke D. An Introduction to Microsoft SQL Server 2000 Reporting Services. http://aspnet 4guysfromrolla.com/articles/31 605−1.aspx
  19. Siddiqui M. A. HTTP Handlers and HTTP Modules in ASP.NET. http://www.5seconds com/issue/20 417.htm
  20. Mitchell S. Dynamic Controls in ASP.NET. http://aspnet.4guysfromrolla.om/articles 81 402−1.aspx
  21. Mitchell S. Dynamic Web Controls, Postbacks, and View State. http://aspnet.4guysfromrolla. om/articles/92 904−1.aspx
Заполнить форму текущей работой
Купить готовую работу

ИЛИ