在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,PublicKeyToken=31bf3856ad364e35" /> </httpModules> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="System.Data.Entity,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进行调用了,没什么难度了
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。