最近写程序有些迷茫
是个数据库程序,类似于进销存,以前写程序都比较单纯,写数据库程序时突然不明白面向对象是什么意思了,似乎数据库程序里所有的窗体都有关联,没有办法分开为模块。
不明白其他人怎么做的,有没有什么书能点拨我一下。
[解决办法]
数据库操作建议分装到类中,这样成应该清晰一点!
[解决办法]
数据库是一个单独的模块
给你看一个我写的
虽然乱,但是还勉强可以用
//---------------------------------------
#pragma hdrstop
#include "u_Database.h "
#include "hzy_Const.h "
#include "u_HeTongGL.h "
//#define hzy_DEBUG
//---------------------------------------
hzy_Database::hzy_Database(){
//todo:
}
hzy_Database::hzy_Database(const String& sServer,const String& sUser,const String& sPassword,const String& sDatabase){
//todo:
_conn = new TADOConnection(NULL);
//here should get the config files to load server information
/*
String _connStr = "Provider=SQLOLEDB.1;Password= ";
_connStr += sPassword;
_connStr += ";Persist Security Info=True;User ID= ";
_connStr += sUser;
_connStr += ";Initial Catalog= ";
_connStr += sDatabase;
_connStr += ";Data Source= ";
_connStr += sServer;
*/
//Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\htgl.mdb;Persist Security Info=False
//Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=C:\htgl.mdb;Mode=Share Deny None;Extended Properties= " ";Jet OLEDB:System database= " ";Jet OLEDB:Registry Path= " ";Jet OLEDB:Database Password= " ";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password= " ";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don 't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
String _connStr = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source= ";
_connStr = _connStr + sDatabase;
_connStr = _connStr + ";Mode=Share Deny None;Extended Properties= " ";Jet OLEDB:System database= " ";Jet OLEDB:Registry Path= " ";Jet OLEDB:Database Password= " ";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password= " ";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don 't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False ";
_conn-> ConnectionString = _connStr;
try{
_conn-> LoginPrompt = false;
_conn-> KeepConnection = true;
_conn-> Connected = true;
_query = new TADOQuery(NULL);
_query-> Connection = _conn;
//now use _query
}
catch(...){
//error
ShowMessage(DatabaseUnConnected);
}
}
hzy_Database::~hzy_Database(){
_query-> Close();
delete _query;
_query = NULL;
_conn-> Connected = false;
delete _conn;
_conn = NULL;
}
int __fastcall hzy_Database::hzy_ExecSQL(const String& s_SQL)
{
//TODO: Add your source code here
if(this-> _conn-> Connected == true){
//TODO: Add your source code here
this-> _query-> SQL-> Clear();
this-> _query-> SQL-> Add(s_SQL);
this-> _query-> Prepared;
try{
return this-> _query-> ExecSQL();
#ifdef hzy_DEBUG
ShowMessage(s_SQL + "执行成功 ");
#else
//ShowMessage( "执行成功 ");
#endif
}
catch(...){
ShowMessage(s_SQL + DatabaseChuLiException);
return -1;
}
}
else{
ShowMessage(DatabaseUnConnected);
return -1;
}
}
void __fastcall hzy_Database::hzy_ExecSQL(const String& s_SQL, TADOQuery * adoq)
{
//TODO: Add your source code here
if(this-> _conn-> Connected == true){
//TODO: Add your source code here
adoq-> Connection = this-> _conn;
adoq-> SQL-> Clear();
adoq-> SQL-> Add(s_SQL);
adoq-> Prepared;
try{
adoq-> ExecSQL();
#ifdef hzy_DEBUG
ShowMessage(s_SQL + "执行成功 ");
#else
//ShowMessage( "执行成功 ");
#endif
}
catch(...){
ShowMessage(DatabaseChuLiException);
}
}
else{
ShowMessage(DatabaseUnConnected);
}
}
void __fastcall hzy_Database::hzy_OpenSQL(const String& s_SQL)
{
//TODO: Add your source code here
if(this-> _conn-> Connected == true){
//TODO: Add your source code here
this-> _query-> SQL-> Clear();
this-> _query-> SQL-> Add(s_SQL);
this-> _query-> Prepared;
try{
this-> _query-> Open();
#ifdef hzy_DEBUG
ShowMessage(s_SQL + "执行成功 ");
#else
//ShowMessage( "执行成功 ");
#endif
}
catch(...){
ShowMessage(DatabaseChuLiException);
}
}
else{
ShowMessage(DatabaseUnConnected);
}
}
void __fastcall hzy_Database::hzy_OpenSQL(TADOQuery * adoq, const String& s_SQL)
{
//TODO: Add your source code here
if(this-> _conn-> Connected == true){
//TODO: Add your source code here
adoq-> Connection = this-> _conn;
adoq-> SQL-> Clear();
adoq-> SQL-> Add(s_SQL);
adoq-> Prepared;
try{
adoq-> Open();
#ifdef hzy_DEBUG
ShowMessage(s_SQL + "执行成功 ");
#else
//ShowMessage( "执行成功 ");
#endif
}
catch(...){
ShowMessage(DatabaseChuLiException);
}
}
else{
ShowMessage(DatabaseUnConnected);
}
}
void hzy_Database::hzy_BatchProcess(TStringList *_Sql){
if(this-> _conn-> Connected == true){
//TODO: Add your source code here
_query-> Connection = this-> _conn;
this-> _conn-> BeginTrans();
try{
for(int i = 0 ; i < _Sql-> Count ; i++){
_query-> SQL-> Clear();
_query-> SQL-> Add(_Sql-> Strings[i]);
_query-> Prepared;
_query-> ExecSQL();
}
this-> _conn-> CommitTrans();
ShowMessage( "初始化成功! ");
}
catch(...){
this-> _conn-> RollbackTrans();
ShowMessage(DatabaseChuLiException);
}
}
else{
ShowMessage(DatabaseUnConnected);
}
}
[解决办法]
//---------------------------------------
#ifndef u_DatabaseH
#define u_DatabaseH
#include <vcl.h>
#include <adodb.hpp>
//---------------------------------------
class hzy_Database{
private:
TADOConnection * _conn;
//TADOQuery *_query;
public:
TADOQuery *_query;
hzy_Database();
hzy_Database(const String& sServer,const String& sUser,const String& sPassword,const String& sDatabase);
~hzy_Database();
int __fastcall hzy_ExecSQL(const String& s_SQL);
void __fastcall hzy_ExecSQL(const String& s_SQL, TADOQuery * adoq);
void __fastcall hzy_OpenSQL(const String& s_SQL);
void __fastcall hzy_OpenSQL(TADOQuery * adoq, const String& s_SQL);
void hzy_BatchProcess(TStringList *_Sql);
};
#endif
[解决办法]
继承是个不错的办法。
[解决办法]
我现在是用BCB6+MySQL的,所有对数据库的直接操作都由一个类来完成,
其它的都没有权去直接操作数据库,只有发SQL语句给该类创建的对象的份。
我感觉这样很方便,代码很好维护。
因为只要出错我就知道去这个类里查,其它地方我都不用管。
还有,要对操作数据库的方法进行改进时也很方便,因为我只要改这个类就行了,其它地方都不用改。
这个类提供什么功能接口人家就能用什么,它不提供的话别想用。
或者说别人要什么它就提供什么,以后说不定另外一个地方也要用到这个功能呢,到时候只要调用这个接口就行了,无需再拷贝代码或重新写