基于C#实现SQL Server和Oracle数据库间数据迁移

时间:2022-10-09 05:54:39

基于C#实现SQL Server和Oracle数据库间数据迁移

(1.南昌大学 信息工程学院,江西 南昌 330031;2.江西理工大学 南昌校区,江西 南昌 330013)

摘要:该文分析SQL Server和Oracle数据库间数据迁移的现有技术、方法后,提出采用C#编程并以技术分别来访问这两种数据库,进而设计一个数据迁移程序,实现此两种数据库互相迁移数据。

关键词:C# ;;数据迁移;SQL Server;Oracle

中图分类号:TP312文献标识码:A文章编号:1009-3044(2009)28-7842-03

Data Migration Between SQL Server and Oracle DataBase Based C Sharp Implement

YU Qiu-ming1,2

(1.Information Engineering School of NanChang Univisity, Nanchang 330031, China;2.JiangXi Univisity of Science and Tecknology Nanchang Branch, NanChang 330013, China)

Abstract: The article analyzed existing technology and method about data migration between SQL Server and Oracle database, bring out using C Sharp program and tecknology to access the database, and then design one program about data migration, implement migration data each other between SQL Server and Oracle database.

Key words: C Sharp; ; data migration;SQL Server; Oracle

SQL Server数据库和Oracle数据库是当今使用广泛的主流数据库,这两种数据库分别由世界著名软件厂商微软和甲骨文研发,各自都有一大批使用者。两种数据库虽同为一种数据模型即关系型,但无论从界面风格,还是数据内部组织,存储结构等都存在一定的异构性。

有时数据库使用者因为应用系统数据集成的需要,或者应用系统版本升级,再或者应用系统数据库更换(如SQL切换成Oracle或者反之),而原来系统中数据库存储有大量历史数据,此时,面临一个数据迁移问题。当然原有系统数据迁移到新系统有多种方法,本文在分析现有方法的基础上,提出自己的想法,即采用C#编程,以中的数据集DataSet为技术核心,访问这两种数据库,获得一致的编程模型,再通过SQL语句实现数据的迁移。

1 迁移技术、工具介绍分析

1.1 现有技术、工具介绍

1.1.1 SQL Server 2000 自带的Import/Export工具DTS

使用该工具需要通过定义ODBC Fo r O racle 作为目的源, 且预先在O racle 建立用户和相应的表空间。

1.1.2 Oracle Migration Workbench (OMW)工具

使用OMW时只要定义ODBC fo r SQL Server把表、视图、触发器、存储过程、快照、用户等完全转到Oracle。根据集成的数据库类型的不一致可能出现界面不一致的情况.

以上工具都需要使用到ODBC技术,定义好数据源,如Micosoft ODBC for Oracle,或者ODBC for SQL Server ,所以这些工具所采用的核心编程技术是ODBC数据源,此外,还可以采用JDBC,OLEDB等数据库编程技术来实现此两种数据库间数据迁移。

1.2 该文采用的技术介绍

中,Windows平台下主要有以下几种数据库访问模式:OLEDB模式、ODBC模式、SqlClient模式、OracleClient模式等。无论哪种访问模式,在DataSet中对不同数据库的数据将获得一致的编程模式。也就是说,采用DataSet对象,通过数据访问模式如SqlClient模式访问SQL Server数据库并把数据填充到数据集,OracleClient模式访问Oracle数据库并把数据填充到数据集(和SQL Server为同一数据集),在DataSet数据集中表DataTable对象、DataRow数据行对象,DataColumn数据列对象将表现为类型一致的对象,即可以相互赋值,相互引用,这样为异构数据库SQL Server和Oracle 相互迁移数据提供了技术基础。

DataSet是的核心,它是不依赖数据库的独立数据集合,可以把它认为是内存中数据库,即使与数据库连接断开,DataSet依然可以使用。DataSet屏蔽了各种数据库的差异,所有的数据源通过DataSet将获得一致的编程模型。使用DataSet一般步骤为:先通过连接模式中的连接对象创建一个与数据源的连接,再创建一个数据适配器DataAdapter对象(要使用到该连接对象),其次创建数据集DataSet对象,再把适配器对象将需要的数据填充(Fill方法)到数据集对象中,关闭连接,在数据集DataSet上进行所需要的操作,最后把在DataSet上操作的数据(已修改)通过适配器对象更新(Update方法)到数据库中。

