时间:2022-10-09 05:54:39
(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.