博客园  :: 新随笔  :: 管理

数据访问

Posted on 2011-01-24 16:21  slwf7man  阅读(177)  评论(0)    收藏  举报

 

 

 

主要是实现WCF框架下,通过LINQ TO SQL,实现服务器端和客户端之间的通信

1,新建一个项目,命名为DataGrid,给网站固定服务端口号,这里以49806为例

2,添加WCF服务,命名为contacter,完成后网站目录下出现contacter.svc与Icontacter.cs文件

    注:如果跨域需要添加跨域文件cilentaccesspolicy.xml,且若WCF服务URL位于http://localhost:49086/wcf/contacter.svc,则该策略文件放在localhost目录下,即http://localhost:49086/cilentaccesspolicy.xml,而不是localhost/wcf的目录下。

3,添加一个LINQ TO SQL类,并加入相关命名空间,这里设置ContextNamespace,Entity Namespace为Linq,并添加实体类

QQ截图未命名

 

 

 

 

 

 

 

4,现在开始编写WCF的服务契约文件Icontacter.cs

2 public interface Icontacter
3   {
4       [OperationContract]
5       List<Linq.contacter>  GetContract(); 
6   }

5,在contacter.svc文件中实现方法

02 public class contacter : Icontacter
03    {      
04        public List<Linq.contacter> GetContract()
05        {         
06            Linq.DataClasses1DataContext db = new Linq.DataClasses1DataContext ();
07            var query = from p in db.contacters
08                       select p;
09            var list = query.ToList<Linq.contacter>();          
10            return  list;
11        }
12    }

之前在这里遇到一个问题:直接用using Linq;语句,然后返回语句写return query.ToList<contacter>()时,总是出现 

Cannot implicitly convert type 'System.Collections.Generic.List<Linq.contacter>' to

'System.Collections.Generic.List<DataGrid.Web.contacter>' 的编译错误

最终发现是因为Linq To SQL中的实体类contacter与WCF服务的命名相同,导致编译器无法顺利的识别,教训!

6,现在需要配置一下Web.config文件,为WCF服务设置正确的参数

02 <system.serviceModel>
03   <behaviors>
04    <serviceBehaviors>
05     <behavior name="DataGrid.Web.contacterBehavior">
06      <serviceMetadata httpGetEnabled="true" />
07      <serviceDebug includeExceptionDetailInFaults="false" />
08     </behavior>
09    </serviceBehaviors>
10   </behaviors>
11    <services>
12      <service behaviorConfiguration="DataGrid.Web.contacterBehavior" name="DataGrid.Web.contacter">
13        <endpoint address="" binding="basicHttpBinding" contract="DataGrid.Web.Icontacter"></endpoint>         
14      </service>
15    </services>
16  </system.serviceModel>

因为对WCF配置还不是很了解,需要注意各种参数的配置

7,运行一下contacter.svc,没有错误的话,可以成功的看到浏览器上contract Service的相关信息

8,在银光的客户端引用该服务,命名空间为默认的ServiceReference1,如果在服务器端对contacter.svc等相关文件进行更改时,不要忘了更新该引用

9,在Page.XAML文件中添加一个DataGrid,设置AutoGenerateColumns="True"即可

10,编写后台代码:

02   public Page()
03      {
04          InitializeComponent();
05          ServiceReference1.IcontacterClient proxy = new ServiceReference1.IcontacterClient();
06          proxy.GetContractCompleted += new EventHandler<ServiceReference1.GetContractCompletedEventArgs>(proxy_GetContractCompleted);
07          proxy.GetContractAsync();
08      }
09 void proxy_GetContractCompleted(object sender, DataGrid.ServiceReference1.GetContractCompletedEventArgs e)
10      {
11          this.dataGrid1.ItemsSource = e.Result;
12      }

IcontacterClient等方法都是由WCF自动生成的,对于GetContractCompleted也可以利用Lamda表达式改写一下,代码看起来更简洁

02 public SilverlightControl1()
03        {
04           InitializeComponent();
05           ServiceReference1.IcontacterClient proxy = new ServiceReference1.IcontacterClient();           
06           proxy.GetContractCompleted+=(o,e)=>
07            {
08                this.dataGrid1.ItemsSource=e.Result;
09            };
10           proxy.GetContractAsync();
11        }

11,最后运行效果:

             QQ截图未命名1