2 迁移程序设计、实现过程

设计该程序采用的开发环境为Microsoft Visual 2003 ,使用的数据库为SQL Server2000和Oracle9i。

首先创建一个C# Window应用程序,添加Oracle访问组件,并在开头处引用以下代码:

using System.Data;

using System.Data.SqlClient;

using System.Data.OracleClient;

接着创建一个数据库登录模块,在登录模块中记录SQL Server和Oracle的连接信息到相应控件中如textBox,在该模块中点击【连接】按钮控件时触发一个事件,即用控件记录的连接信息(含用户名,密码,数据库,服务器名等)相应创建与SQL Server和Oracle数据库的连接对象sql_conn、oracle_conn,并显示连接数据库成功与否的消息框。

然后设计数据迁移程序主界面模块,在主界面中定义两个树状视图TreeVeiw对象,treeView1和treeView2,分别用来读取并以树状显示所连接的SQL Server和Oracle数据对象(如用户表、视图)。两视图对象分布在主界面左右两边(偏上部),中间留有一定间距,布放【迁移数据到Oracle】、【迁移数据到SQL Server】、【显示表数据】按钮等。之后,再在主界面下方,分别对应左右两视图下方定义数据绑定控件DataGrid对象dataGrid1和dataGrid2,用来显示被选中的数据表中数据。

读取数据库对象(表)并显示在树状视图中,以结点形式展现,以Oracle为例,关键代码如下:DataSet ds=new DataSet ();

//查询所有用户名从系统表视图SYS.ALL_USERS

string sq="SELECT USERNAME FROM SYS.ALL_USERS";

OracleDataAdapter odu=new OracleDataAdapter (sq,oracle_conn);

odu.Fill(ds,"ora_user");//填充用户名到数据表ora_user

DataTable dtu=new DataTable ();

dtu=ds.Tables["ora_user"];

int iURow=dtu.Rows.Count;//统计共有多少个用户,对应多少个方案数据库

this.label5.Text+="方案总计"+iURow.ToString()+"个";

//以下代码,把方案下的数据表依次作为结点添加到树状视图treeView2

