在VC6.0中CSocket发送数据库的结果集采用哪种方法比较好?

danyajuan 2006-12-22 01:54:36
使用VC6.0做得socket编程。继承了CSocket,采用的是多线程
DB是Sql Server 2000。
C/S 模式
需求:

server接受到client的查询请求,去DB里边进行查询。然后将查询结果返回给client,client再把收到的数据显示给用户。
问题:
Server采用哪种方式将查询结果发送给Client呢?
是采用发送一个xml文档给client,然后再让client解析出各个记录,并在控件中显示出来呢?

还是直接发送数据集,就是dataset。DataSet好像在。net里边有,6.0好象没有。

还是有其他的更好地方法?




...全文
260 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProgrameMan 2006-12-25
  • 打赏
  • 举报
回复
ADO本身就是屏蔽了数据库的实现细节,大部分的情况下是不用在考虑解耦了,因为ADO本身提供的就是接口你还要在上面封装什么呢? 难道你还要在ADO之上在封装一层数据库访问层吗?如果你要这样做,其结果并不是对数据库的操作的封装而是对数据库操作对象的封装,简单的说也就是你把 ADO在封装一层带来的好处是可以替换ADO,需不需要这样要取决于你的系统特性。
danyajuan 2006-12-25
  • 打赏
  • 举报
回复
我看了一下教程说得比较清楚。
但问题是数据库操作和对数据库操作结果的处理耦合性很强。
我现在想把两块作为一个独立的模块来做。
只需要知道接口的前提下,去对数据库结果,(比如查询)进行处理
这时候,还需要对数据库里边的东西很清楚才能做吗?

在VC中我怎样使用MFC的CRecordset直接操作结果呢?我觉得应该是自定一个类,将这些结果全部封装进去。
但是,如何留接口呢?

ProgrameMan 2006-12-25
  • 打赏
  • 举报
回复
网上有很多例子的自己搜一下就行,我手头没有例子都是具体的项目。

下面有一个简单的教程
http://www.pconline.com.cn/pcedu/empolder/gj/vc/0111/15805.html
danyajuan 2006-12-25
  • 打赏
  • 举报
回复
谢谢你!我看一些资料看看具体操作。你那可有具体的例子或者推荐资料?
我这对数据库只知道一些理论,具体编程还没做过。
ProgrameMan 2006-12-25
  • 打赏
  • 举报
回复
1. 可以使用 ADO 的 RecordSet
2. 你不用在组织链表了,因为RecordSet已经是一个二维的表格了,你只要循环读取 RecordSet的表格元素就可以了
3. 把RecordSet的每条记录的各个字段读取出来按照你自己定义的格式发送就行了,RecordSet已经把数据都组织成二维的数据表了,你还组织什么啊?
danyajuan 2006-12-25
  • 打赏
  • 举报
回复
还有个疑问:
1。就是我从数据库获取怎样的数据呢?应该是一些二维表格吧?在6.0中操作时,具体是哪个类呢?
数据库这块我没具体做.打算使用ado.
如果是DataSet的话,好像6.0中不支持,.net才比较方便。
2。如果我加入数据都组织在一个链表中了,那么我可以直接对链表中的数据封包,发送
但是,如果是分开发的话是不是就得考虑对于链表操作的同步问题了。就是将结果写入链表的时候,和从链表中读取数据的时候的操作控制,不然会引起起冲突的。
3。发送和DB操作是独立的,我该如何将DB的结果组织成我要发送的数据呢?
ProgrameMan 2006-12-25
  • 打赏
  • 举报
回复
可以的,只不过如果直接返回 RecordSet那么你的发送程序就与数据读取部分存在一定的耦合(例如以后不采用 ADO了那么你就的改变你得发送程序),如果抽象一个 CRecordReader,那么以后即使改变 ADO 也不会影响你得发送程序。
danyajuan 2006-12-25
  • 打赏
  • 举报
回复
应该是个结果集吧?
比如我要求得到成绩大于90的所有学生的记录,那么我只是提交个请求,具体数据库里边怎么操作我不考虑,但是数据库的查询结果不是一个二维表格吗?
如果可以直接返回个CRecordSet,那我就可以直接操作各行了。
如果不能,那数据库返回给我的数据应该是怎样呢?
ProgrameMan 2006-12-25
  • 打赏
  • 举报
