吳昊 江蘇省木瀆高級中學(xué)
VFP是Microsoft公司推出的可視化數(shù)據(jù)庫管理系統(tǒng)平臺,是功能強(qiáng)大的32位數(shù)據(jù)庫管理系統(tǒng),對于輕量化的數(shù)據(jù)管理系統(tǒng)開發(fā)來說,VFP是最為快捷高效的,時至今日,仍然有不少應(yīng)用是用VFP開發(fā),但隨著WEB應(yīng)用開發(fā)的需求越來越高,MYSQL、SQL、ORACLE這些數(shù)據(jù)庫管理軟件更適合網(wǎng)絡(luò)化時代的需要,本文就VFP數(shù)據(jù)如何轉(zhuǎn)入SQL SERVER來做一個探討。
要注意VFP和SQL SERVER之間的數(shù)據(jù)格式的區(qū)別,如果通過EXCEL進(jìn)行間接轉(zhuǎn)換,原有數(shù)據(jù)表的結(jié)構(gòu)就無法保證了,在做數(shù)據(jù)遷移時,需要把VFP和SQL SERVER的數(shù)據(jù)類型進(jìn)行對照,在轉(zhuǎn)換過程中,還需要注意到原數(shù)據(jù)中實(shí)際存放的信息,如果是字符型且?guī)в凶冮L中文的,如姓名字段,那么在遷入SQL SERVER時,對應(yīng)的數(shù)據(jù)類型應(yīng)該是nvarchar,否則會導(dǎo)致中文信息無法顯示。DBF中的時間類型字段T可以僅存儲時間,無年份日期值,在遷入SQL SERVER的datatime類型時會因為年份是0000而報錯,需要提前做好預(yù)處理。
由于dataset和sql server之間的銜接最方便,首先,通過oledb方式將DBF文件的數(shù)據(jù)讀取到dataset中,但在實(shí)際讀取時,OleDbDataAdapter的fill方法讀取到的字段長度是固定的(最大長度),為保證遷入SQL SERVER的同時節(jié)省空間,還需要通過FillSchema方法把原DBF的數(shù)據(jù)結(jié)構(gòu)保存下來:
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");
//數(shù)據(jù)保存在source表,結(jié)構(gòu)保存在structure表
conn.Close();
return thisDataSet;}
第二步,則是遍歷數(shù)據(jù)集中的結(jié)構(gòu)表,在SQL SERVER中建立對應(yīng)的數(shù)據(jù)表,這里需要做一個數(shù)據(jù)類型的轉(zhuǎn)換,以常見的字符型、整型、布爾型、日期型為例,由于是已經(jīng)讀取到datatable中,所以應(yīng)該是判斷系統(tǒng)的數(shù)據(jù)類型轉(zhuǎn)換為對應(yīng)的SQL SERVER中的數(shù)據(jù)類型:
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;}
根據(jù)讀取到的數(shù)據(jù)類型和字段長度,在SQL SERVER中建立好對應(yīng)的數(shù)據(jù)表:
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類,這個類用于數(shù)據(jù)庫之間大批量的數(shù)據(jù)傳遞。通常用于新、舊數(shù)據(jù)庫之間數(shù)據(jù)的更新。即使表結(jié)構(gòu)完全不同,也可以通過字段間的對應(yīng)關(guān)系,順利的將數(shù)據(jù)導(dǎo)過來,源數(shù)據(jù)可以用Datatable,也可以用SqlDataReader。因為SqlDataReader不占用內(nèi)存,如果是對大批量的數(shù)據(jù)復(fù)制,不需要事先導(dǎo)入到系統(tǒng),可以優(yōu)先采用DataReader方式,這兩個方式導(dǎo)入數(shù)據(jù)的效率,都要比直接insert into要高得多:
SqlBulkCopy sbc = new SqlBulkCopy(conn)
sbc.DestinationTableName = strDesTable;
sbc.WriteToServer(dt);
通過以上步驟,可以實(shí)現(xiàn)VFP到SQL的遠(yuǎn)程數(shù)據(jù)遷移,至于SQL SERVER中的數(shù)據(jù)到導(dǎo)出到DBF,通過管理工具中的DTS數(shù)據(jù)轉(zhuǎn)換服務(wù)很方便地實(shí)現(xiàn)。
希望本文能給那些需要進(jìn)行VFP和SQL SERVER進(jìn)行數(shù)據(jù)遷移的用戶一些幫助,也希望廣大IT同仁對本文存在的不足能給予指正。
[1]王倩,王偉.基于ASP.NET的數(shù)據(jù)遷移方法[J].現(xiàn)代電子技術(shù) ,2008(18):71-73.
[2]柴榮君,馬惠鋮.基于VFP環(huán)境下進(jìn)行數(shù)據(jù)轉(zhuǎn)移的方法探究[J].科技資訊 ,2010(30):28.