国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
使用ADO,最后關(guān)閉_ConnectionPtr,_RecordsetPtr后,析構(gòu)出錯(cuò),請(qǐng)教高手
2008-12-30 15:40
樓主boilingwater() 2003-02-14 16:21:45 在 VC/MFC / 數(shù)據(jù)庫 提問

定義了Manager作為全局變量,其中包含一個(gè)_ConnectionPtr和一個(gè)_RecordsetPtr成員變量.
執(zhí)行了3步操作
1 m_pLConnect.CreateInstance("ADODB.Connection");
m_pLRecordset.CreateInstance("ADODB.Recordset");

2 m_pLConnect->Open(....);
m_pLRecordset->Open(...);

3 m_pLConnect->Close();
m_pLRecordset->Close();

分別在3個(gè)函數(shù)中調(diào)用.
最后析構(gòu)Manager時(shí)(析構(gòu)函數(shù)里什么也沒有),出現(xiàn)錯(cuò)誤,指向
void _Release() throw()
{
if (m_pInterface != NULL) {
m_pInterface->Release(); //這里
}
}

m_pInterface 不為0.

我想ADO的connect和recordset不需要release吧,也不需要設(shè)為NULL吧?
哪這個(gè)錯(cuò)誤是怎么產(chǎn)生的呢?
問題點(diǎn)數(shù):100、回復(fù)次數(shù):23Top

1 樓boilingwater() 回復(fù)于 2003-02-14 16:24:44 得分 0

對(duì)了,中間執(zhí)行的操作都很正常.Top

2 樓Aizz(Nova) 回復(fù)于 2003-02-14 16:40:46 得分 0

試試3的順序反一下:
m_pLRecordset->Close();
m_pLConnect->Close();
Top

3 樓boilingwater() 回復(fù)于 2003-02-14 17:22:03 得分 0

Aizz(Nova),我試過了,還是不行.Top

4 樓boilingwater() 回復(fù)于 2003-02-14 17:25:06 得分 0

這次我連open都沒有,只有createinstance,析構(gòu)時(shí)還出錯(cuò)Top

5 樓Aizz(Nova) 回復(fù)于 2003-02-14 17:29:52 得分 0

沒遇見過,錯(cuò)誤信息是什么?Top

6 樓boilingwater() 回復(fù)于 2003-02-14 17:31:09 得分 0

抱歉,先離開,明天晚上再來
Top

7 樓samyoung(sam) 回復(fù)于 2003-02-14 17:34:17 得分 0

_ConnectionPtr不需要每次用了都close,這個(gè)只需要在程序結(jié)束的時(shí)候close一下就行了,推薦這樣
//程序退出時(shí)關(guān)閉與數(shù)據(jù)源的連接
if(m_pConnection)
{
m_pConnection->Close();//關(guān)閉并釋放與數(shù)據(jù)庫的連接
}

同時(shí),建議將_ConnectionPtr m_pLConnect放在App類里面定義,在InitInstance函數(shù)中初始化,創(chuàng)建實(shí)體和打開,在ExitInstance中close。


Top

8 樓boilingwater() 回復(fù)于 2003-02-17 14:10:06 得分 0

_ConnectionPtr我是只close了一次.
因?yàn)樾枰圆荒軐ConnectionPtr m_pLConnect放在App類里面定義,在InitInstance函數(shù)中初始化,創(chuàng)建實(shí)體和打開,在ExitInstance中close。
另外,提示錯(cuò)誤就是UNHANDLED EXCEPTION.就指向這里了.
void _Release() throw()
{
if (m_pInterface != NULL) {
m_pInterface->Release(); //這里
}
}
Top

9 樓boilingwater() 回復(fù)于 2003-02-17 15:14:51 得分 0

那位高手能給我講解一下ado的connect和recordset的使用過程中,內(nèi)存是如何分配的?哪里申請(qǐng),哪里釋放,哪里設(shè)為NULL?Top

