吳昊 江蘇省木瀆高級中學
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.
