给你段我程序里面拷贝出来的代码,肯定能用,
Function UpdateTable(DBFFileName:String):Boolean;
const
SqlProvider = 'Provider=Microsoft.Jet.OLEDB.4.0;'+
'Data Source=%S;'+
'Extended Properties=dBase 5.0;'+
'Persist Security Info=False';
AppendSql = 'SELECT * Into Code_CMCODE IN %S From %S'; //表名自己到时更改一下
var tpFileName,tpPath, tpsql:String;
tpForm:TForm;
tpConn:TADOConnection;
begin
Result:=False;
//开始更新文件
tpFileName:=DBFFileName;
tpPath:=ExtractFilePath(tpFileName);
if StrIsEnd('/',tpPath) then
Delete(tpPath, length(tpPath), 1);
tpFileName:= ExtractFileName(tpFileName);
if CountStrTimes('.',tpFileName) = 2 then //这两句是取文件名字,不
tpFileName := GetAppointStr('.', tpFileName, 1); //带扩展名的函数,自已用COPY,POS函数重写一下即可。实现的功能就是去掉文件扩展名
if StrIsEmpty(tpFileName) or StrIsEmpty(tpPath) then
Abort;
try
tpConn:=TADoConnection.Create(nil);
try
tpConn.LoginPrompt := False;
tpConn.ConnectionString:=Format(SqlProvider,[tpPath]);
tpSql := GetConn(utConn); //这是一个将连接SQL服务器的串,转换成连接DBF串的函数,见后面。参数只要给一个ADO连接SQL的ADOCONNECTION对象就可以了。
tpSql := Format(AppendSql, [tpSql, tpFileName]);
tpConn.Execute(tpSql);
Finally
tpConn.Free;
end;
end;
Function GetConn(Conn:TADOConnection):String;
var ConnStr,tpRtn, tpStr:String;
tpConn: TStrings;
begin
ConnStr:=Conn.ConnectionString;
tpRtn:=ConnStr+';';
try
tpConn:=TStringList.Create;
while Length(Trim(tpRtn))>0 do begin
tpConn.Add(copy(tpRtn,1,pos(';',tpRtn)-1));
delete(tpRtn,1,pos(';',tpRtn));
end;
tpRtn:='[ODBC] [ODBC;Driver=SQL Server;UID=';
tpStr:=tpConn.Values['User ID'];
tpRtn:=tpRtn+tpStr+';PWD=';
tpStr:=tpConn.Values['Password'];
tpRtn:=tpRtn+tpStr+';Server=';
tpStr:=tpConn.Values['Data Source'];
tpRtn:=tpRtn+tpStr+';DataBase=';
tpStr:=tpConn.Values['Initial Catalog'];
tpRtn:=tpRtn+tpStr+';]';
finally
tpConn.Free;
end;
Result:=tpRtn;
End;
上面这个功能我已经用了很多了,追加几万条的记录都未出错过,关键有一点需要注意的就是,如果DBF是VFP高于2.X版本的数据库表,那么需要转换成 2.X才能执行,否则会报文件格式错, 方法就是安装一个VFP,然后打开待升级的文件,运行一下
COPY TO XXXX.DBF FOX2X
就可以了。
其他的类似用vfpoledb.dll来提供对OLE连接的支持了,或者OPENSOURCE等,都不是很好,只有这种方法是最快最稳定的。