回复
用户A可以实现一个 CRecordReader,这个类主要实现从数据库中查询记录并且按照你的要求返回数据即可(例如返回一个字符串)。
danyajuan 2006-12-25
  • 打赏
  • 举报
回复
如果数据库里的东西由另一个人A做,我只需要对返回的结果封包发送,那么你说数据库应该给我什么类型的数据?就是我用来封包的数据类型是什么?我不需要把
1。连接数据库
2。查询数据库
3。增加,删除数据库
4。关闭数据库
这些操作封在一个类中,然后调用A给我的返回结果?
比如:
searchKey(CString key);那么A就直接给我返回个什么类型的数据呢?我就是需要对他给我返回的数据操作。关系型数据库中,他就是个表格。那么这个表格我就用个CRecordSet就可以了吗?
danyajuan 2006-12-24
  • 打赏
  • 举报
回复
我试试做一下。

非常感谢ProgrameMan的热心相助!

ProgrameMan 2006-12-24
  • 打赏
  • 举报
回复
那我只需要使用个循环就行了吧?还是在程序中使用什么机制呢控制呢?

是的(其实这个取决于使用的网络模型而已,建议你就先使用循环的方式吧,以后可以在调整)

至于后者,就是把返回的记录数据按照我自己定义的协议封包,对方解析就行了,是吗?
那就是和发送普通的交互消息是一样的.
对吗?

danyajuan 2006-12-24
  • 打赏
  • 举报
回复
那我只需要使用个循环就行了吧?还是在程序中使用什么机制呢控制呢?
至于后者,就是把返回的记录数据按照我自己定义的协议封包,对方解析就行了,是吗?
那就是和发送普通的交互消息是一样的.
对吗?
谢谢!
ProgrameMan 2006-12-24
  • 打赏
  • 举报
回复
例子我这里没有的,其实要想效率高关键有两个必要的因素:

1. 发送的方式
2. 数据的封装形式

为什么说发送的方式会影响效率呢?
你可以想象一下,如果服务器查询数据库返回的结果集有 10000条记录,那么如果客户端把10000条记录都接收完毕后在显示在列表中是不是需要一定的时间呢? 假设用户需要等上3秒。
但是如果你换一个方式,客户端分多次接收,接收到一部分就显示一部分,那么用户是不是很快就在列表中看到数据了呢? 虽然用户看到的数据不完整(因为还有数据没有发送完毕呢),但是在3秒的时间里又有多少人需要一下就看到10000条记录呢,对不对?

具体来说就是:

服务器遍历结果集,每50条记录的数据作为一组发送给客户端,一直到所有的纪录全部发送完毕为止。

至于数据的封装形式建议你不要使用XML了,自己定义通讯协议/。



danyajuan 2006-12-24
  • 打赏
  • 举报
回复
非常感谢你的回答
但是我还不是很清楚:
对于效率当然是在实现功能的前提下效率越高越好。
我现在就是想把数据库的查询结果通过服务器发送给客户端,并且,客户端通过列表的方式显示在界面上。我用的是VC6.0。对于这样的需求,使用哪种方式更为合适呢?
可以给个相关的例子吗?
谢谢!
ProgrameMan 2006-12-24
  • 打赏
  • 举报
回复
1. 服务器端把查询的结果集分成若干部分,例如每10条返回结果为一部分这样在结果集小的时候可能看不出什么效果,但是当结果集比较大的时候就会发现好处了。

2. 采用哪种格式要看客户端处理什么格式的方便了,可以是XML的也可以不是
3. 采用 XML格式数据冗余大么? 当然会有一定的冗余了,如果你注重效率那么你就不应该采用XML
danyajuan 2006-12-24
  • 打赏
  • 举报
回复
楼住所说,
怎样分成独立的部分呢?
每部分的格式采用那种比较好呢?
采用XML格式数据冗余大么?
ProgrameMan 2006-12-22
  • 打赏
  • 举报
回复
分成若干独立的部分发送,这样接受端就可以接受一部分就显示一部分,而每部分的可以采用任何格式例如 xml 形式。
trueadou 2006-12-22
  • 打赏
  • 举报
回复
今天高手基本都休息了!!!
danyajuan 2006-12-22
  • 打赏
  • 举报
回复
没人知道吗?
高手都休息了

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