在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配置存储过程返回游标的信息,不然会提示参数类型或个数不一致的情况