WCF Ria Services(通常称为RIA服务),专门设计让Silverlight应用程序访问数据库,网上有关其示例应用都是基于简单的数据显示,其中MSDN网站上有详细的解决方案介绍,地址http://msdn.microsoft.com/zh-cn/library/ff713719(v=vs.91).aspx,我认为把这个看懂后,你基本上就入门了。

但是由于项目需要,我要把SQL SERVER数据库中以二进制流保存的图片显示到客户端浏览器里,在网上找了很久的资料,都没找到相关的介绍,最后花了不少功夫,终于实现了功能。先看其效果如下:

在数据库中,我们建了一个ImageTable数据库,两列数据ImageId(int)和ImageData(varbinary(MAX)),然后通过下面命令插入初始数据和图片

Use ImageDB;
Go
INSERT INTO ImageTable VALUES (1,(SELECT * FROM OPENROWSET(BULK N'D:\DEC.jpg',SINGLE_BLOB) AS Photo))

  然后新建一个silverlght业务应用程序,添加一个显示此图片的silverlight页,ADO.NET实体数据模型和域服务类,过程可参考前面给出的例子,这里主要说明如何把图片显示出来。

 <navigation:Page xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"  x:Class="ImageTestApp.Views.WorkerImage"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            mc:Ignorable="d"
            xmlns:local="clr-namespace:ImageTestApp.Views"
            xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
            d:DesignWidth="
            Title="WorkerImage Page">
     <navigation:Page.Resources>
         <local:DataToImageConverter x:Key="DataToImageConverter"></local:DataToImageConverter>
     </navigation:Page.Resources>
     <Grid x:Name="LayoutRoot">
         <ScrollViewer x:Name="PageScrollViewer" Style="{StaticResource
   PageScrollViewerStyle}" >
             <StackPanel x:Name="ContentStackPanel" Style="{StaticResource ContentStackPanelStyle}">

                 <TextBlock Text="图片" Style="{StaticResource HeaderTextStyle}"/>
                 <sdk:DataGrid AutoGenerateColumns=">

                     <sdk:DataGrid.Columns>
                         <sdk:DataGridTextColumn Header="序号" Binding="{Binding ImageId}" />
                         <sdk:DataGridTemplateColumn Header="图片" CanUserResize="False" >
                             <sdk:DataGridTemplateColumn.CellTemplate>
                                 <DataTemplate>
                                     <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
                                         <!--<TextBox x:Name="imgLogo" Text="{Binding Path=ImageData}" >
                                         </TextBox>-->
                                         <Image x:Name=" Source="{Binding Path=ImageData,Converter={StaticResource DataToImageConverter}}" >
                                         </Image>
                                     </StackPanel>
                                 </DataTemplate>
                             </sdk:DataGridTemplateColumn.CellTemplate>
                         </sdk:DataGridTemplateColumn>
                     </sdk:DataGrid.Columns>

                 </sdk:DataGrid>

             </StackPanel>
         </ScrollViewer>
     </Grid>
 </navigation:Page>

注意,我们在datagrid前两行定义了两列,序号和图片,由于ImageData是二进制流,无法在图片控件上直接显示,所以图片显示一栏还需要个转化器,下面是后台代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;

using System.Windows.Data;
using System.Windows.Media.Imaging;
using System.IO;
using System.Text;

using ImageTestApp.Web;
using System.ServiceModel.DomainServices.Client;

namespace ImageTestApp.Views
{
    public partial class WorkerImage : Page
    {
        OrganizationContext _OrganizationContext = new OrganizationContext();
        public WorkerImage()
        {
            InitializeComponent();

            this.dataGrid1.ItemsSource = _OrganizationContext.ImageTables;
            _OrganizationContext.Load(_OrganizationContext.GetImageTableQuery());

        }

    }

    public class DataToImageConverter : IValueConverter
    {

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {

            BitmapImage bi = new BitmapImage();
            bi.SetSource(new MemoryStream((byte[])value));
            Image image = new Image();
            image.Source = bi;
            return bi;  

            //Image image = new Image();
            //image.Source = bi;
            //    return image;

        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

    }
}

由于界面里用的Image控件绑定图片,所以刚开始在转换器里需要返回Image类型数据,但实际上此方法行不通,最后看了Image.Source属性才知道应该返回BitmapImage类型,下面是Image的用法:

<Image Width="200"  Margin="5" Grid.Column="1" Grid.Row="1" >
   <Image.Source>
      <BitmapImage UriSource="sampleImages/bananas.jpg" />
   </Image.Source>
</Image>

通过此转换器,我们就能将接收到的二进制流转换为图片。如果不通过转换,直接利用datagrid的自动显示功能,图片一栏将显示System.Byte[],让人搞不清楚。此项目还需要完成图片上传功能,后面再加上。

其实在调试过程中,我还有点不明白的是   dataGrid1.ItemsSource 一直看不到接收到的数据,但是客户浏览器里确实已经有了已经有了数据库中的每一项列表。

  

Silverlight应用程序中调用WCF Ria Services访问数据库图片的更多相关文章

