Silverlight应用程序中调用WCF Ria Services访问数据库图片
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访问数据库图片的更多相关文章
- Silverlight项目笔记1:UI控件与布局、MVVM、数据绑定、await/async、Linq查询、WCF RIA Services、序列化、委托与事件
最近从技术支持转到开发岗,做Silverlight部分的开发,用的Prism+MVVM,框架由同事搭好,目前做的主要是功能实现,用到了一些东西,侧重于如何使用,总结如下 1.UI控件与布局 常用的主要 ...
- Silverlight项目笔记2:.svc处理程序映射缺失导致的WCF RIA Services异常
在确定代码.编译结果和数据库都正常的情况下,无法从数据库取到数据.错误提示:Sysyem.Net.WebException:远程服务器返回了错误:NotFound,监听发现请求数据库的服务异常,访问相 ...
- WCF RIA Services异常
.svc处理程序映射缺失导致的WCF RIA Services异常 在确定代码.编译结果和数据库都正常的情况下,无法从数据库取到数据.错误提示:Sysyem.Net.WebException:远程服务 ...
- WCF RIA Services使用详解(转载)
理解领域服务和领域操作 本文目录: 3.1 WCF Ria Services简介 3.1.1 什么是WCF Ria Services 3.1.2 WCF Ria Services如何生成客户端代码 3 ...
- Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)
文章目录: 1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Ap ...
- Consuming Hidden WCF RIA Services
原文 http://codeseekah.com/2013/07/05/consuming-hidden-wcf-ria-services/ A Silverlight application mad ...
- iPhone中调用WCF服务
本文介绍的是跨平台iPhone中调用WCF服务,WCF是由微软发展的一组数据通信的应用程序开发接口,它是.NET框架的一部分,由 .NET Framework 3.0+开始引入 iPhone中调用WC ...
- C++程序中调用WebService的实现
前言 因为最近的项目中需要运用到在MFC程序中调用WebService里面集成好了的函数,所以特意花了一天的时间来研究WebService的构建以及如何在MFC的程序中添加Web引用,进而来实现在C+ ...
- 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案
方案特点: 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案,简化软件开发流程,减少各应用系统相同模块的重复开发工作,提高系统稳定性和可靠性. 基于HTTP协议的开发接口 使用特点在网页 ...
随机推荐
- QSqlQueryModel的实例操作
QSqlQueryModel类为SQL的结果集提供了一个只读的数据模型,下面我们先利用这个类进行一个最简单的操作. 我们新建Qt4 Gui Application工程,我这里工程名为queryMode ...
- JavaScript标准Selection操作
简介 术语 属性 方法 document.activeElement document.designMode = 'on'; 简介 selection是对当前激活选中区(即高亮文本)进行操作. 在非I ...
- linux文件夹操作(及模糊搜索)
mkdir 文件夹名称 :创建文件夹 touch 文件名称 : 创建文件 给文件夹或文件授权 chmod -R 777 文件夹名称 : 递归给文件夹授读写执行权限 chmo ...
- mvn打包
mvn install -DskipTests mvn install -Dmaven.test.skip=true
- SVN理解
先说说什么是branch.按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图: branch存在的意义在于,在不干扰t ...
- Hibernate学习笔记--------2.一多|多多的CRUD
一.一多关系 例如用户(Tb_User)和订单(Tb_Order)之间,一个用户对应了多个订单,多个订单对应一个用户. 除了基本的配置外,需要在用户类(单方)中添加订单的集合同样需要get/set方法 ...
- linux语言环境设置
查看linux的支持的语言集合 执行locale命令 LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh LC_CTYPE="zh_CN.UTF-8" LC_NU ...
- Matlab plotyy函数的使用及问题总结
MATLAB函数,用来绘制双纵坐标图. 调用格式: 1.plotyy(X1,Y1,X2,Y2):以左.右不同纵轴绘制X1-Y1.X2-Y2两条曲线. 2.plotyy(X1,Y1,X2,Y2,FUN1 ...
- vagrant yii2 Exception 'yii\db\Exception' with message 'SQLSTATE[HY000] [2002]
开发环境:vangrant + LAMP 安装了yii2 advanced版本之后,通过url访问fornted 报数据库user表不存在,看了安装yii2 advanced的教程,里面说需要需要运行 ...
- Json-lib - java.util.Date 转换问题
使用 JSON-lib 将 java.util.Date 对象直接转换成 JSON 字符串时,得到的通常不是想要格式: System.out.println(JSONSerializer.toJSON ...