请教关于数据库开发的整体设计
情况是这样的,我想把以前的一个用.net写的软件用c++builder重写一遍,因为实在受不了框架包的臃肿
因为之前还没有用过c++builder,所以有些问题想请教大家一下
之前用.net写的时候分层了,数据库相关的操作都封装成了DAL,操作数据的时候不用关心打开连接关闭连接这些细节了
那么在c++builder里面应该怎么处理呢?
bool __fastcall TFrmLogin::Login(){ String sLogin = "select count(*) from sys_user where username = '"; sLogin += cbUserName->Text.Trim() ; sLogin += "' and password = '"; sLogin += EditPassword->Text.Trim(); sLogin += "'"; bool rt = false; try { pQuery->Close(); pQuery->SQL->Clear(); pQuery->SQL->Add(sLogin); pQuery->Open(); rt = pQuery->Fields->Fields[0]->AsInteger != 0; } catch(Exception &e) { String Msg = "出现一个异常:\n" + e.Message; Application->MessageBox(Msg.c_str(), L"异常", MB_OK); pQuery->Close(); } return rt;}String sLogin = "select count(*) from sys_user where username = '"; sLogin += cbUserName->Text.Trim() ; sLogin += "' and password = '"; sLogin += EditPassword->Text.Trim(); sLogin += "'";
[解决办法]
觉得不好用,可以封装一下,自己认为如何好用就如何办。
例如很多情况下均需要返回一个数据集,那么你可以定义:
TDataSet *GetSQLShareDataSet(String SQL);//返回的数据集为全局共用,不能释放。
TDataSet *GetSQLDataSet(String SQL);//返回一个数据集,必须自行析构。
这样就方便多了.
对于常用只需要返回一个字段的语句,可以定义
Variant GetSQLResultValue(String SQL);
而这些小函数均很容易写。
上面例子就可以写成:
String SQL_Login = "select count(*) from sys_user where username = '"\
+ Edit1->Text.Trim() +"' and [password] = '"+Edit2->Text.Trim()+"'";
int Count = GetSQLResultValue(SQL);
if(Count > 0 ) {...}
这样写起代码,就整洁了很多。至于异常及事件日志,则完全可以封装在这些小函数内。
如果你愿意封装参数,则可以这样做:
TDataSet *GetSQLShareDataSet(String SQL, TParam &V1);
TDataSet *GetSQLShareDataSet(String SQL, TParam &V1,TParam &V2);
TDataSet *GetSQLShareDataSet(String SQL, TParam &V1,TParam &V2,TParam &V3);
...
可以一直写下去,一般8个就足够足够用了。好象说新的模板语法(或Boost库)可以不用这样写也能实现一样的功能,我落后了,不知道如何做,只能出如此笨招。C++的模板语法很强大,要学习的地方太多。
这么做。看起来是麻烦,但是用起来却方便。注意函数库是为了编程方便而使用的,这类简单而又实在的技巧,用起来还真方便。至少比
TDataSet *GetSQLShareDataSet(String SQL, TParam *V1,int count);
好用。虽然用TParam *V1,int count封装少很多代码,但使用起来不方便。
写好了之后,作为一个函数库共享,用起来还是可以的,效率也很高。至少我就是类似这样用的。