  1. Silverlight项目笔记1:UI控件与布局、MVVM、数据绑定、await/async、Linq查询、WCF RIA Services、序列化、委托与事件

    最近从技术支持转到开发岗,做Silverlight部分的开发,用的Prism+MVVM,框架由同事搭好,目前做的主要是功能实现,用到了一些东西,侧重于如何使用,总结如下 1.UI控件与布局 常用的主要 ...

  2. Silverlight项目笔记2:.svc处理程序映射缺失导致的WCF RIA Services异常

    在确定代码.编译结果和数据库都正常的情况下,无法从数据库取到数据.错误提示:Sysyem.Net.WebException:远程服务器返回了错误:NotFound,监听发现请求数据库的服务异常,访问相 ...

  3. WCF RIA Services异常

    .svc处理程序映射缺失导致的WCF RIA Services异常 在确定代码.编译结果和数据库都正常的情况下,无法从数据库取到数据.错误提示:Sysyem.Net.WebException:远程服务 ...

  4. WCF RIA Services使用详解(转载)

    理解领域服务和领域操作 本文目录: 3.1 WCF Ria Services简介 3.1.1 什么是WCF Ria Services 3.1.2 WCF Ria Services如何生成客户端代码 3 ...

  5. Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)

    文章目录:                   1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Ap ...

  6. Consuming Hidden WCF RIA Services

    原文 http://codeseekah.com/2013/07/05/consuming-hidden-wcf-ria-services/ A Silverlight application mad ...

  7. iPhone中调用WCF服务

    本文介绍的是跨平台iPhone中调用WCF服务,WCF是由微软发展的一组数据通信的应用程序开发接口,它是.NET框架的一部分,由 .NET Framework 3.0+开始引入 iPhone中调用WC ...

  8. C++程序中调用WebService的实现

    前言 因为最近的项目中需要运用到在MFC程序中调用WebService里面集成好了的函数,所以特意花了一天的时间来研究WebService的构建以及如何在MFC的程序中添加Web引用,进而来实现在C+ ...

  9. 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案

    方案特点: 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案,简化软件开发流程,减少各应用系统相同模块的重复开发工作,提高系统稳定性和可靠性. 基于HTTP协议的开发接口 使用特点在网页 ...

随机推荐

  1. QSqlQueryModel的实例操作

    QSqlQueryModel类为SQL的结果集提供了一个只读的数据模型,下面我们先利用这个类进行一个最简单的操作. 我们新建Qt4 Gui Application工程,我这里工程名为queryMode ...

  2. JavaScript标准Selection操作

    简介 术语 属性 方法 document.activeElement document.designMode = 'on'; 简介 selection是对当前激活选中区(即高亮文本)进行操作. 在非I ...

  3. linux文件夹操作(及模糊搜索)

    mkdir   文件夹名称    :创建文件夹 touch  文件名称       : 创建文件 给文件夹或文件授权 chmod -R 777 文件夹名称   : 递归给文件夹授读写执行权限 chmo ...

  4. mvn打包

    mvn install -DskipTests mvn install -Dmaven.test.skip=true

  5. SVN理解

    先说说什么是branch.按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图: branch存在的意义在于,在不干扰t ...

  6. Hibernate学习笔记--------2.一多|多多的CRUD

    一.一多关系 例如用户(Tb_User)和订单(Tb_Order)之间,一个用户对应了多个订单,多个订单对应一个用户. 除了基本的配置外,需要在用户类(单方)中添加订单的集合同样需要get/set方法 ...

  7. linux语言环境设置

    查看linux的支持的语言集合 执行locale命令 LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh LC_CTYPE="zh_CN.UTF-8" LC_NU ...

  8. Matlab plotyy函数的使用及问题总结

    MATLAB函数,用来绘制双纵坐标图. 调用格式: 1.plotyy(X1,Y1,X2,Y2):以左.右不同纵轴绘制X1-Y1.X2-Y2两条曲线. 2.plotyy(X1,Y1,X2,Y2,FUN1 ...

  9. vagrant yii2 Exception 'yii\db\Exception' with message 'SQLSTATE[HY000] [2002]

    开发环境:vangrant + LAMP 安装了yii2 advanced版本之后,通过url访问fornted 报数据库user表不存在,看了安装yii2 advanced的教程,里面说需要需要运行 ...

  10. Json-lib - java.util.Date 转换问题

    使用 JSON-lib 将 java.util.Date 对象直接转换成 JSON 字符串时,得到的通常不是想要格式: System.out.println(JSONSerializer.toJSON ...