如何让c#同时支持sqlserver 和oracle

abysswon 2008-08-26 03:02:53
我接手的一个C#模块,原本是用sqlclient来对数据进行访问,对sqlserver的操作既有sql也有存储过程,现在客户那边使用的是oracle,我要怎么尽量少的改动代码获得对oracle的支持,说明一下,oracle中的数据结构与存储过程名什么的都一样,只是联结方式变一下。

有同事提议说自己写接口,有的说是用IDBConnection接口,我不太明白,高手能否指教一下?
...全文
746 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
guoirene 2010-04-26
  • 打赏
  • 举报
回复
不错,支持一下!
abysswon 2008-08-29
  • 打赏
  • 举报
回复
谢谢大家这么热心,给分了。
GhostAdai 2008-08-26
  • 打赏
  • 举报
回复
设计模式之——工厂模式!
private Assembly ass = Assembly.Load("DataBaseManager");
IDataBaseManager dbManager = (IDataBaseManager)Activator.CreateInstance(ass.GetType(className))
把你对数据库的操作抽象出来做成接口IDataBaseManager,然后用反射根据类名创建对象,用创建的接口对象操作数据库,这样就与具体的数据库类型无关,大概就是这个意思。
lsj_zrp 2008-08-26
  • 打赏
  • 举报
回复
建议用Factory的方式来生成不同的数据库连接对象
可以用System.Data.Common里面的类
bruesz 2008-08-26
  • 打赏
  • 举报
回复
如果不考虑连接的性能的话,我想用OleDb就可以解决这个问题,反正这个是通用的数据库连接方式,只是连接字符串修改一下而已;不过长远的考虑来讲,最好还是使用工厂模式,用Factory的方式来生成不同的数据库连接对象。
lijun198504 2008-08-26
  • 打赏
  • 举报
回复
使用反射,具体参照petshop
zhangxuyu1118 2008-08-26
  • 打赏
  • 举报
回复
我比较揽,不管换什么数据库,我都希望使用统一的方法来实现对数据库访问。OracleHelper.cs和MySqlHelper.cs也是差不多的。
zhangxuyu1118 2008-08-26
  • 打赏
  • 举报
回复
太长了,要代码留下EMAIL。
用接口的方法比较好;我用多个类使用相同的方法名来实现主要是为了简单,便于新手操作。
zhangxuyu1118 2008-08-26
  • 打赏
  • 举报
回复
/*===========================================
* 文件名称:MsSqlHelper
* 功能:MS SQLSERVER 数据库访问层
* 作者:张旭煜 2008-3-8
* 最后更改:2008-3-20 增加范型功能和缓存功能
*===========================================*/

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using System.Collections.Generic;
using System.Web;

namespace zxy.SqlUtility
{

public abstract class MsSqlHelper
{
//数据库连接字符串
public static readonly string SqlCnStr = ConfigurationManager.ConnectionStrings["SqlCn"].ConnectionString;

//用于缓存参数的HASH表
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

//事务
private static SqlTransaction trans;

//开始事务
public static void BeginTran()
{
SqlConnection myConn = new SqlConnection(SqlCnStr);
myConn.Open();
trans = myConn.BeginTransaction();
}

public static void CommitTran()
{
trans.Commit();
}

public static void RollbackTran()
{
trans.Rollback();
}

//执行SQL
public static int ExecuteNonQuery(string cmdText, params SqlParameter[] commandParameters)
{
...
}
public static int ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
{
... }


public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
{
... }


public static int ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
{
... }

public static int ExecuteNonQuery(string cmdText)
{
... }

//获取数据
public static SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
{
... }
public static SqlDataReader ExecuteReader(string cmdText)
{
... }

//定义1个方法类型。result:返回的字典数据result;输入的是dr
/* public delegate void ToDict(SqlDataReader dr, Dictionary<string, object> result);

public static void GetDictionary(string cmdText, Dictionary<string, object> result, ToDict d)
{
... }*/

public static DataSet ExecuteDataSet(string cmdText, params SqlParameter[] commandParameters)
{
... }

public static DataSet ExecuteDataSet(string cmdText)
{
... }

public static object ExecuteScalar(string cmdText, params SqlParameter[] commandParameters)
{
... }

public static object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
{
... }

public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
{
... }

public static object ExecuteScalar(string cmdText)
{
... }


public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters)
{
parmCache[cacheKey] = commandParameters;
}


public static SqlParameter[] GetCachedParameters(string cacheKey)
{
... }


private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
{

... }

//缓存1张表
public static DataSet ExecuteDataSet(string CacheName, string connectionString, string cmdText, params SqlParameter[] commandParameters)
{
bool NeedCache = CacheName != "";

//如果已经缓存
if (NeedCache && (HttpContext.Current.Cache[CacheName] != null))
return (DataSet)HttpRuntime.Cache[CacheName];

//创建一个SqlCommand对象,并对其进行初始化
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(connectionString))
{
PrepareCommand(cmd, conn, null, CommandType.Text, cmdText, commandParameters);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
try
{
da.Fill(ds);
cmd.Parameters.Clear();
if (NeedCache)
HttpContext.Current.Cache.Insert(CacheName, ds, null, DateTime.Now.AddMinutes(60), System.Web.Caching.Cache.NoSlidingExpiration);
return ds;
}
catch
{
conn.Close();
throw;
}
}
}

