Часто задаваемые вопросы по SilverLight - часть 2 - Работа с базой данных при помощи SilverLight
ОГЛАВЛЕНИЕ
Работа с базой данных при помощи SilverLight
Шаг 1: Создание сервиса и контракта с сервисом данных
Ниже приводится простая таблица заказчиков, имеющая 3 поля: ‘CustomerId’ -являющееся идентификационным столбцом, ‘CustomerCode’ -хранящее код заказчика, и ‘CustomerName’ - хранящее имя заказчика. Мы выполним простой запрос на выборку при помощи WCF и затем отобразим данные на сетке SilverLight.
| Поле | Тип данных |
| CustomerId | int (целый) |
| CustomerCode | nvarchar(50) |
| CustomerName | nvarchar(50) |
В соответствии с заданной выше таблицей заказчиков сначала необходимо определить контракт данных WCF. Ниже приведен контракт данных заказчика WCF.
[DataContract]
public class clsCustomer
{
private string _strCustomer;
private string _strCustomerCode;
[DataMember]
public string Customer
{
get { return _strCustomer; }
set { _strCustomer = value; }
}
[DataMember]
public string CustomerCode
{
get { return _strCustomerCode; }
set { _strCustomerCode = value; }
}
}
Также нужно определить контракт с сервисом WCF, который будет реализован конкретными классами WCF.
[ServiceContract]
public interface IServiceCustomer
{
[OperationContract]
clsCustomer getCustomer(int intCustomer);
}
Шаг 2: Программирование сервиса WCF
Теперь, после определения контракта данных и контракта сервиса, необходимо реализовать контракт сервиса. Мы реализовали функцию ‘getCustomer’, которая будет возвращать контракт данных ‘clsCustomer’. Функция ‘getCustomer’ устанавливает простое соединение с ADO.NET и извлекает информацию о заказчике при помощи SQL-запроса на выборку.
public class ServiceCustomer : IServiceCustomer
{
public clsCustomer getCustomer(int intCustomer)
{
SqlConnection objConnection = new SqlConnection();
DataSet ObjDataset = new DataSet();
SqlDataAdapter objAdapater = new SqlDataAdapter();
SqlCommand objCommand = new SqlCommand("Select * from Customer where CustomerId=" + intCustomer.ToString());
objConnection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnStr"].ToString();
objConnection.Open();
objCommand.Connection = objConnection;
objAdapater.SelectCommand = objCommand;
objAdapater.Fill(ObjDataset);
clsCustomer objCustomer = new clsCustomer();
objCustomer.CustomerCode = ObjDataset.Tables[0].Rows[0][0].ToString();
objCustomer.Customer = ObjDataset.Tables[0].Rows[0][1].ToString();
objConnection.Close();
return objCustomer;
}
}
Шаг 3: Копирование файлов CrossDomain.xml и ClientAccessPolicy.XML
Этот сервис WCF будет вызываться с внешнего домена, поэтому нужно активировать междоменную политику в WCF путем создания файлов ‘CrossDomain.xml’ и ‘ClientAccessPolicy.xml’. Ниже приводятся оба фрагмента кода. Первый фрагмент кода для междоменной политики, а второй для политики доступа клиентов.<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource include-subpaths="true" path="/"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
Шаг 4:- Замена связываний WCF на ‘basicHttpBinding’
Silverlight использует и генерирует сервер-посредник только для ‘basicHttpBinding’, поэтому необходимо изменить связывания конечной точки соответствующим образом.
<endpoint address="" binding="basicHttpBinding" contract="WCFDatabaseService.IServiceCustomer">
Шаг 5: Добавление ссылки на сервис
Необходимо использовать ссылку на сервис в приложении silverlight при помощи меню ‘Добавить ссылку на сервис’. Щелкните правой кнопкой мыши по проекту silverlight и выберите ‘Добавить ссылку на сервис’.
Шаг 6: Задание сетки для имени заказчика и кода заказчика
Теперь на стороне silverlight будет создана ‘сетка’, имеющая два столбца: один для ‘кода заказчика’, а другой для ‘имени заказчика’. Также были заданы связывания при помощи ‘Пути связывания’ в текстовом поле.
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="20"></RowDefinition>
<RowDefinition Height="20"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock x:Name="LblCustomerCode" Grid.Column="0" Grid.Row="0" Text="Customer Code"></TextBlock>
<TextBlock x:Name="TxtCustomerCode" Grid.Column="1" Grid.Row="0" Text="{Binding Path=CustomerCode}"></TextBlock>
<TextBlock x:Name="LblCustomerName" Grid.Column="0" Grid.Row="1" Text="Customer Name"></TextBlock>
<TextBlock x:Name="TxtCustomerName" Grid.Column="1" Grid.Row="1" Text="{Binding Path=Customer}"></TextBlock>
</Grid>
Шаг 7: Связывание сервиса WCF с сеткой
Теперь сетка создана, и нужно связать сервис WCF с сеткой. Поэтому заново изучите код файла XAML и создайте объект сервиса WCF. Нужно учитывать две важные вещи при вызове сервиса WCF через SilverLight: (-)
- Необходимо вызывать WCF асинхронно, поэтому вызывается ‘getCustomerAsynch’. Учтите, что эта функция создается сервисом WCF для выполнения асинхронных вызовов метода / функции.
- Как только функция завершает свою работу с сервисом WCF, она отправляет сообщение обратно клиенту silverlight. Поэтому необходимо иметь какой-то вид метода-делегата, который может облегчить это взаимодействие. Был создан метод ‘getCustomerCompleted’, который захватывает аргументы и связывает результаты с сеткой ‘datacontext (контекст данных)’.
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
ServiceCustomerClient obj = new ServiceCustomerClient();
obj.getCustomerCompleted += new EventHandler<getCustomerCompletedEventArgs>(DisplayResults);
obj.getCustomerAsync(1);
}
void DisplayResults(object sender, getCustomerCompletedEventArgs e)
{
LayoutRoot.DataContext = e.Result;
}
}
Теперь вы можете запустить проект и увидеть, как клиент silverlight использует и отображает данные.
