读书人

关于使用数据库的几个小问题

发布时间: 2012-11-06 14:07:00 作者: rapoo

关于使用数据库的几个问题




这是服务器的软件大概像图上这样,许多终端通过TCP连接到服务器上,图上每行是一个终端,终端的一些信息等等,现在是自己写一些结构,链表这些来组织的,但是关闭软件时保存和打开会比较麻烦,想用数据库来管理,本地的就可以想用ACCESS的mdb,有下面几个问题.

1.在c++builder 2010中怎么使用数据库.(这方面的资料比较少,提供一些资料或简单的例子就可以,因为我只是保存一些文本之类的,也不会用到太复杂的东西)

2.每个终端登陆(连接上来的时候)都要配对一个用户名和密码,不同用户名的些终端也要分开来管理,是不是建对应数量的表?

3.客户端通过用户名和密码更新相应的终端列表到客户端软件上.(如果按上面的方法,怎么只把这张表的内容发给客户端软件)

4.客户端会上传文件上来通过服务器转发到终端上面,在数据库中可不可以存文件,不可以的话有什么其它办法,每个终端建一个文件夹放自己的文件,转发完后删除?

5.TCP服务器用的是INDY组件,在这里面应该是多线程的,有可能同时访问数据库文件,有没有问题?

[解决办法]
bcb里访问ACCESS使用ado控件很容易,多线程程序要注意访问冲突,如在线程里改写界面显示时使用Synchronize(...);不然就会出现假死状态,ACCESS属于桌面数据库,并发不能多
[解决办法]
1 一般用ADO连接数据库
2 这种情况一般按照实体-关系模型是建立几个相关联的表,比如终端是一个表,终端的一对多属性建立成另外的表等等
3 客户端要读取数据,对于LZ的这种情形,一般是客户端向服务器发出请求,如后服务器读取数据库,把结果返回给客户端,客户端不直接访问数据库
4 数据库不适宜保存大量的大文件,一般的做法是把文件存储在指定的目录中,然后在数据库中保存这些文件的路径
5 对于ACCESS这种文件型的数据库,在多线程访问的时候最好使用临界区进行一下同步
[解决办法]
1.使用ado
连接字符串AnsiString pConnStr="CONNECT=Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\Database\\DB.mdb;Mode=ReadWrite;Persist Security Info=False"
下面是连接数据库的方法
TADOConnection* m_pADOConn;
m_pADOConn->LoginPrompt=false;
m_pADOConn->ConnectionString=pConnStr;
if (m_pADOConn->Connected) m_pADOConn->Close();
try
{
m_pADOConn->Open();
}
catch(...)
{
}
连接玩之后写sql语句调用如下方法执行
m_pADOConn->Execute(pSqlStr);

打开记录集的方法是:
int __fastcall TDBOperate::OpenRecordset(const char* pSqlStr,TADODataSet* pDataSet)
{
if (!pSqlStr) return -1;

pDataSet->Close();
pDataSet->Connection=m_pADOConn;
pDataSet->CommandText=pSqlStr;
pDataSet->CommandType=cmdText;
try
{
pDataSet->Open();
}
catch(...)
{
return -1;
}
return pDataSet->RecordCount;
}
参考一下吧你
2.另外关于mdb里面能不能存文件的问题,应该是可以的,好像是BLOB数据类型,我之前在VB里面用过一次,对应mdb里的数据类型好像是"备注",有函数转换的,好久了忘记了
3.不需要建N个终端的表,只需一个表就可以,建议你给每一个终端编一个唯一的ID号,每一个终端就是一条记录就可以了
4.至于服务端与客户端之间传输数据的问题,我看你们是通过TCP协议通信的,那我建议你制定一份内部的通信协议,通过发送端安装协议编码,接收端按照协议解码即可以实现你的传送目的,不需要传文件的方式吧,因为我做过的数据通信系统模式跟你这个类似,所以这样建议你
[解决办法]
数据库实现起来其实比数据结构、链表之类更简单,楼主的图片看不到
[解决办法]
1. 用C++Builder自带的数据引擎,如BDE,ADO,DbExpress,可视化组件,应用很简单,只需设置几个属性即可,这个无需多说。

2. 既然是多个终端访问,建议用SQLServer之类的网络数据库,Access是单机数据库。用户和权限在数据库中设置。

3. 客户端连接服务器的IP,就可以简单的用数据敏感控件直接显示数据库中的内容。

4. 服务端负责维护客户端传来的文件,根据用户的不同,分目录存放文件。

5. Indy组件的服务端支持多线程,象IndyTCPServer组件,在接收到数据时,触发OnExecute事件,参数中的提供了对应连接的上下文指针,操作很方便。
[解决办法]
根据你这个需求,那么建议是客户端不要直接访问数据库,而是通过指令,由服务端负责访问数据库,然后将筛选的数据进行组织,发送给客户端。如果访问量不大,服务端这边可以用Access数据库。

这样的设计,一是为了安全,二是客户端不需要考虑多线程访问数据库的诸多问题。
[解决办法]
将筛选出的数据按一定规则组织一下就行了。拼成字符串比较简单,你自己先尝试一下。

至于书籍,我不作太多评论,这个容易得罪人。
[解决办法]
你这个服务端程序就是个前置机,前置机负责跟所有的终端设备通信,通信方式采用TCP或UDP协议(媒介可能是GPRS/CDMA/3G/以太网)对吗?同时前置机负责维护数据库,将终端设备信息存储到数据库里。而前置机的另一个功能就是负责与客户端通信,通过局域网的TCP或UDP,前置机负责将客户端的命令转发到终端,同时将终端反馈的信息转发到客户端,是这样一个模式吗?
如果是这样的话,最好能用网络数据库,客户端和服务端程序都可以维护数据库最好,如果网络数据库不行,只能用ACCESS数据库的话,那就如我之前给你建议的,自己制定通信协议来表示你所有要传输的信息,妖哥也是这样的建议。
如果你不知道怎么制定通信协议的话,那你的服务端程序是怎样跟终端设备通信的?他们之间肯定有通信协议的,你可以参考那个协议来制定。实际就是一个字节数组比如:用10个字节表示用户名+10个字节密码+终端逻辑地址+……,当然你还可以加上头和尾55AA AA55之类的,还可以加上校验,


通信协议是一个编解码的约定,一条记录跟一万条记录处理起来是一样的,你把它做成函数就可以了
[解决办法]
sql语句不需要怎么看书,网上一搜全都有,你是初学者,了解几个简单的就足够用了,insert,update,delete,select学会这几个就可以了,如果想深入,你后面再自己研究,没你想象的那么复杂
[解决办法]
那另一个问题,在终端的TCP线程中修改数据库要怎么处理,互斥?
你加个锁就可以了,对数据库操作之前LOCK一下,操作完UNLOCK
[解决办法]
我那个是VC里面的用法,可能在BCB里面也能用,没试过
[解决办法]
那就用//互斥量
TMutex m_mutex;也可以吧

读书人网 >C++ Builder

热点推荐