cangfriend

   :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Oracle数据库调用就是一门复杂的课程啦,我这里只写在WCF中的应用。

我看到有的人在写中间层调用数据库时,单把数据库调用作为一个服务来发布,仅仅是一个远程函数,上传一个Sql+参数列表,返回一个数据集,其他所有逻辑都在客户端编写应用,这就完成一个系统的开发啦。

我觉得这种方式太狭隘啦,完全抛弃了面向对象开发的思想,又回到面向过程的开发啦。我的方式是自己写类,在类中包含属性,在服务端执行Sql结果都写到类中,再返回类,这种方式在下一篇中再介绍,这里只写数据库。

在我刚学习时用的vs2003,那是还有OracleConnection等一些.Net内置的Oracle专用类库,在VS2008时,就找不到啦,我一直用的OleDB类库。

1. 连接字符串Provider=OraOLEDB.Oracle;Password=***;Persist Security Info=true;User ID=***;Data Source=***

2. 前期是自己写的SqlHelp,后来用的EntLib,微软企业库,现在是5版本啦。

3. 调用的基本方式是

public virtual bool boExecuteSql(string strSql, string[] _parameterS, string strDBConString, DataSet dsDBRe)

{

Boolean boResult;

//

int intDiv;

intDiv = _parameterS.Length % 2;

if (intDiv > 0)

{

boResult = false;

return boResult;

};

try

{

using (SFCDBCon = new OleDbConnection(strDBConString))

{

OleDbDataAdapter empS = new OleDbDataAdapter(strSql, SFCDBCon);

int countParameter = _parameterS.Length / 2;

OleDbParameter[] myOleParameterS = new OleDbParameter[countParameter];

for (int i = 0; i < countParameter; i++)

{

if (_parameterS[i * 2 + 1].Trim().Length > 0)

{

myOleParameterS[i] = new OleDbParameter(_parameterS[i * 2], _parameterS[i * 2 + 1]);

empS.SelectCommand.Parameters.Add(myOleParameterS[i]);

}

}

SFCDBCon.Open();

empS.Fill(dsDBRe, "myTB");

}

boResult = true;

}

catch (System.Exception e)

{

string eMsg = e.Message;

boResult = false;

}

//

return boResult;

}

4. 在连接Oralce是一定要牢记,要释放Oracle连接。如果不释放,Oracle就会产生许多空链接,直到连接数满。用Using()语法就简单啦,不用手动释放。

5. 在就是参数的应用。在Delphi中数据库控件可以自动感应Sql中包含的参数,单OldDb不能自动感应,必须手工建立参数并赋值

6. 调用存储过程,因为参数是相对固定的,我采用的方法是预先从Oracle系统表中求出参数。

SELECT OBJECT_NAME,ARGUMENT_NAME,POSITION,DATA_TYPE,IN_OUT FROM USER_ARGUMENTS WHERE OBJECT_NAME = :procname ORDER BY POSITION

7. EntLib的数据访问模块,操作Oracle数据库。

8. 别忘异常处理。否则客户端报错,就不知道什么原因啦。其中又包括WCF的异常处理,和Oracle数据库操作的异常处理,分别有不同处理方式。

posted on 2010-10-25 19:48  BruceZhou  阅读(2478)  评论(0编辑  收藏  举报