本人刚从java转到delphi上来做数据库开发
但是我发现 delphi一直都没有直接生成关系数据库到类映射和数据库操作类
所以特想和大家一起开发这个东西
喜欢在DELPHI上用面向对象开发数据库应用的兄弟门合作一下
做一个类似hibernate的东西,以加快delphi的oo应用

解决方案 »

  1.   

    顶一下
    [email protected]
      

  2.   

    搂主看样子Java用的搂火纯青了,一接触delphi就发现了这样的问题,很感兴趣于这样的话题:-)
      

  3.   

    水平一般
    前几天测试了一下,delphi标准控件的封装
    //数据库配置文件
    //支持sqlserver,access
    //dbset.ini
    ;数据库服务器的设置数据
    [sqlserver]
    serverAddress=192.168.13.173
    databaseName=AccountManage
    userName=notruiyi
    password=111111
    [access]
    databaseName=temp.mdb//读写ini文件生成access配置数据对象
    //fAccessSet.pas
    unit fAccessSet;interface
    uses IniFiles;type
    TAccessSet = class
    private
       d_access_db_name:string;
    public
       constructor create();
       destructor destroy();override;   function getAccessDBName():string;
    end;implementation
    const ACCESS_SET_FILE = '.\dbSet.ini';constructor TAccessSet.create();
    var myIniFile:Tinifile;
    begin
       inherited;
       myIniFile := Tinifile.Create(ACCESS_SET_FILE);
       d_access_db_name := myIniFile.ReadString('access','databaseName','no');
       myIniFile.Free;
    end;//读写ini文件生成sqlserver配置数据对象
    //fSQLServerSet.pas
    unit fSQLServerSet;interface
    uses IniFiles;type
    TSQLServerSet = class
         private
            d_server_name:string;
            d_database_name:string;
            d_user_name:string;
            d_password:string;
         public        constructor create();
            destructor destroy();override;        function getServerName():string;
            function getDatabaseName:string;
            function getUserName:string;
            function getPassword:string;end;implementation
    const   SQLSERVER_SET_FILENAME  = '.\dbSet.ini';        destructor TSQLServerSet.destroy();
            begin
               inherited;
            end;        constructor TSQLServerSet.create();
            var myIniFile:Tinifile;
            begin
                inherited;
                myIniFile := Tinifile.Create(SQLSERVER_SET_FILENAME);
                d_server_name := myIniFile.ReadString('sqlserver','serverAddress','no');
                d_database_name := myIniFile.ReadString('sqlserver','databaseName','no');
                d_user_name := myIniFile.ReadString('sqlserver','userName','no');
                d_password := myIniFile.ReadString('sqlserver','password','no');
                myIniFile.Free;
            end;        function TSQLServerSet.getServerName():string;
            begin
               Result := d_server_name;
            end;        function TSQLServerSet.getDatabaseName():string;
            begin
               Result := d_database_name;
            end;        function TSQLServerSet.getUserName():string;
            begin
               Result := d_user_name;
            end;        function TSQLServerSet.getPassword():string;
            begin
               Result := d_password;
            end;end.//从TADOConnection扩展的字定义Access连接对象
    //fAccessConnection.pas
    unit fAccessConnection;interface
    uses ADODB,Dialogs,Classes,fAccessSet;type
    TAccessConnection = class(TADOConnection)private
       procedure connectionBreak(Connection: TADOConnection ; var EventStatus: TEventStatus);
    public
       constructor create(var accessSet:TAccessSet);reintroduce;
       destructor destroy();override;
    end;implementation   constructor TAccessConnection.create(var accessSet:TAccessSet);
       begin
          inherited create(nil);
          self.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\'+accessSet.getAccessDBName +';Persist Security Info=False';
          self.LoginPrompt := false;
          self.Open();
          self.OnDisconnect := self.connectionBreak;
       end;   destructor TAccessConnection.destroy();
       begin
          self.Close;
          inherited;
       end;   procedure TAccessConnection.connectionBreak(Connection: TADOConnection ; var EventStatus: TEventStatus);
       begin
          ShowMessage('Access数据库连接已经断开!');
       end;end.//从TADOConnection扩展的字定义sqlserver连接对象
    //fSQLServerConnection.pas
    unit fSQlServerConnection;interface
    uses ADODB,Dialogs,Classes,fSQLServerSet;type
    TSQLServerConnection = class(TADOConnection)private
       procedure connectionBreak(Connection: TADOConnection ; var EventStatus: TEventStatus);public
       constructor create(var sqlServerSet:TSQLServerSet);reintroduce;
       destructor destroy();override;
    end;implementation   constructor TSQLServerConnection.create(var sqlServerSet:TSQLServerSet);
       begin
           inherited create(nil);
           self.ConnectionString := 'Provider=SQLOLEDB.1;Initial Catalog=' + sqlServerSet.getDatabaseName  + ';Data Source=' + sqlServerSet.getServerName  ;
           if sqlServerSet.getUserName <> 'no' then
              self.ConnectionString := self.ConnectionString + ';User ID=' +  sqlServerSet.getUserName() ;
           if sqlServerSet.getPassword <> 'no' then
              self.ConnectionString := self.ConnectionString + ';Password=' + sqlServerSet.getPassword() ;
           self.LoginPrompt := false;
           self.Open();
           self.OnDisconnect := self.connectionBreak;
       end;   destructor TSQLServerConnection.destroy();
       begin
          self.Close;
          inherited;
       end;
       procedure TSQLServerConnection.connectionBreak(Connection: TADOConnection;
      var EventStatus: TEventStatus);
       begin
          ShowMessage('Sqlserver数据库服务器连接已经断开!');
       end;end.//自定义command对象
    //fCustomCommand.pas
    unit fCustomCommand;interface
    uses ADODB,fSQLServerConnection,fAccessConnection;type
    TCustomCommand = class (TADOCommand)
       private
       public
          constructor create(var sqlserverConnection:TSQLServerConnection);reintroduce;overload;
          constructor create(var accessConnection:TAccessConnection);reintroduce;overload;
          destructor destroy();override;
    end;implementation      constructor TCustomCommand.create(var sqlserverConnection:TSQLServerConnection);
          begin
             inherited create(nil);
             self.Connection := sqlserverConnection;
          end;      constructor TCustomCommand.create(var accessConnection:TAccessConnection);
          begin
             inherited create(nil);
             self.Connection := accessConnection;
          end;      destructor  TCustomCommand.destroy();
          begin
             inherited;
          end;end.
      

  4.   

    //列对象
    //fXColumn.pas
    unit fXColumn;interface
    uses SysUtils;type
    XColumn = class
    private
       d_column_name : string;
       d_column_type : string;
    public
       constructor create();reintroduce;
       destructor destroy();override;   procedure set_column_name(the_column_name:string);
       procedure set_column_type(the_column_type:string);   function get_column_name():string;
       function get_column_type():string;   function get_translate_name():string;
    end;implementation   constructor XColumn.create();
       begin
          inherited create();
       end;   function XColumn.get_translate_name():string;
       begin
          if UpperCase(d_column_type) = 'INTEGER' then
             Result := 'IntToStr'
          else if (UpperCase(d_column_type) = 'DOUBLE') or (UpperCase(d_column_type) = 'FLOAT') then
             Result := 'FloatToStr'
          else
             Result := '';
          //   raise Exception.Create('Not supported Value Type.notruiyi,raised in fXColumn.');
       end;   destructor XColumn.destroy();
       begin
          inherited destroy();
       end;   procedure XColumn.set_column_name(the_column_name:string);
       begin
          d_column_name := the_column_name;
       end;   procedure XColumn.set_column_type(the_column_type:string);
       begin
          d_column_type := the_column_type;
       end;   function  XColumn.get_column_name():string;
       begin
          Result := d_column_name;
       end;   function XColumn.get_column_type():string;
       begin
          Result := d_column_type;
       end;
    end.//表格对象
    //fXTable.pas
    unit fXTable;interface
    uses classes,fXcolumn;type
    XTable = class
    private
       d_table_name:string;public
       d_xcolumn_list:TList;   constructor create();reintroduce;
       destructor destroy();override;   procedure set_table_name(the_table_name:string);
       function get_table_name():string;end;
    implementation   constructor XTable.create();
       begin
          inherited create();
          d_xcolumn_list := TList.Create;
       end;   destructor XTable.destroy();
       var i:Integer;
       var column:XColumn;
       begin
          for i:=0 to d_xcolumn_list.count-1 do
          begin
             column := d_xcolumn_list.Items[i];
             column.destroy;
          end;
          d_xcolumn_list.Destroy;
          inherited;
       end;   procedure XTable.set_table_name(the_table_name:string);
       begin
          d_table_name := the_table_name;
       end;   function XTable.get_table_name():string;
       begin
          Result := d_table_name;
       end;end.
    //access表格聚合对象
    //fXAccess.pas
    unit fXAccess;interface
    uses classes,fXTable;type
    XAccess = class
    private
       d_database_name:string;
    public
       d_xtable_list:TList;   constructor create();
       destructor destroy();override;   procedure set_database_name(the_database_name:string);
       function get_database_name():string;
    end;implementation   constructor XAccess.create();
       begin
          inherited create();
          d_xtable_list := TList.Create;
       end;   destructor XAccess.destroy();
       var i:Integer;
       var table:XTable;
       begin
          for i:=0 to d_xtable_list.count-1 do
          begin
             table := d_xtable_list.Items[i];
             table.destroy;
          end;
          d_xtable_list.Destroy;
          inherited;
       end;   procedure XAccess.set_database_name(the_database_name:string);
       begin
          d_database_name := the_database_name;
       end;   function XAccess.get_database_name():string;
       begin
          Result := d_database_name;
       end;end.//sqlserver表格聚合对象
    //fXSQLServer.pas
    unit fXSqlserver;interface
    uses classes,fXTable;type
    XSqlserver = class
    private
       d_database_name:string;
    public
       d_xtable_list:TList;   constructor create();
       destructor destroy();override;   procedure set_database_name(the_database_name:string);
       function get_database_name():string;
    end;implementation   constructor XSqlserver.create();
       begin
          inherited create();
          d_xtable_list := TList.Create;
       end;   destructor XSqlserver.destroy();
       var i:Integer;
       var table:XTable;
       begin
          for i:=0 to d_xtable_list.count-1 do
          begin
             table := d_xtable_list.Items[i];
             table.destroy;
          end;
          d_xtable_list.Destroy;
          inherited;
       end;   procedure XSqlserver.set_database_name(the_database_name:string);
       begin
          d_database_name := the_database_name;
       end;   function XSqlserver.get_database_name():string;
       begin
          Result := d_database_name;
       end;end.
      

  5.   

    高手们,帮忙看看偶的问题:
    http://community.csdn.net/Expert/topic/4200/4200306.xml?temp=.801861
      

  6.   

    表格配置xml文件
    //table_set.xml
    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
    <!DOCTYPE database [
      <!ELEMENT databases (sqlserver?,access?)>
      <!ELEMENT sqlserver (table+)>
      <!ELEMENT access (table+)>
      <!ELEMENT talbe (column+)>  <!ATTLIST sqlserver databasename CDATA #IMPLIED>
      <!ATTLIST table name CDATA #REQUIRED>
      <!ATTLIST column name CDATA #REQUIRED>
      <!ATTLIST column type CDATA #REQUIRED>
    ]><databases><sqlserver databasename="student_manage">
    <table name="student">
    <column name="student_id" type="string"></column>
    <column name="name" type="string"></column>
    <column name="age" type="Integer"></column>
    <column name="address" type="string"></column>
    <column name="time_in" type="string"></column>
    </table>
    <table name="lesson">
    <column name="lesson_id" type="string"></column>
    <column name="name" type="string"></column>
    <column name="address" type="string"></column>
    <column name="time_in" type="string"></column>
    </table>
    </sqlserver><access databasename="">
    <table name="t">
    <column name="1" type="1"></column>
    <column name="2" type="2"></column>
    <column name="3" type="3"></column>
    <column name="4" type="4"></column>
    </table>
    </access></databases>
      

  7.   

    //解析器程序
    //fDelphi_xml_explain.pas
    unit fDelphi_Xml_Explain;interface
    uses fXColumn,fXTable,fXSqlserver,fXAccess,XMLIntf{xml操作参考文件},XMLDoc{TXMLDocument参考},
         {FileCtrl文件例程}SysUtils{CreateDir}{Systemassert断言操作},xmldom{TDOMVendor},Activex,
         dialogs;type
    TDelphi_Xml_Explain = class
    private
       d_xml_file_name:string;
       d_xsqlserver:XSqlserver;
       d_xaccess:XAccess;   {解析sqlserver结点}
       procedure deal_sqlserver_node(var the_sqlserver_node:IXMLNode);
       {解析access结点}
       procedure deal_access_node(var the_access_node:IXMLNode);
       {处理XTable对象,形成新vo文件}
       procedure deal_xtable_to_vo(var the_xtable:XTable);
       {处理XTable对象,形成新dao文件}
       procedure deal_xtable_to_dao(var the_xtable:XTable;flag:Integer);public
       constructor create(xml_file_name:string);reintroduce;
       destructor destroy();override;   {启动解析}
       procedure explain();
       {根据解析结果,创建vo文件}
       procedure make_vo();
       {根据解析结果,创建dao文件}
       procedure make_dao();
    end;implementation
    const sqlserver_dao_flag :Integer = 0;
    const access_dao_flag :Integer = 1;   constructor TDelphi_Xml_Explain.create(xml_file_name:string);
       begin
          inherited create();
          d_xml_file_name := xml_file_name;
          d_xsqlserver := XSqlserver.create;
          d_xaccess := XAccess.create;
       end;   destructor TDelphi_Xml_Explain.destroy();
       begin
          d_xsqlserver.destroy;
          d_xaccess.destroy;
          CoUnInitialize;
          inherited;
       end;
      

  8.   

    //解析器第二段
       procedure TDelphi_Xml_Explain.explain();
       var inXmlDoc:IXMLDocument;
       var root,sqlserver_node,access_node,temp_node:IXMLNode;
       begin
           CoInitialize(nil);
           Writeln('开始加载xml文档对象');
           inXmlDoc := TXMLDocument.Create(nil);
           inXmlDoc.Active := true;
           inXmlDoc.LoadFromFile(d_xml_file_name);
           Writeln('获取xml根结点');
           root := inXmlDoc.DocumentElement;  
           Writeln('第一个根结点的子结点');
           temp_node := root.ChildNodes.First ;
           while temp_node <> nil do
           begin
              if(temp_node.NodeName = 'sqlserver') then
              begin
                 Writeln('开始处理sqlserver结点');
                 sqlserver_node := temp_node;
                 self.deal_sqlserver_node(sqlserver_node);
              end
              else if(temp_node.NodeName = 'access') then
              begin
                 Writeln('开始处理access结点');
                 access_node := temp_node;
                 self.deal_access_node(access_node);
              end;
              temp_node := temp_node.NextSibling;
           end;
           //CoUnInitialize;
       end;   procedure TDelphi_Xml_Explain.deal_sqlserver_node(var the_sqlserver_node:IXMLNode);
       var table_node,column_node:IXMLNode;
       var objXTable:XTable;
       var objXColumn:XColumn;
       begin
          table_node := the_sqlserver_node.ChildNodes.First;
          while table_node<>nil do
          begin
             objXTable := XTable.create;
             Writeln('处理表格'+table_node.Attributes['name']);
             objXTable.set_table_name(table_node.Attributes['name']);         column_node := table_node.ChildNodes.First;
             while column_node<> nil do
             begin
                objXColumn := XColumn.create;
                Writeln('处理列'+ column_node.Attributes['name']);            objXColumn.set_column_name(column_node.Attributes['name']);
                objXColumn.set_column_type(column_node.Attributes['type']);
                objXTable.d_xcolumn_list.Add(objXColumn);
                column_node := column_node.NextSibling;
             end;
             d_xsqlserver.d_xtable_list.Add(objXTable);
             table_node := table_node.NextSibling;
          end;
          Writeln('sqlserver结点处理完毕');
       end;   procedure TDelphi_Xml_Explain.deal_access_node(var the_access_node:IXMLNode);
       var table_node,column_node:IXMLNode;
       var objXTable:XTable;
       var objXColumn:XColumn;
       begin
          table_node := the_access_node.ChildNodes.First;
          while table_node<>nil do
          begin
             objXTable := XTable.create;
             Writeln('处理表格'+table_node.Attributes['name']);
             objXTable.set_table_name(table_node.Attributes['name']);
             
             column_node := table_node.ChildNodes.First;
             while column_node<> nil do
             begin
                objXColumn := XColumn.create;
                Writeln('处理列'+ column_node.Attributes['name']);
                objXColumn.set_column_name(column_node.Attributes['name']);
                objXColumn.set_column_type(column_node.Attributes['type']);
                objXTable.d_xcolumn_list.Add(objXColumn);            column_node := column_node.NextSibling;
             end;
             d_xaccess.d_xtable_list.Add(objXTable);
             table_node := table_node.NextSibling;
          end;
          Writeln('access结点处理完毕');
       end;   {vo文件存放在vo_solution文件夹下}
       procedure TDelphi_Xml_Explain.make_vo();
       var createResult:boolean;
       var i:Integer;
       var sqlserver_table:XTable;
       var access_table:XTable;
       begin
          
          if not DirectoryExists('dao_solution') then
          begin
             createResult := CreateDir('dao_solution');
             assert(createResult);
          end;
          for i := 0 to d_xsqlserver.d_xtable_list.Count -1 do
          begin
             sqlserver_table := d_xsqlserver.d_xtable_list[i];
             self.deal_xtable_to_vo(sqlserver_table);
          end;      for i := 0 to d_xaccess.d_xtable_list.Count -1 do
          begin
             access_table := d_xaccess.d_xtable_list[i];
             self.deal_xtable_to_vo(access_table);
          end;   end;