Симон Робинсон - C# для профессионалов. Том II
- Название:C# для профессионалов. Том II
- Автор:
- Жанр:
- Издательство:Лори
- Год:2003
- Город:Москва
- ISBN:5-85582-187-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Симон Робинсон - C# для профессионалов. Том II краткое содержание
Платформа .NET предлагает новую среду, в которой можно разрабатывать практически любое приложение, действующее под управлением Windows, а язык C# — новый язык программирования, созданный специально для работы с .NET.
В этой книге представлены все основные концепции языка C# и платформы .NET. Полностью описывается синтаксис C#, приводятся примеры построения различных типов приложений с использованием C# — создание приложений и служб Windows, приложений и служб WWW при помощи ASP.NET, а также элементов управления Windows и WWW Рассматриваются общие библиотеки классов .NET, в частности, доступ к данным с помощью ADO.NET и доступ к службе Active Directory с применением классов DirectoryServices.
Для кого предназначена эта книгаЭта книга предназначена для опытных разработчиков, возможно, имеющих опыт программирования на VB, C++ или Java, но не использовавших ранее в своей работе язык C# и платформу .NET. Программистам, применяющим современные технологии, книга даст полное представление о том, как писать программы на C# для платформы .NET.
Основные темы книги• Все особенности языка C#
• C# и объектно-ориентированное программирование
• Приложения и службы Windows
• Создание web-страниц и web-служб с помощью ASP NET
• Сборки .NET
• Доступ к данным при помощи ADO NET
• Создание распределённых приложений с помощью NET Remoting
• Интеграция с COM, COM+ и службой Active Directory
C# для профессионалов. Том II - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Затем необходимо добавить к службе в Service1.asmx.cs
метод GetData()
:
[WebMethod]
public DataSet GetData() {
return (DataSet)Application["ds"];
}
Здесь для доступа к множеству данных используется тот же синтаксис, что и в Application_Load()
, где просто выполняется преобразование типа данных в правильный тип, а также возврат.
Метод AddEvent()
немного сложнее. Концептуально нам необходимо сделать следующее:
□ Получить данные события от клиента.
□ Создать инструкцию SQL INSERT
с помощью этих данных.
□ Соединиться с базой данных и выполнить инструкцию SQL.
□ Если добавление выполнится успешно, то обновить данные в Application["ds"]
.
□ Вернуть уведомление об успехе или отказе клиенту (мы оставляем клиенту возможность обновить его DataSet
, если потребуется).
Начиная сверху, принимаем все поля как строки:
[WebMethod]
public int AddEvent(String eventName, String eventRoom, String eventAttendees, String eventDate) {
}
Затем мы объявляем объекты, которые нужны для доступа к базе данных, соединяемся с базой данных и выполняем запрос, используя код аналогичный коду в PCSWebApp3
(здесь также требуется строка соединения, которая здесь не показана):
[WebMethod]
public int AddEvent(String eventName, String eventRoom, String eventAttendees, String eventDate) {
System.Data.OleDb.OleDbConnection oleDbConnection1;
System.Data.OleDb.OleDbDataAdapter dbEvents;
DataSet ds;
oleDbConnection1 = new System.Data.OleDb.OleDbConnection();
OleDbConnection1.ConnectionString = @" ... ";
String oleDbCommand =
"INSERT INTO Events (Name, Room, AttendeeList, " +
" EventDate) VALUES ('" + eventName + "', +
eventRoom + "', '" + eventAttendees + "', '" + eventDate + "')";
System.Data.OleDb.OleDbCommand insertCommand =
new System.Data.OleDb.OleDbCommand(oleDbCommand, oleDbConnection1);
oleDbConnection1.Open();
queryResult = insertCommand.ExecuteNonQuery();
}
Используем, как и прежде, queryResult
для хранения числа строк, затронутых запросом. Мы можем проверить его, чтобы оценить наш успех. Если все происходит хорошо, выполняется новый запрос на базе данных для обновления таблицы Events
в нашем DataSet
. Жизненно важно блокировать данные приложения во время выполнения обновлений, чтобы гарантировать, что никакие другие потоки выполнения не могут получить доступ к Application["ds"]
во время его обновления. Это можно сделать с помощью методов Lock()
и UnLock()
объекта Application
:
[WebMethod]
public int AddEvent(String eventName, String eventRoom, String eventAttendees, String eventDate) {
...
int queryResult = insertCommand.ExecuteNonQuery();
if (queryResult == 1) {
daEvents =
new System.Data.OleDb.OleDbDataAdapter(
"SELECT * FROM Events", oleDbConnection1);
Application.Lock();
ds = (DataSet) Application["ds"];
ds.Tables["Events"].Clear();
daEvents.Fill(ds, "Events");
Application["ds"] = ds;
Application.UnLock();
oleDbConnection1.Close();
}
}
Наконец, мы возвращаем queryResult
, позволяя клиенту узнать, что запрос был успешным:
[WebMethod]
public int AddEvent(String eventName, String eventRoom, String eventAttendees, String eventDate) {
...
return queryResult;
}
Это завершает создание службы Web. Как и прежде, есть возможность протестировать эту службу, направляя браузер Web на файл .asmx
, поэтому мы можем добавить записи и взглянуть на представление XML для DataSet
, возвращаемое GetData()
, не создавая никакого клиентского кода.
Клиент приложения предварительного заказа помещения для проведения мероприятия
Используемый клиент является разработкой приложения Web PCSWebApp3
из предыдущей главы. Назовем это приложение PCSWebApp4
и воспользуемся кодом из PCSWebApp3
в качестве начальной точки.
Сделаем два существенных изменения в проекте. Первое: удалим все непосредственные обращения к базе данных из этого приложения и воспользуемся вместо этого службой Web. Второе: введем хранилище уровня приложения из DataSet
, возвращаемого из службы Web, которое обновляется только в случае необходимости, это значит, что на базу данных падает меньшая нагрузка.
Прежде всего в нашем новом приложении Web необходимо добавить ссылку Web на службу PCSWebSrv2/Service1.asmx
. Это можно сделать точно таким же образом, как мы видели ранее в этой главе, определяя местонахождение файла .vsdisco
и вызывая его eventDataService
.
После этого добавляем код в Global.asax
, по большей части, таким же образом, как это было сделано для службы Web. Этот код, однако, будет существенно проще. Сначала мы ссылаемся на службу Web и пространство имен System.Data
:
namespace PCSWebApp4 {
...
using System.Data;
using eventDataService;
Затем заполняем множество данных ( dataset
) и помещаем его в хранилище данных уровня приложения с именем ds
:
protected void Application_Start(Object sender, EventArgs e) {
Service1 dataService = new Service1();
DataSet ds = dataService.GetData();
Application["ds"] = ds;
}
Теперь DataSet
доступно для всех
экземпляров PCSWebApp4
, т.е. несколько пользователей могут читать данные без какого-либо обращения к службе Web, то есть к базе данных.
Теперь, когда имеется это DataSet
, необходимо изменить WebForm1.aspx.cs
для его использования. Прежде всего можно удалить объявления oleDbConnection1
, daAttendees
, daRooms
и daEvents
, так как не будет осуществляться никакого обращения к базе данных. Затем необходимо изменить Page_Load()
следующим образом:
private void Page_Load(object sender, System.EventArgs e) {
validationSummary.Enabled = false;
foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {
validator.Enabled = false;
}
ds = (DataSet)Application["ds"];
attendeeList.DataSource = ds.Tables["Attendees"];
roomList.DataSource = ds.Tables["Rooms"];
eventTable = ds.Tables["Events"];
eventDetails1.DataSource = eventTable; eventDetails2.DataSource = eventTable;
if (!this.IsPostBack) {
System.DateTime trialDate = System.DateTime.Now;
calendar.SelectedDate = getFreeDate(trialDate);
this.DataBind();
} else {
eventDetails1.DataBind();
eventDetails2.DataBind();
}
}
Большая часть кода остается без изменений, необходимо только использовать Application["ds"]
вместо получения DataSet
.
Необходимо также изменить submitButton_Click()
для использования метода AddData()
службы Web. В этом случае также большая часть кода остается без изменений:
protected void submitButton_Click(object sender, System.EventArgs e) {
foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {
validator.Enabled = true;
}
this.Validate();
if (this.IsValid) {
String attendees = "";
foreach (ListItem attendee in attendeeList.Items) {
if (attendee.Selected) {
attendees += attendee.Text + " (" + attendee.Value + "), ";
}
}
attendees += " and " + nameBox.Text;
String dateString = calendar.SelectedDate.Date.Date.ToShortDateString();
Service1 dataService = new Service1();
int queryResult =
dataService.AddEvent(eventBox.Text, roomList.SelectedItem.Value,
attendees, dateString);
if (queryResult == 1) {
Интервал:
Закладка: