有经验的各位达人进:操作多个同类或者异类数据库
现有一个ASP.NET系统,主要是操作多个同类或者异类数据库的,比如:将Oracle数据库(源数据库)中的A表中的某一条(或者多条)记录和Oracle数据库(目标数据库)中的B表中的多条记录根据某种条件进行精确或者模糊的匹配,例如 表A.ID=表B.ID(其中ID为字段),只是表A和表B处在不同的数据库,一旦配对成功则返回目标表中的记录。一些要求 (1)该匹配工作可以对多个同类或者异类数据库中的数据进行匹配(如Oracle和Oracle,或者Oracle和SQL SERVER 2005)
(2)数据的匹配可以是一条记录对多条记录,多条记录对多条记录,或者两个不同数据库中的两张表的所有记录进行匹配
(3)匹配工作可以是手动的(用户手动触发),定时的(规定某一时刻触发),实时的或者用于匹配的两张表中的任意一个表中的数据有增加时进行自动匹配
(4)该匹配应以一种独立服务(例如WebService)的方式存在,以便能给其他不同的程序调用(例如:调用程序传入要匹配的源和目标数据库的连接字符串,表名,字段就能完成匹配并返回结果)。
基本要求就这些,小弟我已有些想法,想来听听各位同行的想法。请大家各抒己见
有建设性的意见都给分哦。
--------------------编程问答-------------------- 另外:由于是跨数据库操作,并且表中的数据量可能会很大,需要考虑性能的问题 --------------------编程问答-------------------- 性能上无外乎就是增加缓存 --------------------编程问答-------------------- 读到DataSet里面 再进行比较
如果仅需要读取ID的话 占用的内存还是比较小的。
发一段我原来写的代码 性能还不错
/// <summary>
/// 比较两个DataSet,并产生增量数据
/// </summary>
/// <param name="oldDataSet">原始DataSet</param>
/// <param name="nowDataSet">现有DataSet</param>
/// <param name="primaryKey">原始DataSet和现有DataSet Tables[0]的主键</param>
/// <returns>DataSet</returns>
public DataSet CompareDataSet(DataSet oldDataSet, DataSet nowDataSet, string primaryKey)
{
//更新nowDataSet中的所有行,使之状态为DataRowState.UnChanged
nowDataSet.AcceptChanges();
//要返回的DataSet
DataSet newDataSet = new DataSet();
//设置oldDataSet 和 newDataSet Tables[0] 的主键
DataColumn dcOld = oldDataSet.Tables[0].Columns[primaryKey];
DataColumn dcNow = nowDataSet.Tables[0].Columns[primaryKey];
//设置主键
oldDataSet.Tables[0].PrimaryKey = new DataColumn[1] { dcOld };
nowDataSet.Tables[0].PrimaryKey = new DataColumn[1] { dcNow };
string primaryValue = string.Empty;
string where = string.Empty;
foreach (DataRow drNow in nowDataSet.Tables[0].Rows)
{
//每行数据中,主键列所对应的值
primaryValue = drNow[primaryKey].ToString();
where = primaryKey + " = '" + primaryValue + "'";
//在oldDataSet 中查找和主键相同的行
DataRow[] drOld = oldDataSet.Tables[0].Select(where);
if (drOld.Length == 0)
{
drNow.SetModified();
}//说明nowDataSet中的这行数据是新增加的数据
else
{
for (int i = 0; i < drNow.ItemArray.Length; i++)
{
if (drNow.ItemArray.GetValue(i).ToString().Equals(drOld[0].ItemArray.GetValue(i).ToString()) == false)
{
drNow.SetModified();
break;
}//说明nowDataSet中的这行数据是修改过的数据
}
}//判断两行中的每一列是否相等
}
//装载DataRowState为 Modified的行
DataTable dt = nowDataSet.Tables[0].GetChanges(DataRowState.Modified);
if (dt != null)
{
newDataSet.Tables.Add(nowDataSet.Tables[0].GetChanges(DataRowState.Modified));
}
return newDataSet;
} --------------------编程问答-------------------- 确实大大超过“性能底线”了。
这类服务只应用于业务服务系统,用于细粒度地“操作数据库”,是没有经验积累的“理想化”做法,没有实用价值。 --------------------编程问答-------------------- 谢谢三楼的答复,你用的将其放到DataSet里面的方法是一种办法,但是我觉得数据量很大的话性能上肯定有问题。
因为数据量可能是达到千万条的级别。 --------------------编程问答-------------------- 作为一个理论研究,你至少先要把各种数据库的DDL、MDL列出来。不像有些人以为的数据库只有十几条语法,数据库往往需要支持上百条语法。另外,即使一个简单的Select也有复杂的结构,你必须将这些结构细节变为“强类型”的细节结构。如果你的系统知识接受一个“字符串”作为输入,那么你的系统根本无法处理异类数据库,只是停留在空想阶段。
我在 http://topic.csdn.net/u/20080418/11/bd581f7c-b63e-4e33-8cf6-d088f4963471.html 中简单描述过关于数据操作语句接口不能用肤浅的“字符串”来设计。 --------------------编程问答-------------------- 答复六楼:目前的实际情况是:(1)我不知道其他数据库的具体的情况,因为是在一个较大的内部网络内,有各种不同的业务数据库,而各种数据库有其他的DBA。
(2)我要做的是提供针对不同数据库的某些表中的数据的查询功能。
(3)这种查询功能我只需要提供实现,让其他开发人员调用,至于大数据量的性能问题我只能尽量的从程序方面考虑,因为具体的数据库我也不能进行操作。 --------------------编程问答-------------------- 不知,帮顶 --------------------编程问答-------------------- --------------------编程问答-------------------- 不会,帮顶
补充:.NET技术 , ASP.NET