刚从主管那里接到一任务,可不知如何下手,请高手赐教:任务是:  自动监控一指定文件目录夹,如有新文件,检测此文件是文本文件还是EXCEL文件还是DBF文件等,然后调用一接口将其导入数据库中,请问这接口该如何做,请给点思路,多谢,分不够再开贴另加?

解决方案 »

  1.   

    主管可能想用我做一个通用的导入导出的接口,如监视的文件夹有新的文件,
      如是 文本文件 就调用接口中的文本文件导入数据库的方法
      如是 Excel文件 就调用接口中的Excel文件导入数据库的方法
      如是 dbf 就调用接口中的dbf文件导入数据库的方法
      如是 xml 就调用接口中的XML导入数据库的方法  
      ....大家说,是不是这个意思啊?
      

  2.   

    type
      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;
      

  3.   

    type  //导入导出数据库类,它是一个抽象产品
      //仅仅声明了所有对象共有的接口,并不实现他们
      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;
      

  4.   

    http://www.52z.com/info/ArticleView/2004-11-7/Article_View_34647.Htm
      

  5.   

    TO:outer2000(天外流星) 向Excel查询select * from OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;HDR=yes;database=c:\book1.xls;','select * from [Sheet1$]') where c like '%f%'select * from 
    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 客户端也能运行的导入导出引擎。
      

  6.   

    TO: chenfeng3000(信心是用心血换来的)
         这个接口,对数据源的数据过滤有要求么
      

  7.   

    大侠!
    给我发份代码把!
    [email protected]
      

  8.   

    告诉你一个最快的方法,用SQLServer连接DBF
    在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]
      

  9.   

    谢谢:hqhhh(枫叶)  但这一些都要装SQL Server客户端才支持;  我现在是这样做的:type
      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;
      

  10.   

    function TfactoryDTS.Factory1(FileName,TableName:String): IDTS;
    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;
      

  11.   


    //**************************************************************
    //功能: 将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;