10 樓hany3000(傾城一片) 回復(fù)于 2003-02-17 17:06:39 得分 0

好像不要用哪個(gè)release函數(shù),我用哪個(gè)也出錯(cuò)的,
這樣行不行
m_pInterface->Close();
m_pInterface=NULL;Top

11 樓boilingwater() 回復(fù)于 2003-02-17 17:10:18 得分 0

好像也不需要=NULL吧?Top

12 樓zzyx(菜農(nóng)) 回復(fù)于 2003-02-17 17:28:27 得分 0

COM組件線程的公寓模型問題?
STA、MTA?
如果你進(jìn)行了跨線程的訪問,看看這方面的情況吧Top

13 樓boilingwater() 回復(fù)于 2003-02-18 09:07:25 得分 0

拜托 zzyx(菜農(nóng))再說的詳細(xì)點(diǎn)好嗎?

這個(gè)問題,其實(shí)我自己已經(jīng)解決了.我發(fā)現(xiàn)
1 m_pLConnect.CreateInstance("ADODB.Connection");
m_pLRecordset.CreateInstance("ADODB.Recordset");
放置的位置不同,結(jié)果就會(huì)不同.可是我沒有跨線程訪問呀.

這兩個(gè)問題解答了都有分相送,還可以再加分.

那位高手能給我講解一下ado的connect和recordset的使用過程中,內(nèi)存是如何分配的?哪里申請(qǐng),哪里釋放,哪里設(shè)為NULL?

Top

14 樓Aizz(Nova) 回復(fù)于 2003-02-18 11:28:17 得分 0

>>放置的位置不同,結(jié)果就會(huì)不同.
樓主可以詳細(xì)說說是怎么個(gè)不同法嗎?

我在2000里試了一下,只要Close()的順序正確,是不會(huì)出錯(cuò)的。CreateInstance()的順序應(yīng)該不會(huì)有影響。
智能指針_RecordsetPtr和_ConnectionPtr在超出作用域是會(huì)自動(dòng)釋放的,也就是說指針在CreateInstance()的時(shí)候 分配內(nèi)存,在作用域外釋放,所以自己調(diào)用Release()并不是必需的,不過調(diào)用也不會(huì)出錯(cuò),而設(shè)為NULL是完全可以不用的。
Top

15 樓Aizz(Nova) 回復(fù)于 2003-02-18 15:35:49 得分 0

上面“CreateInstance()的時(shí)候分配內(nèi)存”這句應(yīng)該是“建立接口的引用”。Top

16 樓zzyx(菜農(nóng)) 回復(fù)于 2003-02-18 19:50:40 得分 0

我還是有點(diǎn)懷疑你有跨線程的情況。
因?yàn)楹茱@然,用最普通的方式使用_ConnectionPtr來完成工作不會(huì)有任何問題,放到類里也不會(huì)有影響。

試驗(yàn)用參數(shù)COINIT_MULTITHREADED 或COINIT_APARTMENTTHREADED 調(diào)用
CoInitializeEx來初始化COM看看。

Top

17 樓boilingwater() 回復(fù)于 2003-02-19 09:46:26 得分 0

哪我的指針不會(huì)超出作用域,除非推出程序.因?yàn)樗窃谝粋€(gè)全局變量里.

extern CMyParam MyParam; //MyParam里有connect和recordset智能指針
我在子對(duì)話框初始化時(shí),用CreateInstance(),并直接Open(),在子對(duì)話框OnCancel時(shí),用close().這樣一切都正常,即使再調(diào)用子對(duì)話框,也正常.
可我也不明白,這樣多次CreateInstance()沒有問題嗎?

如果把CreateInstance()放到主對(duì)話框的初始化中,在子對(duì)話框初始化時(shí)Open(),
在子對(duì)話框OnCancel時(shí),用close().不管在何處,用不用release(),賦不賦成NULL,最后推出程序,MyParam析構(gòu)時(shí)都會(huì)出錯(cuò).
就是我最先提出的那個(gè)錯(cuò)誤.

