Часто задаваемые вопросы по 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 использует и отображает данные.

 ·         Скачать исходный код - 2.7 MB