使用Enterprise Library操作Oracle的疑点难点总结

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介:
我们知道,Microsoft patterns & practices小组开发的Enterprise Library是一款非常好的组件,其有很多个模块,包括数据访问、配置、加密、IOC容器、日志、异常处理等内容,其中数据访问模块是其中非常不错的一个数据访问组件,提供了对各种数据库操作的抽象封装,使用数据访问起来基本上是对各种数据库是透明的,最重要的是,简化了代码,提高了开发效率。
本文介绍Enterprise Library中的数据访问模块在操作Oracle过程中的一些经验总结,作为自己和博友做数据库访问的一个参考。
1、存储过程的游标处理
这个和SqlServer数据获取有点不同,在Oracle中用存储过程返回数据内容,必须定义一个游标,如下面所示的Oracle存储过程
------------------------------------
--
Author:伍华聪
--
Create time:2009-08-21 
--
Description:创建一个包,含有一个游标类型:(一个数据库中只需作一次)  
--
----------------------------------
 CREATE OR REPLACE PACKAGE MyCURSOR 
 
AS 
     TYPE cur_OUT 
IS REF CURSOR
 
End
 
/ 

------------------------------------
--
Author:伍华聪
--
Create time:2009-08-21 
--
Description:检索表中所有的数据 
--
----------------------------------
 Create Or Replace Procedure WUHUACONG.PUB_PHONE_SelectAll 
 ( cur_OUT OUT MyCURSOR.cur_OUT ) 
 
AS 
 
Begin 
 
OPEN cur_OUT FOR Select * from GIS.PUB_PHONE; 
 
End
 
/ 

------------------------------------
--
Author:伍华聪
--
Create time:2009-08-21 
--
Description:以字段COMPANYID为关键字,检索表中的数据 
--
----------------------------------
 Create Or Replace Procedure WUHUACONG.PUB_PHONE_SelectByCOMPANYID 
 ( 
     cur_OUT OUT MyCURSOR.cur_OUT  ,
     p_COMPANYID 
IN GIS.PUB_PHONE.COMPANYID%TYPE 
 ) 
 
AS 
 
Begin 
 
OPEN cur_OUT FOR Select * from GIS.PUB_PHONE Where COMPANYID = p_COMPANYID ; 
 
End
 
/ 
大家看到,上面的SelectAll和SelectBy存储过程都需要一个游标的参数,是OUT类型的,也就是你获取数据需要定义一个输出的游标参数,我们看看普通的数据访问是如何做的。
            List<LeagueCompany> list = new List<LeagueCompany>();
            
