本人刚从java转到delphi上来做数据库开发
但是我发现 delphi一直都没有直接生成关系数据库到类映射和数据库操作类
所以特想和大家一起开发这个东西
喜欢在DELPHI上用面向对象开发数据库应用的兄弟门合作一下
做一个类似hibernate的东西,以加快delphi的oo应用
但是我发现 delphi一直都没有直接生成关系数据库到类映射和数据库操作类
所以特想和大家一起开发这个东西
喜欢在DELPHI上用面向对象开发数据库应用的兄弟门合作一下
做一个类似hibernate的东西,以加快delphi的oo应用
解决方案 »
- 锁定FORM问题即使鼠标双击也不能改变窗口大小!
- 如何得到一个字符在字符串中第一次出现的位置?在线等!
- 请问如何打开dll文件?急!
- 网页中有个连接的载体为图片,我如何取得该图片的名称?
- 那位高人能给我仔细说一下记录和指针????????????
- 如何在fastreport中根据条件改变字体颜色?
- Operator not applicable to this operand type
- 如何将配置信息写入.exe内(象ShareQQ)?
- 现在有一怪问题,请大家帮忙看看怎么解决?
- 大富翁可以进了...
- 如何让QRimage里显示的图片变为黑白的?
- 在线等待~~!怎样用delphi读取Excel表并倒入到Oracel中???
[email protected]
前几天测试了一下,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.
//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.
http://community.csdn.net/Expert/topic/4200/4200306.xml?temp=.801861
//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>
//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;
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;