//数据访问层 Data Access Level
public abstract class Dal<T>
{
public delegate T CreateBoMethod(SqlDataReader rdr);

public static List<T> GetList(string cmdText, CreateBoMethod method)
{
SqlDataReader rdr = MsSqlHelper.ExecuteReader(cmdText);
List<T> result = new List<T>();
while (rdr.Read())
{
T Bo = method(rdr);
result.Add(Bo);
}
return result;
}

public static Dictionary<string, T> GetDictionary(string cmdText, CreateBoMethod method)
{
SqlDataReader rdr = MsSqlHelper.ExecuteReader(cmdText);
Dictionary<string, T> result = new Dictionary<string, T>();
while (rdr.Read())
{
T Bo = method(rdr);
string key = rdr["ZID"].ToString();
result.Add(key, Bo);
}
return result;
}
}
}
}
ldy201001 2008-08-26
  • 打赏
  • 举报
回复
恐怕你这次的改动还是很大的,但在以后注意一下,留一个数据处理的接口,换数据库的话仅仅改动数据处理模块中的内容,而不需要改动其他的
zhangxuyu1118 2008-08-26
  • 打赏
  • 举报
回复
呵呵,参考下我的两个AccessHelper.cs和MsSqlHelper.cs,然后再写个OracleHelper.cs吧。
/*===========================================
* 文件名称:MsSqlHelper
* 功能:MS SQLSERVER 数据库访问层
* 作者:张旭煜 2008-3-8
* 最后更改:2008-3-20 增加范型功能和缓存功能
*===========================================*/

using System;
using System.Data;
using System.Configuration;
using System.Data.OleDb;
using System.Collections;
using System.Web;
using System.Collections.Generic;

namespace zxy.AccessUtility
{
public static class AccessHelper
{
//数据库连接字符串
public static readonly string SqlCnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ HttpContext.Current.Request.PhysicalApplicationPath
+ System.Configuration.ConfigurationManager.ConnectionStrings["AccessCn"].ConnectionString;

//用于缓存参数的HASH表
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

//事务
private static OleDbTransaction trans;
private static OleDbConnection cn = null;

//开始事务
public static void BeginTran()
{
if (cn == null)
cn = new OleDbConnection(SqlCnStr);
if (cn.State != ConnectionState.Open)
cn.Open();
trans = cn.BeginTransaction();
}

public static void CommitTran()
{
trans.Commit();
cn.Close();
}

public static void RollbackTran()
{
trans.Rollback();
cn.Close();
}

public static bool TranExecuteNonQuery(string cmdText, params OleDbParameter[] commandParameters)
{
... }

//执行SQL
public static int ExecuteNonQuery(string cmdText, params OleDbParameter[] commandParameters)
{
... }

public static int ExecuteNonQuery(OleDbConnection connection, string cmdText, params OleDbParameter[] commandParameters)
{
... }

public static int ExecuteNonQuery(string cmdText)
{
... }

//获取数据
public static OleDbDataReader ExecuteReader(string cmdText, params OleDbParameter[] commandParameters)
{
OleDbCommand cmd = new OleDbCommand();
OleDbConnection conn = new OleDbConnection(SqlCnStr);
//在这里我们用一个try/catch结构执行sql文本命令/存储过程,因为如果这个方法产生一个异常我们要关闭连接,因为没有读取器存在,
//因此commandBehaviour.CloseConnection 就不会执行
try
{
PrepareCommand(cmd, conn, null, cmdText, commandParameters);
OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return reader;
}
catch
{
conn.Close();
throw;
}
}

public static DataSet ExecuteDataSet(string cmdText, params OleDbParameter[] commandParameters)
{
//创建一个SqlCommand对象,并对其进行初始化
OleDbCommand cmd = new OleDbCommand();
using (OleDbConnection conn = new OleDbConnection(SqlCnStr))
{
PrepareCommand(cmd, conn, null, cmdText, commandParameters);
//创建SqlDataAdapter对象以及DataSet
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataSet ds = new DataSet();
try
{
//填充ds
da.Fill(ds);
// 清除cmd的参数集合
cmd.Parameters.Clear();
//返回ds
return ds;
}
catch
{
//关闭连接,抛出异常
conn.Close();
throw;
}
}
}

public static DataSet ExecuteDataSet(string cmdText)
{
//创建一个SqlCommand对象,并对其进行初始化
OleDbCommand cmd = new OleDbCommand();
using (OleDbConnection conn = new OleDbConnection(SqlCnStr))
{
PrepareCommand(cmd, conn, null, cmdText, null);
//创建SqlDataAdapter对象以及DataSet
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataSet ds = new DataSet();
try
{
//填充ds
da.Fill(ds);
// 清除cmd的参数集合
cmd.Parameters.Clear();
//返回ds
return ds;
}
catch
{
//关闭连接,抛出异常
conn.Close();
throw;
}
}
}

public static object ExecuteScalar(string cmdText, params OleDbParameter[] commandParameters)
{
OleDbCommand cmd = new OleDbCommand();
using (OleDbConnection conn = new OleDbConnection(SqlCnStr))
{
PrepareCommand(cmd, conn, null, cmdText, commandParameters);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
}

public static object ExecuteScalar(OleDbConnection connection, string cmdText, params OleDbParameter[] commandParameters)
{
OleDbCommand cmd = new OleDbCommand();
PrepareCommand(cmd, connection, null, cmdText, commandParameters);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}

public static object ExecuteScalar(string cmdText)
{
OleDbCommand cmd = new OleDbCommand();
using (OleDbConnection conn = new OleDbConnection(SqlCnStr))
{
PrepareCommand(cmd, conn, null, cmdText, null);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
}

public static void CacheParameters(string cacheKey, params OleDbParameter[] commandParameters)
{
parmCache[cacheKey] = commandParameters;
}

public static OleDbParameter[] GetCachedParameters(string cacheKey)
{
OleDbParameter[] cachedParms = (OleDbParameter[])parmCache[cacheKey];
if (cachedParms == null)
return null;
OleDbParameter[] clonedParms = new OleDbParameter[cachedParms.Length];
for (int i = 0, j = cachedParms.Length; i < j; i++)
clonedParms = (OleDbParameter[])((ICloneable)cachedParms).Clone();
return clonedParms;
}

private static void PrepareCommand(OleDbCommand cmd, OleDbConnection conn, OleDbTransaction trans, string cmdText, OleDbParameter[] cmdParms)
{
//判断连接的状态。如果是关闭状态,则打开
if (conn.State != ConnectionState.Open)
conn.Open();
//cmd属性赋值
cmd.Connection = conn;
cmd.CommandText = cmdText;
//是否需要用到事务处理
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = CommandType.Text;
//添加cmd需要的存储过程参数
if (cmdParms != null)
{
foreach (OleDbParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}

}
lijin84100 2008-08-26
  • 打赏
  • 举报
回复
你把操作数据库的底层写成支持几种数据库的,这样.以后就不要修改太多的东西,所以你还要自己写数据操作层.
viki117 2008-08-26
  • 打赏
  • 举报
回复
数据持久层?
haonanzhao 2008-08-26
  • 打赏
  • 举报
回复
自己写一系列类,内部支持sql 和oracle。建议你看看工厂模式。很简单的哦
abysswon 2008-08-26
  • 打赏
  • 举报
回复
有高手愿费心粘个代码什么的吗?
格拉 2008-08-26
  • 打赏
  • 举报
回复
网上应该有源码,找下看看
abysswon 2008-08-26
  • 打赏
  • 举报
回复
能给个详细点儿的说明吗?有点儿不明白,刚接手c#.
yangpeiyu 2008-08-26
  • 打赏
  • 举报
回复
其实自己写多一个连接oracle的封装类就可以了。
只是你的连接字符不同和ADO.net对象改一下都可以实现啦。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