提示錯(cuò)誤就是UNHANDLED EXCEPTION.就指向這里了.
void _Release() throw()
{
if (m_pInterface != NULL) {
m_pInterface->Release(); //這里
}
}
Top

18 樓lwg7603(刑滿釋放人員) 回復(fù)于 2003-02-19 10:18:41 得分 50

COM調(diào)用越界了(即在CoUninitialize()調(diào)用完成后,再調(diào)用COM的方法)因?yàn)槿肿兞康奈鰳?gòu)在最后才調(diào)用!檢查你的 CoInitialize(NULL)和CoUninitialize()調(diào)用,你在調(diào)用CoUninitialize()的位置設(shè)斷點(diǎn),在 ~CMyParam()內(nèi)部(任何語句處)也設(shè)斷點(diǎn).然后推出程序,看看程序先運(yùn)行到哪個(gè)斷點(diǎn)處就明白了~~~

解決方法:修改程序結(jié)構(gòu) ,不要在全局對(duì)象中使用智能指針~


Top

19 樓lwg7603(刑滿釋放人員) 回復(fù)于 2003-02-19 11:09:42 得分 0

解決方法:修改程序結(jié)構(gòu) ,不要在全局對(duì)象中使用智能指針~,,或在CoUninitialize()調(diào)用之前,調(diào)用m_pLRecordset.Release(),m_pLConnect->
Release();
Top

20 樓boilingwater() 回復(fù)于 2003-02-19 12:12:55 得分 0

我加了release也不行啊.
而且我用的是AfxOleInit().不用CoUninitialize()啊.Top

21 樓lwg7603(刑滿釋放人員) 回復(fù)于 2003-02-19 13:15:35 得分 0

在CxxxAPP類的ExitInstance函數(shù)中調(diào)用release試試?Top

22 樓zzyx(菜農(nóng)) 回復(fù)于 2003-02-19 14:01:51 得分 20

看來 lwg7603(刑滿釋放人員) 是正確。

可以這樣實(shí)現(xiàn):
增加Init,和Uninit函數(shù),其中分別完成創(chuàng)建對(duì)象,析構(gòu)對(duì)象的操作。
然后在代碼中需要的地方分別調(diào)用。這樣你就能把你的對(duì)象控制在COM作用范圍內(nèi)存在了。Top

23 樓Aizz(Nova) 回復(fù)于 2003-02-19 15:51:35 得分 30

我是在類的構(gòu)造函數(shù)CoInitialize(),析構(gòu)函數(shù)CoUninitialize(),并且沒用Release(),沒有出現(xiàn)錯(cuò)誤(Win2000環(huán)境)。

另外,全局變量肯定在InitInstance()之前構(gòu)造,而在ExitInstance()之后析構(gòu),所以在上面兩個(gè)函數(shù)里面初始釋放COM環(huán)境應(yīng)該 是不行的;就算在析構(gòu)函數(shù)中CoUninitialize(),一樣也是在接口指針釋放之前(除非顯示調(diào)用Release())釋放COM環(huán)境,慶幸的是 在2000中這樣沒什么問題(不知道98會(huì)不會(huì)報(bào)錯(cuò))。

(###)
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MFC ACCESS連接數(shù)據(jù)庫
孫鑫VC學(xué)習(xí)筆記:第二十講 (二) ado數(shù)據(jù)庫編程
VC++中 ado 訪問mdb數(shù)據(jù)庫(轉(zhuǎn)) - wwqiang2003的日志 - 網(wǎng)易博客
ADO接口之
VC編寫ADO連接Access,SQL Server數(shù)據(jù)庫入門實(shí)例
來總結(jié)一下在VC中調(diào)用COM組件的方法
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服