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数据库操作的异常处理,分别有不同处理方式。