吴昊 江苏省木渎高级中学
VFP是Microsoft公司推出的可视化数据库管理系统平台,是功能强大的32位数据库管理系统,对于轻量化的数据管理系统开发来说,VFP是最为快捷高效的,时至今日,仍然有不少应用是用VFP开发,但随着WEB应用开发的需求越来越高,MYSQL、SQL、ORACLE这些数据库管理软件更适合网络化时代的需要,本文就VFP数据如何转入SQL SERVER来做一个探讨。
要注意VFP和SQL SERVER之间的数据格式的区别,如果通过EXCEL进行间接转换,原有数据表的结构就无法保证了,在做数据迁移时,需要把VFP和SQL SERVER的数据类型进行对照,在转换过程中,还需要注意到原数据中实际存放的信息,如果是字符型且带有变长中文的,如姓名字段,那么在迁入SQL SERVER时,对应的数据类型应该是nvarchar,否则会导致中文信息无法显示。DBF中的时间类型字段T可以仅存储时间,无年份日期值,在迁入SQL SERVER的datatime类型时会因为年份是0000而报错,需要提前做好预处理。
由于dataset和sql server之间的衔接最方便,首先,通过oledb方式将DBF文件的数据读取到dataset中,但在实际读取时,OleDbDataAdapter的fill方法读取到的字段长度是固定的(最大长度),为保证迁入SQL SERVER的同时节省空间,还需要通过FillSchema方法把原DBF的数据结构保存下来:
public DataSet importDbfToDataSet(string FilePath){
string strDir=Path.GetDirectoryName(FilePath);
String Tabname=Path.GetFileNameWithoutExtension(FilePath);
string strSelect = "SELECT * FROM "+Tabname;
string conStr = @"Provider=VFPOLEDB.1;Data Source=" + strDir + ";Collating Sequence=machine;";
O l e D b C o n n e c t i o n c o n n = n e w OleDbConnection(conStr);
conn.Open();
O l e D b D a t a A d a p t e r d a = n e w OleDbDataAdapter(strSelect, conn);
DataSet ds = new DataSet();
da.Fill(ds,"source");
da.FillSchema(ds, SchemaType.Mapped,"structure");
//数据保存在source表,结构保存在structure表
conn.Close();
return thisDataSet;}
第二步,则是遍历数据集中的结构表,在SQL SERVER中建立对应的数据表,这里需要做一个数据类型的转换,以常见的字符型、整型、布尔型、日期型为例,由于是已经读取到datatable中,所以应该是判断系统的数据类型转换为对应的SQL SERVER中的数据类型:
public DataType GetDataType(string dataType,int length){
DataType DTTemp = null;
switch (dataType){
case ("System.Decimal"):
DTTemp = DataType.Decimal(2, 18); break;case ("System.String"):
DTTemp = DataType.NVarChar(length);break;case ("System.Int32"):
DTTemp = DataType.Int;break;case ("System.Boolean"):
DTTemp = DataType.Bit;break;case ("System.DateTime"):
DTTemp=DataType.DateTime;break;}return DTTemp;}
根据读取到的数据类型和字段长度,在SQL SERVER中建立好对应的数据表:
foreach(DataColumn dc in dtStruc.Columns){
tempTc = new Column(newTable, dc.ColumnName);tempTc.DataType=GetDataType(dc.DataType.ToString(),dc.MaxLength);
newTable.Columns.Add(tempTc);}
前面这些步骤完成后,接下来要用到SQL SERVER的一个SqlBulkCopy类,这个类用于数据库之间大批量的数据传递。通常用于新、旧数据库之间数据的更新。即使表结构完全不同,也可以通过字段间的对应关系,顺利的将数据导过来,源数据可以用Datatable,也可以用SqlDataReader。因为SqlDataReader不占用内存,如果是对大批量的数据复制,不需要事先导入到系统,可以优先采用DataReader方式,这两个方式导入数据的效率,都要比直接insert into要高得多:
SqlBulkCopy sbc = new SqlBulkCopy(conn)
sbc.DestinationTableName = strDesTable;
sbc.WriteToServer(dt);
通过以上步骤,可以实现VFP到SQL的远程数据迁移,至于SQL SERVER中的数据到导出到DBF,通过管理工具中的DTS数据转换服务很方便地实现。
希望本文能给那些需要进行VFP和SQL SERVER进行数据迁移的用户一些帮助,也希望广大IT同仁对本文存在的不足能给予指正。
[1]王倩,王伟.基于ASP.NET的数据迁移方法[J].现代电子技术 ,2008(18):71-73.
[2]柴荣君,马惠铖.基于VFP环境下进行数据转移的方法探究[J].科技资讯 ,2010(30):28.