社区
数据库及相关技术
帖子详情
ADO是线程安全级的,为什么我在多个线程中访问数据库会出现“对象已打开”错误。
Atomictry
2003-09-14 01:52:53
我是用Socket服务端访问数据库时出的错,用的是TServerSocket线程阻塞模式。
请做过此项工作的朋友帮帮忙。
...全文
215
24
打赏
收藏
ADO是线程安全级的,为什么我在多个线程中访问数据库会出现“对象已打开”错误。
我是用Socket服务端访问数据库时出的错,用的是TServerSocket线程阻塞模式。 请做过此项工作的朋友帮帮忙。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
24 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
thingking
2003-09-24
打赏
举报
回复
MARK
Atomictry
2003-09-19
打赏
举报
回复
解决方法是sncel(地狱情人-杨勇) 给了我他调试的工程文件。
Atomictry
2003-09-19
打赏
举报
回复
先感谢sncel(地狱情人-杨勇) 、空心菜、yesry(噎死你),还有其他朋友。
再把问题整理一下:
问题症状:
环境:Windows2000;SQL Server;BCB6.0;
在TServerSocket线程阻塞方式下,线程中可以进行更新,插入。但查询时就可能
会出现如下错误:
“对象已打开”、“[Microsoft][ODBC SQL Server Driver]连接占线导致
另一个hstmt.”、“在异步运行时,操作不能被执行”。
解决问题的方法:
1.在线程中用new方法创建TADOQuery组件。
2.这是最主要的原因:是否用的是for SQL Server驱动,如果用了OLE DB for
ODBC,即使用new创建也会出现连接占线错误。
Atomictry
2003-09-18
打赏
举报
回复
up.
朋友们,我算是被ADO打败了。
现在我只想让DBGrid能够刷新更新显示,除了用ADOQuery查询一遍数据库外,
还有什么方法实现显示当前表数据。
yesry
2003-09-18
打赏
举报
回复
void __fastcall TServerFrm::UpdateField(String updatefield,String updatevalue,String sourcefield,String sourcevalue)
//说明:updatefield为需要更新的字段,updatevalue为需要更新的字段值
// sourcefield为已知字段,updatevalue为已知字段值,如上面的RemoteHostIP
{
String Updatesql="update LinkRecord set "+updatefield;
Updatesql+= "='"+updatevalue+"' where "+sourcefield;
Updatesql+= "='"+sourcevalue+"'";
TADOQuery *q=new TADOQuery(ADOConnection1);
q->Connection=ADOConnection1;//各个线程可以间接公用ADOConnection1,但是ADOQuery不能共享访问
q->CommandText=Updatesql;
q->ExecSQL();//不要用Open();
delete q;
}
sncel
2003-09-18
打赏
举报
回复
联系我:QQ:6522203 MSN:sncel@vip.sina.com
hqylfy
2003-09-18
打赏
举报
回复
我也用过ADO做线程
也是类似的错误
Atomictry
2003-09-18
打赏
举报
回复
顶
yesry
2003-09-16
打赏
举报
回复
void __fastcall TServerFrm::UpdateField(String updatefield,String updatevalue,String sourcefield,String sourcevalue)
//说明:updatefield为需要更新的字段,updatevalue为需要更新的字段值
// sourcefield为已知字段,updatevalue为已知字段值,如上面的RemoteHostIP
{
String Updatesql="update LinkRecord set "+updatefield;
Updatesql+= "='"+updatevalue+"' where "+sourcefield;
Updatesql+= "='"+sourcevalue+"'";
TADOQuery *q=new TADOQuery(ADOConnection1);
q->Connection=ADOConnection1;//各个线程可以间接公用ADOConnection1,但是ADOQuery不能共享访问
q->Execute(Updatesql);
delete q;
}
invalid
2003-09-16
打赏
举报
回复
那就看是不是设置或者其它什么问题了。
Angelic
2003-09-16
打赏
举报
回复
楼上,ADOQuery没有Execute()方法。谢你一次。
我在线程里其实用了同样的方式做过了也不行:
void __fastcall Server::Newquery()
{
TADOQuery *Newado;
try
{
Newado=new TADOQuery(NULL);
Newado->Connection=ServerFrm->ADOConnection1;
Newado->Close();
Newado->SQL->Clear();
Newado->SQL->Add("select * from customerlinkrecord");
Newado->Open();
}
__finally
{
delete Newado;
}
}
Atomictry
2003-09-16
打赏
举报
回复
啊?怎么这么命苦?
1.ADOConnection1一些设置,其他默认:
Connected>>>true;ConnectonString>>>是通过数据源连接的;
2.ADOQuery通过new生成,如下:
void __fastcall Server::Newquery()
{
TADOQuery *Newado;
try
{
Newado=new TADOQuery(NULL);
Newado->Connection=ServerFrm->ADOConnection1;
Newado->Close();
Newado->SQL->Clear();
Newado->SQL->Add("select * from linkrecord");
Newado->Open();
}
__finally
{
delete Newado;
}
}
然后就是调用,没了。
我也完了,这么个问题都搞不定。
kinglh
2003-09-15
打赏
举报
回复
继续顶
Atomictry
2003-09-15
打赏
举报
回复
to pbMaster(pb高手) :
如果你只是用来插入或者更新操作,用我上面的UpdateField()方法就可以了。
to invalid(空心菜):
菜老师好象不行啊,还是“[Microsoft][ODBC SQL Server Driver]连接占线导致另
一个hstmt.”错误。
我设置代码保护都没有用,new 应该也没有效果。ADO不知道究竟什么问题。
Atomictry
2003-09-15
打赏
举报
回复
to invalid(空心菜):
我仍然叫你菜老师吧,我先试一下你的办法。谢你先。
谢谢朋友们。
Atomictry
2003-09-15
打赏
举报
回复
比如在连接的时候我需要将此次连接记录到数据库的一张表中。
void __fastcall Server::ClientExecute()
{
Connected(); //客户端连接;
try{
Disposal();
}
catch(...){
DisConnected();
}
}
Connected()函数如下:
void __fastcall Server::Connected()
{
RemoteHostIP=ClientSocket->RemoteAddress;
RemoteHostPort=ClientSocket->RemotePort;
ServerFrm->UpdateField("State","连接","RemoteIP",RemoteHostIP);//已
经把将要连接上的远程客户机的IP记录在数据库的一张表中,即RemoteHostIP在数据
库已经存在了记录。
ServerFrm->UpdateField("Port",RemoteHostPort,"SourceIP",
RemoteHostIP); //同上
ServerFrm->UpdateDBGrid("LinkRecord"); //刷新DBGrid控件
}
UpdateField()函数如下:
void __fastcall TServerFrm::UpdateField(String updatefield,String updatevalue,String sourcefield,String sourcevalue)
//说明:updatefield为需要更新的字段,updatevalue为需要更新的字段值
// sourcefield为已知字段,updatevalue为已知字段值,如上面的RemoteHostIP
{
String Updatesql="update LinkRecord set "+updatefield;
Updatesql+= "='"+updatevalue+"' where "+sourcefield;
Updatesql+= "='"+sourcevalue+"'";
ADOConnection1->Execute(Updatesql);
}
UpdateGrid()函数如下:
void __fastcall TServerFrm::UpdateDBGrid(String SQLName)//查询一次记录集
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("select * from "+SQLName);
ADOQuery1->Open();
}
1. 我是在一台机子上开了六个客户端模拟几乎同时连接到服务端的情况,是不是因为六个
RemoteHostIP是数据库里的同一个记录引起的“对象已打开操作”的错误?
2. 跟踪到线程,发现执行到ServerFrm->UpdateDBGrid("LinkRecord"); 时
发生“[Microsoft][ODBC SQL Server Driver]连接占线导致另一个hstmt.”错误
3. 有时候也会产生“在异步运行时,操作不能被执行”的错误,不过较少发生。
4. 注释掉UpdateDBGrid(),程序不再出错,但界面上DBGrid不能够进行动态刷新显示。
我用Synchronize进行同步和用TCriticalSection设置代码保护区都试过了,都是出现相同错误:
“[Microsoft][ODBC SQL Server Driver]连接占线导致另一个hstmt.”
to AKing:在线程查询语句会出错吗?该怎么用才可以用select查询语句?
请朋友们帮帮忙啊!
invalid
2003-09-15
打赏
举报
回复
我写过可以的,我采用的数据库是Access。有多种线程,多线程实例。
pbMaster
2003-09-15
打赏
举报
回复
Atomictry (天影) :
我们可能是在做几乎同样的开发任务,我也卡到这里了,可以交流一下!
MSN catmiwang@hotmail.com
qq 154863618
pbMaster
2003-09-15
打赏
举报
回复
invalid(空心菜) :
这是不行的!不信你试验一下!
invalid
2003-09-15
打赏
举报
回复
每个线程New一个TadoQuery组件,连接到公共的AdoConnection组件就可以了。
加载更多回复(4)
delphi多
线程
访问
数据库
delphi如何用多
线程
访问
数据库
的例子
vb.net
数据库
开发经典案例解析
vb.net
数据库
开发经典案例解析
同时
打开
多端口的通信程序
采用Socket通讯协议进行 一个可以同时
打开
多端口 客户端及服务端通信的 自定义命令解析试验程序。 里面抱含了一个原生
数据库
ADO
操作类,初数sockt及
ADO
数据库
操作者很值得一看。
基于C#与Sql Server的智慧星学生选课管理系统.rar
基于C#与Sql Server的智慧星学生选课管理系统.rar
COM与COM+从入门到精通(pdf版本,含源码)
第一部分 了解COM 第1章 COM概述 何谓CoM COM术语 COM利与弊 COM的好处 COM的局限性 COM组件与接口 何谓接口 接口特征 接口类型 接口规则 接口设计 COM组件的实现规则 实现IUnknown规则 内存管理规则 引用计数规则 COM激活 COM类型 COM客户机 COM服务器 ActiveX控件 COM与面向
对象
技术 包装 抽象 多态 继承 COMTrader应用程序 小结 第2章 由VC++建立并使用COM服务器 IDL文件 建立第一个COM服务器 定义自定义接口 实现IUnknown和自定义接口 完成COM服务器 生成测试客户机 用ATL建立COM服务器 关于ATL 用ATL建立进程内COM服务器 用ATL建立进程外COM服务器
线程
与COM服务器 Win32多
线程
应用
线程
COM组件 自动化与IDispatch 用VC++实现IDispatch ATL与自动化 Automation数据类型 再谈类型库 C++自动化客户机 VB自动化客户机 小结 第3章 用VB建立并使用COM服务器 选择COM项目 设计接口 描述接口 浏览接口 生成
对象
使用ClassBuilder 增加属性 增加方法 增加事件与枚举 使用ActiveXDataObject(
ADO
) 在服务器组件
中
使用Recordset
对象
在客户机组件
中
使用
ADO
R 生成断开的Recodset 生成自己的RecodsctS 使用用户定义类型
错误
处理 服务器客户机
错误
处理 使用VBErr.Raise机制 在VB
中
使用
线程
模型 设置
线程
模型 了解再入性与公寓 小结 第二部分 COM与Internet 第4章 在VC++
中
建立并使用ActiveX控件 ACtiveX控件概还 属性与方法 控件与容器通信 事件与连接点 建立第一个控件 生成控件 测试控件 增加方法 增加属性 增加事件 增加属性页 允许属性保持 使用控件 建立复合控件 增加复合控件 增加功能 增加事件 处理复合控件事件 处理
错误
使用控件 小结 第5章 在VB
中
建立并使用ActiveX控件 VB控件简介 约束与无约束控件 控件生成技术 属性类型 方法 属性配置 过程属性 环境属性配置 运行时只读属性 只在运行时有效的属性 扩展属性 容器属性 合成控件属性 可关联属性 持续与属性包 属性包 使用ActiveX控件界面向导 了解控件寿命 生成ActiveX控件 生成无约束控件 生成设计时数据约束控件 生成运行数据约束控件 小结 第6章 用VC++建立InternetCOM组件 IEActiveX控件 轻量
级
控件 安全控件 持续属性 文档
对象
模型编程 活动服务器组件 活动服务器页面 ASP页面的COM组件 小结 第7章 用VB建立InternetCOM组件 无窗口控件 ActiveX控件容器的
线程
模型 ActiveX控件的安全性 Web页面
访问
VBDHTML项目 DHTML项目基础 DHTML应用程序样本 VBIIS应用程序 WebClass 一个IIS应用程序样本 设计控件 设计控件与HTML文件 样本设计控件 小结 第三部分 了解DCOM 第8章 DCOM概述 何谓DCOM 为什么使用DCOM DCOM操作 DCOM组件位置 进程内或进程外组件 代理 RPC(RemoteProcedureCall,远程过程调用) 调动 数据传递 DCOM配置实用程序 DCOM应用程序的安全机制 验证 授权 加密 整性检查 小结 第9章 用VC++建立DCOM服务器 标准与自定义调动 标准调动 自定又调动 网络通伯 远程激活 AppID注册表项 可配置AppID注册表项参数 IUknown优化 DCOM与NT服务 NT服务解剖 基于NT服务的COM服务器 小结 第10章 用VB建立DCOM服务器 应用程序
对象
模型 何谓
对象
模型 如何生成
对象
模型 DCOM设计准则与技术 再论调动 按数值与按引用 DCOM进程外服务器 建立DCOM组件 增加测试客户机 IIS应用程序 增加WebClasses 使用模板 增加自定义Webltems 远程
错误
处理 小结 第四部分 了解COM++ 第11章 COM++概述 COM与WindowsDNA 用户界面层技术
中
间层技术
数据库
层技术 组件服务配置 事务处理 排队组件(QC) 实时结构的限制 事务性消息排队 排队组件结构 排队组件故障恢复 QC安全性 动态负荷平衡
对象
地 小结 第12章 用VC++建立COM++组件
ADO
编程
ADO
与OLEDB VC++
中
的
ADO
VC++的
ADO
扩展 建立COM++应用程序 温习IObjectContext接口 用ATL建立COM++组件 编制基于角色的安全性 处理COM+事务 控制事务结果 指定事务属性 确定事务情境 传递接口指针 共享状态 建立事务性COM+组件 小结 第13章 用VB建立COM+组件 了解事务 事务与多层应用程序 COM+与事务 事务属性:ACID COM+系统简介 COM+运行环境 COM+ComponentServices COM+接口 资源分配器 应用程序组件 探索COM+编程模型 COM+组件作为COMDLL 基本COM+编程规则 COM+API 用VB编程COM+
对象
描述表 COM+组件的生命周期 ObjectControl接口 MTS活动 COM+
中
生成
对象
安全引用 组件之间的参数传递 数据类型 使用分布式事务 分布式事务协调器(MSDTC) COM+事务的工作 事务与有状态
对象
使用共享属性管理器(SPMSharedProperyManager) 小结 第14章 了解MSMQ 何谓MSMQ MSMQ的好处 MSMQ组件 队列 消息 MSMQ
对象
模型 MSMQ设置 MSMQ基础 消息发送 消息接收 MSMQ事件 MSMQ事务 小结 第五部分 高
级
COM与COM+ 第15章 VC++与VB
中
的COM+服务 了解COM+激活 描述表包装器 激活顺序 使用即时(JIT)激活 使用
对象
构造
中
性公寓简介 了解同步域 表示事务状态 取得
对象
信息 使用
对象
地
对象
池的好处
对象
地要求
对象
地配置 使用排队组件 QC限制 QC配置 QC调用 QC播放控件 使用负荷平衡 负荷平衡要求 负荷平衡配置 小结 第16章 COM与COM+安全性 何谓安全性 WindowsNT安全简介 NT验证 NT扮演 NT
访问
控制 COM安全结构 验证
访问
控制 启动权限 标_ 扮演与掩盖 安全总括 COM+安全 COM+说明性安全 COM+角色 编程COM与COM+安全 整个进程安全 接口
级
安全 激活安全 服务器方安全 调用描述表安全信息 SecuntyProperty信息 安全性与
数据库
访问
小结 第17章 Windows2000
中
的新COM特性 同步机制 COM同步API COM同步接口 异步COM 异步接口构造 异步接口调用 关于异步服务器与客户机 让服务器进行异步处理 调用序列化与自动完成 COM管道 COM管道接口 异步管道与提前读取 调用
对象
与调用取消 调用取消请求 调用取消处理 轻量
级
处理器 标准LWH 自定义LWH 小结 第六部分 调试与部署COM和COM+应用程序 第18章 调试与剖析COM和COM+应用程序 调试VB组件 调试MTS组件 调试COM+组件 使用条件编译 调试VC++组件 用VisualStUdioAnalyzer剖析 小结 第19章 部署COM与COM+应用程序 DCOM应用程序部署 配置DCOM服务器 配置DCOM客户机 在Internet上部署 Internet上部署与包装 签名CAB文件 许可ActiveX控件 自动化COM+配置 使用COMAdmin接口与集合 配置COM+应用程序 配置组件 配置角色 部署COM+应用程序 小结
数据库及相关技术
1,178
社区成员
18,939
社区内容
发帖
与我相关
我的任务
数据库及相关技术
C++ Builder 数据库及相关技术
复制链接
扫一扫
分享
社区描述
C++ Builder 数据库及相关技术
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章