for(int u=0;u

DataRow dru=dtu.Rows[u];

int m=0;

System.Windows.Forms.TreeNode tm=new TreeNode ();

tm.Tag=dru[m].ToString().ToUpper();

tm.Text=dru[m].ToString ().ToUpper ();

t0.Nodes.Add(tm);

string sql="SELECT TABLE_NAME FROM SYS.ALL_TABLES

WHERE OWNER='"+dru[m].ToString().ToUpper()+"'";

OracleDataAdapter oda=new OracleDataAdapter (sql,oracle_conn);

oda.Fill(ds,dru[m].ToString().ToUpper());

DataTable dt=new DataTable ();

dt=ds.Tables[dru[m].ToString().ToUpper()];

int iRow=dt.Rows.Count;

for(int i=0;i

{DataRow dr=dt.Rows[i];

System.Windows.Forms.TreeNode tn=new TreeNode ();int j=0;

tn.Tag =dr[j].ToString ();tn.Text =dr[j].ToString();tm.Nodes.Add (tn);}}

dataGrid1和dataGrid2用来显示数据的代码由于比较简单且篇幅有限,在此省略。做完以上工作,则进入该程序的关键步骤,数据迁移,响应于被选中的数据表且点击迁移按钮后触发数据迁移事件。

2.1 SQL Server向Oracle迁移数据

SQL Server向Oracle迁移数据过程如下:先在SQL Server中选中需要迁移的用户表,再点击【迁移数据到Oracle】按钮,触发Sql_to_Oracle迁移数据事件,在该事件中,需要先读取SQL中被选中表的数据架构,如表名,属性名,属性数据类型,约束等,经过SQL Server,C#,Oracle数据类型映射转换,再到Oracle中建立相应的表对象(SQL语句实现),紧接着把选中的表中数据填充到数据集中,并和Oracle为同一数据集,把SQL Server在同一数据集DataSet中数据表DataTable对象下的数据行对象及数据列对象(由于一致编程模型)引用给或者说赋值给Oracle在DataSet数据集相应的对象中。循环处理后,最后更新到Oracle数据库中,同时也可根据需要删除SQL Server中的表对象。迁移后,查看Oracle下的treeView2视图和dataGrid2数据显示,是否已经迁移成功,甚至可在主界面最下方,状态栏中给出迁移多少行数据,耗时多少等。根据以上设计,主要代码如下:

DataSet dds=new DataSet ();

sda.Fill (dds,treeView1.Nodes[0].Nodes [0].Nodes[i].Text);

//根据选定的SQL表创建对应在Oracle表,以备迁移数据到oracle

int iColumn=dds.Tables[treeView1.Nodes[0].Nodes[0].Nodes[i].Text].Columns.Count;

//统计SQL指定表的列数

string []pp=new string[12]{"","","","","","","","","","","",""};

string ppn=dds.Tables[treeView1.Nodes[0].Nodes[0].Nodes[i].Text].TableName.ToUpper();

string sqlpp="CREATE TABLE "+ ppn+"(";

for(int p=0;p

DataColumn dc=dds.Tables[treeView1.Nodes[0].Nodes[0].Nodes[i].Text].Columns[p];

pp[p]=dc.ColumnName.ToUpper()+" ";

switch(dc.DataType.Name) //SQL数据类型经C#转换映射成Oracles数据类型

{case "String":pp[p]+="VARCHAR2(200)";break;

case "Int":

case "Int16":

case "Int32":

case "Int64":pp[p]+="NUMBER(10)";break;

case "Decimal":pp[p]+="NUMBER(20,4)";break;

case "DateTime":pp[p]+="DATE";break;

case "Boolean":pp[p]+="NUMBER(1)";break;

case "Byte":pp[p]+="Number(4)";break;}

if(p!=iColumn-1) pp[p]+=",";

if(p==iColumn-1) pp[p]+=")";

sqlpp+=pp[p];}

//通过sqlpp语句在Oracle中创建相应数据表

OracleCommand omg=new OracleCommand (sqlpp,oracle_conn);

if(omg.ExecuteNonQuery ()==1){ MessageBox.Show ("创建Oracle数据表成功!");}

string sqlo="select * from "+

treeView1.Nodes[0].Nodes [0].Nodes[i].Text.ToUpper();

OracleDataAdapter oda=new OracleDataAdapter (sqlo,oracle_conn);

OracleCommandBuilder obd=new OracleCommandBuilder (oda);

oda.Fill (dds,"ots");//Oracle对应在数据集dds中表ots

dds.Tables["ots"].Clear();//清空数据

int iRow=dds.Tables[treeView1.Nodes[0].Nodes [0].Nodes[i].Text].Rows.Count;

for(int x=0;x

DataRow dr1=dds.Tables["ots"].NewRow();//新建行数据

DataRow dr2=

dds.Tables[treeView1.Nodes[0].Nodes [0].Nodes[i].Text].Rows[x];

for(int y=0;y

{dr1[y]=dr2[y];

}dds.Tables["ots"].Rows.Add(dr1);//添加行数据到Oracle表ots

}

try{oda.Update (dds,"ots"); //更新到Oracle数据库中

MessageBox.Show("共迁移 "+iRow.ToString()+"行数据\n"+"到 Oracle数据库");}

catch(System.Exception ex) {

MessageBox.Show("数据迁移失败!\n"+ex.ToString ());}

2.2 Oracle向SQL Server迁移数据

Oracle向SQL Server迁移数据和SQL Server向Oracle迁移数据过程类似。

3 结束语

该文采用C#编程,以为核心,分析并设计了一个在SQL Server和Oracle数据库之间相互数据迁移程序,经过测试,该迁移程序迁移数据的数据正确率较高,迁移数据耗时不多,五十万行数据迁移仅费时仅15分多钟,而采用DTS迁移同数量数据,却费时达18分多钟(不同机器配置时间会有出入,但和DTS比较采用同一台机器)。迁移效果满意,基本能够满足SQL Server和Oracle数据库间迁移数据的需要。

参考文献:

[1] 施燕妹.C#语言程序设计教程[M].北京:中国水利水电出版社,2004.

[2] Karli Watson.C#2005数据库编程经典教程[M].陈秋萍,译.北京:人民邮电出版社,2007.

[3] 卓伟,陈琴.SQL Server 到 Oracle 的数据迁移方法[J].广西科学院学报.2005,10(21):112-113.

上一篇:中小型企业客户管理系统的设计与实现 下一篇:练习与测试互操作规范QTI研究