try
            {
                
using (OracleConnection con = new OracleConnection("Data Source=DEVBAK;user=WUHUACONG;password=WUHUACONG;"))
                {
                    OracleCommand cmd 
= new OracleCommand();
                    cmd.Connection 
= con;
                    cmd.Parameters.Add(
"cur_OUT", OracleType.Cursor).Direction = ParameterDirection.Output;
                    cmd.CommandType 
= CommandType.StoredProcedure;
                    cmd.CommandText 
= "PUBDB.sp_LeagueCompanyInit";
                    cmd.Connection.Open();
                    OracleDataReader reader 
= cmd.ExecuteReader();
                    
if (reader.HasRows)
                    {
                        
while (reader.Read())
                        {
                            
#region 解析字段内容
                            LeagueCompany c 
= new LeagueCompany();
                            
if (reader["companyid"!= DBNull.Value)
                            {
                                c.CompanyId 
= int.Parse(reader["companyid"].ToString());
                            }
                            
if (reader["companyname"!= DBNull.Value)
                            {
                                c.CompanyName 
= reader["companyname"].ToString();
                            }
                            
if (reader["mainid"!= DBNull.Value)
                            {
                                c.MainId 
= int.Parse(reader["mainid"].ToString());
                            }
                            
if (reader["subid"!= DBNull.Value)
                            {
                                c.SubId 
= int.Parse(reader["subid"].ToString());
                            }
                            
if (reader["teamid"!= DBNull.Value)
                            {
                                c.TeamId 
= int.Parse(reader["teamid"].ToString());
                            }
                            
if (reader["levelid"!= DBNull.Value)
                            {
                                c.Level 
= int.Parse(reader["levelid"].ToString());
                            } 
                            
#endregion
                            list.Add(c);
                        }
                    }
                }
            }
            
catch (Exception ex)
            {
                LogHelper.Error(ex);
                MessageBox.Show(
string.Format("获取公司列表异常->" + ex.Message));
            }

            
this.dataGridView1.DataSource = list;
        }
上面是不用Enterprise Library数据访问而直接使用ADO.NET的数据对象访问的数据库,可以看到存在两个问题,一个是数据操作的代码比较臃肿,如果你使用很多这种操作,就会发现很多重复性的代码,另外就是数据解析的部分也比较臃肿重复,我们下面看看使用了Enterprise Library数据访问模块后的效果是如何。
            //Database db = DatabaseFactory.CreateDatabase();//通过Web.Config或者*.exe.Config配置文件读取
            Database db = new OracleDatabase("Data Source=DEVBAK;user=WUHUACONG;password=WUHUACONG;");//直接传递连接字符串,适合自定义配置文件的处理
            string sqlCommand = "PUBDB.sp_LeagueCompanyInit";
            DbCommand dbCommand 
= db.GetStoredProcCommand(sqlCommand);

        
//由于EnterpriseLibrary 默认的数据访问游标是cur_OUT,所以下面可以省略
            
//OracleParameter cursorParam = new OracleParameter("cur_OUT", OracleType.Cursor);
            
//cursorParam.Direction = ParameterDirection.Output;
            
//dbCommand.Parameters.Add(cursorParam);

            List
<LeagueCompany> list = new List<LeagueCompany>();
            
try
            {
                
using (IDataReader dr = db.ExecuteReader(dbCommand))
                {
                    
while (dr.Read())
                    {
                        
#region 解析字段内容
                        SmartDataReader reader 
= new SmartDataReader(dr);
                        LeagueCompany c 
= new LeagueCompany();
                        c.CompanyId 
= reader.GetInt("companyid");
                        c.CompanyName 
= reader.GetString("companyname");
                        c.MainId 
= reader.GetInt("mainid");
                        c.SubId 
= reader.GetInt("subid");
                        c.TeamId 
= reader.GetInt("teamid");
                        c.Level 
= reader.GetInt("levelid");
                        
#endregion
                        list.Add(c);
                    }
                }
            }
            
catch (Exception ex)
            {
                LogHelper.Error(ex);
                MessageBox.Show(
string.Format("获取公司列表异常->" + ex.Message));
            }

            
this.dataGridView1.DataSource = list;
是不是代码很简短了,这里注意两个地方,一个是我们创建游标的时候,采用cur_OUT来做为它的名称,这样我们就不用增加整个游标的定义了,因为EnterpriseLibrary模块默认给我们增加了这个游标处理(有可以少3行代码了)。另外引入了SmartDataReader对象来处理数据的转换问题,这个类后面附上,以供参考。
由于EnterpriseLibrary 默认的数据访问游标是cur_OUT,如果存储过程的游标名称和cur_OUT不一样,如p_Cur,那么数据库操作代码会变化为下面,这个必须注意。否则你的数据访问总是获取不到而发生错误。
            Database db = new OracleDatabase("Data Source=DEVBAK;user=WUHUACONG;password=WUHUACONG;");//直接传递连接字符串,适合自定义配置文件的处理
            string sqlCommand = "PUBDB.sp_LeagueCompanyInit";
            DbCommand dbCommand 
= db.GetStoredProcCommand(sqlCommand);

           OracleParameter cursorParam 
= new OracleParameter("p_Cur", OracleType.Cursor);
           cursorParam.Direction 
= ParameterDirection.Output;
           dbCommand.Parameters.Add(cursorParam);
           
            List
<LeagueCompany> list = new List<LeagueCompany>();
            
try
            {
                
using (IDataReader dr = db.ExecuteReader(dbCommand))
                {
                    
while (dr.Read())
                    {
                        
                    }
                }
            }
            
catch (Exception ex)
            {
                LogHelper.Error(ex);
                MessageBox.Show(
string.Format("获取公司列表异常->" + ex.Message));
            }
下面附上数据解析类的代码,供参考。

http://files.cnblogs.com/wuhuacong/SmartDataReader.rar 

本文转自博客园伍华聪的博客,原文链接:使用Enterprise Library操作Oracle的疑点难点总结,如需转载请自行联系原博主。



目录
相关文章
|
8月前
|
Oracle 关系型数据库 Java
实时计算 Flink版操作报错之读取Oracle数据库时遇到找不到驱动,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
实时计算 Flink版操作报错之读取Oracle数据库时遇到找不到驱动,是什么原因
|
8月前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错之遇到报错 Oracle 19C,如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
8月前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错合集之采集oracle的时候报ORA-65040:不允许从可插入数据库内部执行该操作如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
309 3
|
8月前
|
DataWorks Oracle 关系型数据库
DataWorks操作报错合集之尝试从Oracle数据库同步数据到TDSQL的PG版本,并遇到了与RAW字段相关的语法错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
109 0
|
6月前
|
Oracle 关系型数据库 数据库
|
6月前
|
分布式计算 Oracle 大数据
MaxCompute产品使用合集之没有数据源,只是将批量状态和时间写入Oracle表里,该如何操作
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
8月前
|
SQL Oracle 关系型数据库
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
158 0
|
7月前
|
SQL DataWorks Oracle
DataWorks产品使用合集之datax解析oracle增量log日志该如何操作
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
67 0
|
8月前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错合集之写Oracle时出现的缺失等号错误如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
94 9
|
8月前
|
消息中间件 Oracle 关系型数据库
实时计算 Flink版操作报错之同步Oracle时出现主题为空的报错该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。

推荐镜像

更多