silverlight中利用RIA进行oracle存储过程的调用返会结果集

在silverlight中应用oralce其复杂程度超乎想象,从安装到应用处处都是难点,极度郁闷....

学习资料oracle provide for ado.net,此篇文章中介绍了如何使用EF调用oracle存储过程

实际应用中由于采用了MVVM+RIA的架构还需在此基础上再做些变动,步骤如下:

1、先看看存储过程,简单示例

create or replace procedure Proc_GetQuestionGroup(startdate varchar,enddate varchar, p_out_cursor out SYS_REFCURSOR) is
begin

     
open p_out_cursor for select bsjdw, count(*) total_num from sj_question group by bsjdw;
end Proc_GetQuestionGroup;

这是一个简单的存储过程,有传入参数,返还游标作为结果集

2、在服务器端web.config中定义对该存储过程返还集的定义

<?xml version="1.0" encoding="utf-8"?>
<!--
  有关如何配置 ASP.NET 应用程序的详细消息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="DomainServiceModule" preCondition="managedHandler" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </modules>
    <validation validateIntegratedModeConfiguration="false" />
  </system.webServer>
  <system.web>
    <httpModules>
      <add name="DomainServiceModule" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </httpModules>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </assemblies>
    </compilation>
  </system.web>
  <connectionStrings><add name="Entities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=Oracle.DataAccess.Client;provider connection string="DATA SOURCE=ora10g;PASSWORD=tljsj;PERSIST SECURITY INFO=True;USER ID=TLJSJ"" providerName="System.Data.EntityClient" /><add name="Entities1" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=Oracle.DataAccess.Client;provider connection string="DATA SOURCE=ora10g;PASSWORD=tljsj;PERSIST SECURITY INFO=True;USER ID=TLJSJ"" providerName="System.Data.EntityClient" /></connectionStrings>
  <oracle.dataaccess.client>
    <settings>
      <add name="TLJSJ.Proc_GetQuestionGroup.RefCursor.p_out_cursor" value="implicitRefCursor bindinfo='mode=Output'" />
      <add name="TLJSJ.Proc_GetQuestionGroup.RefCursorMetaData.p_out_cursor.Column.0" value="implicitRefCursor metadata='ColumnName=bsjdw;BaseColumnName=bsjdw;BaseSchemaName=TLJSJ;BaseTableName=sj_question;NATIVE_DATA_TYPE=Varchar2;ProviderType=Varchar2'" />
      <add name="TLJSJ.Proc_GetQuestionGroup.RefCursorMetaData.p_out_cursor.Column.1" value="implicitRefCursor metadata='ColumnName=total_num;NATIVE_DATA_TYPE=Number;ProviderType=Int32'" />
    </settings>
  </oracle.dataaccess.client>
  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
</configuration>
重点是

<oracle.dataaccess.client>
    <settings>
      <add name="TLJSJ.Proc_GetQuestionGroup.RefCursor.p_out_cursor" value="implicitRefCursor bindinfo='mode=Output'" />
      <add name="TLJSJ.Proc_GetQuestionGroup.RefCursorMetaData.p_out_cursor.Column.0" value="implicitRefCursor metadata='ColumnName=bsjdw;BaseColumnName=bsjdw;BaseSchemaName=TLJSJ;BaseTableName=sj_question;NATIVE_DATA_TYPE=Varchar2;ProviderType=Varchar2'" />
      <add name="TLJSJ.Proc_GetQuestionGroup.RefCursorMetaData.p_out_cursor.Column.1" value="implicitRefCursor metadata='ColumnName=total_num;NATIVE_DATA_TYPE=Number;ProviderType=Int32'" />
    </settings>
  </oracle.dataaccess.client>

这里描述的是对返还游标的定义,貌似不同oralce版本略有不同,资料中用的orale类型是NATIVEDATATYPE,而实验后总是错误修改为NATIVE_DATA_TYPE后成功,详细情况没时间自己查。此处定义的中如果返回的列有多个就要定义多个,且类型要对应一致,此处只返回了2列所以只定义了两列。

3、定义完成后添加ado.net数据模型,在选择是可以选择具体的存储过程,在添加完存储过程后并没有在视图上显示返回结果。

4、在模型中定义复杂类型,复杂类型中的列类型要与返回结果集的类型一致。

5、在模型中定义函数导入,在选择函数名称时要注意函数名称要与存储过程名称一致,返回类型选择已经添加的复杂类型。

6、开始添加domainservice,由于下面还有建立一个该类个扩展,所以需要将该类设置为partial。

7、建立domainservice扩展类,添加调用存储过程的调用

public partial class DomainService1
    {
        public IQueryable<Proc_GetQuestionGroup_Result> Proc_GetQuestionGroup(string startDate, string enddate)
        {
            return ObjectContext.Proc_GetQuestionGroup(startDate, enddate).AsQueryable<Proc_GetQuestionGroup_Result>();
        }
    }
8、扩展前面已经添加的复杂类型

[MetadataTypeAttribute(typeof(Proc_GetQuestionGroup_Result.Proc_GetQuestionGroup_ResultMetadata))]
    public partial class Proc_GetQuestionGroup_Result
    {

        // 通过此类可将自定义特性附加到
        //DIC_LIST 类的属性。
        //
        // 例如,下面的代码将 Xyz 属性标记为
        //必需属性并指定有效值的格式:
        //    [Required]
        //    [RegularExpression("[A-Z][A-Za-z0-9]*")]
        //    [StringLength(32)]
        //    public string Xyz { get; set; }
        internal sealed class Proc_GetQuestionGroup_ResultMetadata
        {

            // 元数据类不会实例化。
            private Proc_GetQuestionGroup_ResultMetadata()
            {
            }
            [Key]
            public string bsjdw { get; set; }
       
            public Double total_num { get; set; }


         
        }
    }
9、剩下的就是在客户端利用MVVM进行调用了,没什么难度了


核心提示:一定要在web.config配置存储过程返回游标的信息,不然会提示参数类型或个数不一致的情况




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值