刚从主管那里接到一任务,可不知如何下手,请高手赐教:任务是: 自动监控一指定文件目录夹,如有新文件,检测此文件是文本文件还是EXCEL文件还是DBF文件等,然后调用一接口将其导入数据库中,请问这接口该如何做,请给点思路,多谢,分不够再开贴另加?
解决方案 »
- 请大虾介绍dephi的书籍
- 我用DELPHI7怎么能把以前用的QUICKREPORT做的打印表编辑修改啊
- dbedit的自动保存问题?
- 救命,倒库 高分
- 点击checklistbox内的选项,为什么发生这种错误?
- 极简单的问题,可我不会!怎样在Application.MessageBox方法中显示变量?
- 我想买手机,大家能推荐几款吗?
- 关于报表的问题?
- 计算字段的问题,50分,答对就马上给
- 征友启事:当程序员没时间拍拖,请同病相怜的美眉与我联系:[email protected]。
- 有谁知道DOS文本模式字体和WINDOWS哪种字体最象?
- ▲△▲24 Hours of Delphi▲△▲認識一下Delphi精英
如是 文本文件 就调用接口中的文本文件导入数据库的方法
如是 Excel文件 就调用接口中的Excel文件导入数据库的方法
如是 dbf 就调用接口中的dbf文件导入数据库的方法
如是 xml 就调用接口中的XML导入数据库的方法
....大家说,是不是这个意思啊?
IDTD = interface
function TxtToDB(FileName,TableName:String):Boolean;
function ExcelToDB(FileName,TableName:String):Boolean;
function XmlToDB(FileName,TableName:String):Boolean;
...
end;type
TIDTD = class(TDTDObject,IDTD)
private
...
public
function TxtToDB(FileName,TableName:String):Boolean;
function ExcelToDB(FileName,TableName:String):Boolean;
function XmlToDB(FileName,TableName:String):Boolean;
...
end;
//仅仅声明了所有对象共有的接口,并不实现他们
IDTS = interface(IInterface)
procedure SetTableName(TableName:String);
procedure SetFileName(FileName:String);
function FileToDB(TableName:String): Boolean; //导入数据库
function DBToFile(TableName:String): Boolean; //导出数据库
end; //文本文件导入导出数据库,导入导出数据库类的具体化
TTxtToDB = class(TInterfacedObject, IDTS)
private
FTableName : String;
FFileName : String;
public
procedure SetTableName(TableName:String);
procedure SetFileName(FileName:String);
function FileToDB(TableName:String): Boolean; //导入数据库
function DBToFile(TableName:String): Boolean; //导出数据库
end; //EXCEL文件导入导出数据库,导入导出数据库类的具体化
TExcelToDB = class(TInterfacedObject, IDTS)
private
FTableName : String;
FFileName : String;
public
procedure SetTableName(TableName:String);
procedure SetFileName(FileName:String);
function FileToDB(TableName:String): Boolean; //导入数据库
function DBToFile(TableName:String): Boolean; //导出数据库
end; //XML文件导入导出数据库,导入导出数据库类的具体化
TXmlToDB = class(TInterfacedObject, IDTS)
private
FTableName : String;
FFileName : String;
public
procedure SetTableName(TableName:String);
procedure SetFileName(FileName:String);
function FileToDB(TableName:String): Boolean; //导入数据库
function DBToFile(TableName:String): Boolean; //导出数据库
end; //导入导出数据库类,它就是工厂类,负责给出三种文件导入导出数据库的实例
TfactoryDTS = class(TObject)
public
//1、注意 class 关键字,它定义工厂方法 Factory 是一个静态函数,可以直接使用
//2、注意返回值,他返回的是最抽象的产品 导入导出数据库 类
//3、注意他有一个参数,来告诉工厂创建哪一种 导入导出数据库类
class function Factory(WhichFile,TableName:string): IDTS;
end; //声明一个异常,这不是重点
NoThisFileToDB = class(Exception)
end;
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\book1.xls',[sheet1$])1)hdr=yes时可以把xls的第1行作为字段看待,如第1个中hdr=no的话,where时就会报错
2)[]和美圆$必须要,否则M$可不认这个账-----------------------------------------------------------------------------
我想问一下,采用此方法向EXCEL查询数据,要不要在客户端装SQL server 客户端才能运行此查询呢?
BCPmaster..xp_cmdshell'bcp "serv-htjs.dbo.serv_user" out "c:\book2.xls" -c -q -S"." -U"sa" -P"sa"'-----------------------------------------------------------------------------
如采用BCP方法导出数据至EXCEL,则必须操作方的系统里装装SQL server 客户端才能运行,可我想在操作方的系统里不装SQL server 客户端也能运行的导入导出引擎。
这个接口,对数据源的数据过滤有要求么
给我发份代码把!
[email protected]
在SQLServer中执行
SELECT * into bmk
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="e:\share";User ID=Admin;Password=;Extended properties=dBase 5.0')...bmk
这样就可以把e:\share中的bmk.dbf表导入到Sqlserver中,速度是最快在Form上放一个ADOConnection,连结指向目标Access库比如txt文件在c:\temp\aaaa.txt
就执行
ADOConnection.Connected := True;
ADOConnection.Execute('Select * Into abcd From [Text;Database=c:\temp].aaaa.txt');txt导入SQLServer
select * from OpenRowset('MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};
DefaultDir=c:\temp;','select * from aaaa.txt')
把Excel导入到Access中,同txt类似
select * into <table name> from [excel 8.0;database=<filename>].[<sheetname>$]Excel联接ADO串
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\a.xls;Extended
Properties="Excel 8.0;HDR=Yes;";Persist Security Info=False
Extended Properties参数属性这样写 Excel 5.0;HDR=YES;IMEX=1
IMEX=1就是指混合型转换为文本SQLServer从Excel取数
SELECT *
FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="C:\temp\b.xls";Extended Properties="Excel 5.0;HDR=Yes;";Persist Security Info=False')...sheet1$c:\temp\aaa.dbf to Access,
ADOConnection 指向Access
语句是 select * into bbb from aaa in 'c:\temp' 'dbase 5.0;'sql server导出到access
ADOConnection 指向Access
SELECT * into table FROM Tab1 IN [ODBC]
[ODBC;Driver=SQL Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo;]如何把SQL Server的表导出到Access、Text、Dbf。
当然可以在程序中运行SQL Server表导出和txt导入一个道理基本上都是用Jet4.0 和 ODBC连结实现
先用用Jet4.0连结dbf,access,txt然后利用SQL语句导出导入在此我就不详细说了,一句话,都可以的
列出连结串属性Extended properties,
DBase 5.0
DBASE IV
FoxPro 3.0
Paradox 7.X
Excel 8.0
text;HDR=YES;FMT=DelimitedSELECT * into aaa
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\temp\";User ID=Admin;Password=;Extended properties=Text')...[bb#txt]
TReadyDTS = class(TObject)
private
{ Private declarations }
FUrlFileName : String; //数据库连接文件名;
FDBServer,FDBName,FDBUser,FDBPasswd : String; //数据库服务器名,数据库名,用户名,密码
FTableName : String; // 表名
FField : String ; //字段集名
FCondition : String ; // SQL语句条件
FFileName : String; // 文件名
FSpacer : String ; //分隔符;
FFixedLenStr : string; //定长分配字符串;规格:1:8;2:10;3:6;4:50
FFirstRecIsField : Boolean; //第一条记录是不是字段名;
FDelimiter : Char; //Xml节点路径分隔符;
FXmlDataNodePath : String; //Xml数据节点路径;
FXmlStructNodePath : String ;//Xml字段节点路径;
FADOCon : TADOConnection ;
protected
procedure SetUrlFileName(UrlFileName:String);
procedure SetDBServer(DBServer:String);
procedure SetDBName(DBName:String);
procedure SetDBUser(DBUser:String);
procedure SetDBPasswd(DBPasswd:String);
procedure SetTableName(TableName:String);
procedure SetField(Field:String);
procedure SetCondition(Condition:String);
procedure SetFileName(FileName:String);
procedure SetSpacer(Spacer:String);
procedure SetFixedLenStr(FixedLenStr:String);
procedure SetFirstRecIsField(FirstRecIsField:Boolean);
procedure SetDelimiter(Delimiter:Char);
procedure SetXmlDataNodePath(XmlDataNodePath:String);
procedure SetXmlStructNodePath(XmlStructNodePath:String);
procedure SetADOCon(ADOCon:TADOConnection);
public
{ Public declarations }
constructor create();
destructor Destroy();override;
property UrlFileName : String read FUrlFileName write SetUrlFileName ;
property DBServer : String read FDBServer write SetDBServer ;
property DBName : String read FDBName write SetDBName ;
property DBUser : String read FDBUser write SetDBUser ;
property DBPasswd : String read FDBPasswd write SetDBPasswd ;
property TableName : String read FTableName write SetTableName ;
property Field : String read FField write SetField ;
property Condition : String read FCondition write SetCondition ;
property FileName : String read FFileName write SetFileName ;
property Spacer : String read FSpacer write SetSpacer ;
property FixedLenStr : String read FFixedLenStr write SetFixedLenStr ;
property FirstRecIsField : Boolean read FFirstRecIsField write SetFirstRecIsField default true ;
property Delimiter : Char read FDelimiter write SetDelimiter ;
property XmlDataNodePath : String read FXmlDataNodePath write SetXmlDataNodePath ;
property XmlStructNodePath : String read FXmlStructNodePath write SetXmlStructNodePath;
property ADOCon : TADOConnection read FADOCon write SetADOCon ;
end;type
//导入导出数据库类,它是一个抽象产品
//仅仅声明了所有对象共有的接口,并不实现他们
IDTS = interface(IInterface)
['{A44587E1-953D-481E-ABC6-A9B1902403C8}']
function GettReadyDTS:TReadyDTS;
procedure SetReadyDTS(ReadyDTS:TReadyDTS);
property ReadyDTS : TReadyDTS read GettReadyDTS write SetReadyDTS ;
function FileToDB: Boolean; //导入数据库
function DBToFile: Boolean; //导出数据库
end; TBaseDTS = class(TInterfacedObject, IDTS)
private
FReadyDTS : TReadyDTS ;
public
constructor create();
destructor Destroy();override;
function GettReadyDTS:TReadyDTS;
procedure SetReadyDTS(ReadyDTS:TReadyDTS);
property ReadyDTS : TReadyDTS read GettReadyDTS write SetReadyDTS ;
procedure WriteLog(Func: string;EMessage: String); //写日志
function FileToDB: Boolean;virtual; //导入数据库
function DBToFile: Boolean;virtual; //导出数据库
end; //EXCEL文件导入导出数据库,导入导出数据库类的具体化
TExcelDTS = class(TBaseDTS)
function FileToDB:Boolean;override; //导入数据库
function DBToFile:Boolean;override; //导出数据库
end; //文本文件导入导出
TTxtDTS = class(TBaseDTS)
function FixedTxtToDB:Boolean; //定长文本文件导入数据库
function SpacerTxtToDB:Boolean; //分隔符文件导入数据库
function DbToFixedTxt:Boolean ; //从数据库导出至定长文本文件
function DbToSpacerTxt:Boolean ; //从数据库导出至分隔符文本文件
function FileToDB:Boolean;override; //导入数据库
function DBToFile:Boolean;override; //导出数据库
end; //Xml文件导入导出数据库
TXmlDTS = class(TBaseDTS)
function FileToDB:Boolean;override; //导入数据库
function DBToFile:Boolean;override; //导出数据库
end; //Dbf文件导入导出数据库
TDbfDTS = class(TBaseDTS)
function FileToDB:Boolean;override; //导入数据库
function DBToFile:Boolean;override; //导出数据库
end; //导入导出数据库类,它就是工厂类,负责给出三种文件导入导出数据库的实例
TfactoryDTS = class(TObject)
public
//1、注意 class 关键字,它定义工厂方法 Factory 是一个静态函数,可以直接使用
//2、注意返回值,他返回的是最抽象的产品 导入导出数据库 类
//3、注意他有一个参数,来告诉工厂创建哪一种 导入导出数据库类
// WhichFile:文件名,TableName:表名;Condition:条件;s:分隔符;FirstRecIsField:第一条记录是否为字段名;
function Factory1(FileName,TableName:String): IDTS;
class function Factory(ReadyDTS:TReadyDTS): IDTS;
end; //声明一个异常,这不是重点
NoThisFileToDB = class(Exception) ;
NoJoinDB = class(Exception) end;
var
FileExt : String;
DTS : IDTS ;
begin
//返回文件后缀名
FileExt := LowerCase(ExtractFileExt(FileName));{ //测试能不能连接数据库;
try
ReadyDTS.ADOCon.Connected := true;
except
Raise NoJoinDb.Create('不能连接数据库!');
exit;
end;
} //分隔符文本文件;
if (FileExt = '.txt') then
begin
DTS := TTxtDTS.Create();
DTS.ReadyDTS.FileName := FileName ;
DTS.ReadyDTS.TableName := TableName ;
Result := DTS ;
end
else
//Excel;
if (FileExt = '.xls') then
begin
DTS := TExcelDTS.Create();
DTS.ReadyDTS.FileName := FileName ;
DTS.ReadyDTS.TableName := TableName ;
Result := DTS ;
end
else
//Xml;
if (FileExt = '.xml') then
begin
DTS := TXmlDTS.Create();
DTS.ReadyDTS.FileName := FileName ;
DTS.ReadyDTS.TableName := TableName ;
Result := DTS ;
end
else
//Dbf;
if (FileExt = '.dbf') then
begin
DTS := TDbfDTS.Create();
DTS.ReadyDTS.FileName := FileName ;
DTS.ReadyDTS.TableName := TableName ;
Result := DTS ;
end
else
Raise NoThisFileToDB.Create('没有此类文件导入导出数据库!');
end;
//**************************************************************
//功能: 将Dbf文件中的数据导入到SQL Server数据库中
//說明:
//输入:
//输出: true 导出成功 false 导出失败
//作者: 侯磊峰
//日期: 2005-7-15
//备注:
//*******************************************************************
function TDbfDTS.FileToDB: Boolean;
type
//dbf文件头结构
Tdbf_head = record
vers : char ; //版本标志
yy,mm,dd :Byte; // 最后更新年、月、日
no_recs : longword ; // 文件包含的总记录数;
head_len,rec_len : word; //文件头长度,记录长度
reserved : array[0..19] of char ;
end;
//dbf字段描述结构
Tdbf_field = record
field_name : array[0..10] of char ; //字段名称;
field_type : char; //字段类型
offset : longword; //偏移量
field_length : byte; //字段长度
field_decimal : byte ; //浮点数整数部分长度
reserved1 : array[0..1] of char; //保留
dbaseiv_id : char; //DBASE IV work area id
reserved2 : array[0..9] of char; //
production_index : char ; //
end;
//dbf字段值
TDBFField = record
Name : String[10];
First : Integer;
Len : Integer;
FieldType : String[1];
Value : String;
end;
var
f : File;
p : ^Tdbf_head;
P1 :^Tdbf_field ;
No_Recs,Head_Len,Rec_Len,Rec_Count : Integer;
Buf : pchar;
Read_Count : Integer;
i,j : Integer;
DbfField : Array of TDbfField ;
LenCount : Integer;
RecordValue : String; Ads : TADODataSet ;
Field,SqlStr : String;
begin
Result := False ; // 1 获得Field,执行ADS;
Field := Trim(ReadyDTS.Field) ;
if (Length(Field) = 0) or (Field = '*') then //所有字段
SqlStr := 'Select * From '+ReadyDTS.TableName+' Where 0=1'
else
SqlStr := 'Select '+Field+ ' From '+ReadyDTS.TableName+' Where 0=1' ; // 2 创建Ads
Ads := TADODataSet.Create(nil);
Ads.Connection := ReadyDTS.ADOCon;
try
ADS.Close;
ADS.CommandText := SqlStr;
ADS.Open;
except
on E:Exception do
begin
writeLog('TDbfDTS.FileToDB',E.Message);
MessageBox(0,pchar('字段名'+Field+'有错!!'),'',MB_ICONERROR+MB_OK);
Ads.Free;
exit;
end;
end; AssignFile(f,ReadyDTS.FileName);
Reset(f,1);
try
p := AllocMem(sizeof(Tdbf_head));
BlockRead(f,P^,Sizeof(Tdbf_head));
//记录总数
No_Recs := P^.no_recs;
//头文件长度;
Head_Len := P^.head_len ;
//记录长度;
Rec_Len := P^.rec_len;
//计算字段总数;
Rec_Count := (Head_Len -296) div 32 ;
SetLength(DBFField,Ads.Fields.Count);
LenCount := 1;
Seek(f,Sizeof(Tdbf_head));
p1 := Allocmem(sizeof(Tdbf_Field)); for i := 0 to Rec_Count-1 do
begin
BlockRead(f,P1^,sizeof(Tdbf_Field)); Field := P1^.field_name ;
for j:=0 to Ads.Fields.Count - 1 do
begin
if UpperCase(Field)=UpperCase(Ads.Fields[j].FieldName) then
begin
DBFField[i].First := LenCount ;
DBFField[i].Name := P1^.field_name;
DBFField[i].Len := P1^.field_length ;
DBFField[i].FieldType := P1^.field_type ;
Break;
end;
end; Seek(f,(i+1)*Sizeof(Tdbf_Field)+Sizeof(Tdbf_head));
LenCount := LenCount + P1^.field_length ;
end; ReadyDTS.ADOCon.BeginTrans;
try
Seek(f,P^.head_len);
buf := AllocMem(Rec_Len);
for i:=0 to No_Recs - 1 do
begin
BlockRead(f,Buf^,Rec_Len);
RecordValue := Buf ;
RecordValue := Trim(RecordValue);
Ads.Append;
for j:=0 to Ads.Fields.Count-1 do
begin
Dbffield[j].Value :=Copy(RecordValue,DBFField[j].First,DBFField[j].Len);
Ads.FieldValues[DbfField[j].Name] := DbfField[j].Value;
end;
Ads.Post;
Seek(f,(i+1)*rec_len+P^.head_len);
end;
ReadyDTS.ADOCon.CommitTrans;
Result := true ;
except
On e : Exception do
begin
ReadyDTS.ADOCon.RollbackTrans;
WriteLog('TDbfDTS.FileToDB',E.Message);
MessageBox(0,'读Dbf数据或存Sql Server数据库错误!!','错误',MB_ICONERROR+MB_OK);
end;
end;
finally
FreeMem(P);
FreeMem(P1);
FreeMem(buf);
CloseFile(f);
end;
end;