當前位置:首頁 » 數據倉庫 » vc多線程資料庫訪問
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

vc多線程資料庫訪問

發布時間: 2022-10-08 13:17:41

Ⅰ VC2005 開發一個多線程的應用程序(並發的資料庫訪問)

對於你的程序,我覺得可以由以下幾種改進方法:
1、進程的管理方式可以通過製作一個進程池統一管理(進程池的例子網上不少,搜一下就有)
2、針對資料庫的訪問是連接多個不同的資料庫還是一個?就你說的1分鍾完成訪問5-6次的話,感覺你的資料庫執行效率並不是很高,因此建議你改進一下sql,如果可以用存儲過程的話,用存儲過程,甚至都可以考慮將很多個SQL拼成一個SQL串一次性執行,這樣可以減少資料庫的訪問次數
3、將需要或者固定下來的東西緩存下來,不要去查
4、盡量在執行一個資料庫操作後關閉連接,並釋放資源,因為資料庫的連接數是有限制的,並且會順序執行,如果你的操作沒有相應完,下一個就來的話,只能先等待上一個做完才可以
5、建議你將執行的存儲過程通過SQL的分析器,去計算一下時間,看看SQL是否可以優化

Ⅱ VC多線程訪問同一全局變數的問題

WaitForSingleObject(pFrameInQueue->m_mutex,INFINITE);
ReleaseMutex(pFrameInQueue->m_mutex); 需要成對的出現.你在if判斷里邊釋放一次
但是如果if條件不成立,你就沒有調用釋放.這樣的結果就是互斥量mutex被鎖定,
其他線程無法調用.
在2個if判斷外加上釋放mutex的語句再試一試

Ⅲ vc++訪問資料庫

m_recordset.GetRecordCount()一定是0
這個數目是你訪問過的數目.

MoveFrist是沒有必要的.
因為打開後,自動會在開始處

建議你看一下我的免費教程(視頻\習題\講義\教材)
VC共享樂園有哦

Ⅳ vc 如何多線程處理CSocket數據

因為CSocket類要用到窗口的消息機制才能進行收發,所以用線程可以這樣用的,你可以參考用如下的方法:
CMySocket*
pSocket;
...
ThreadFunc(
)
{
pSocket

new
CSocket;
pSocekt->Create();
pSocket->Connect(...);
while(...)
{
MSG
msg;
Sleep(
5
);
if
(
::PeekMessage(&msg,
NULL,
NULL,
NULL,
PM_REMOVE
)
)
{
::TranslateMessage(
&msg
);
::DispatchMessage(
&msg
);
}
。。。
//線程的其他代碼
);
}
希望以上的代碼對你有用

Ⅳ VC++ 多線程

在進入主消息循環之前創建新的線程,然後把你的回調函數作為參數傳遞給新建的線程。

這樣就可以了,
對於共享資源訪問的時候最好是加下鎖。

Ⅵ 如何在客戶端訪問伺服器端的資料庫(VC++)

1.用資料庫自帶的客戶端管理工具訪問修改;
2.去管理工具->數據源,建立數據源,然後再vc中建立一個資料庫的工程(Database
project),也可以訪問並修改。具體操作可以去網上搜;
3.可以用ODBC或ADO自己編程實現
那就用ODBC寫吧,如果是MFC的,用CDATABASE就可以,裡面好多方法都有封裝,去下載一個ODBC編程的例子看看

Ⅶ vc 如何多線程處理CSocket數據

因為CSocket類要用到窗口的消息機制才能進行收發,所以用線程可以這樣用的,你可以參考用如下的方法:
CMySocket*
pSocket;
...
ThreadFunc(
)
{
pSocket
=
new
CSocket;
pSocekt->Create();
pSocket->Connect(...);
while(...)
{
MSG
msg;
Sleep(
5
);
if
(
::PeekMessage(&msg,
NULL,
NULL,
NULL,
PM_REMOVE
)
)
{
::TranslateMessage(
&msg
);
::DispatchMessage(
&msg
);
}
。。。
//線程的其他代碼
);
}
希望以上的代碼對你有用

Ⅷ VC++多線程問題

據我分析,

1、你的sess因為每個線程都有自己的實例,所以不需要在sess上下臨界區
2、目測你的目的是能夠並行處理 g_runURL 數組里的地址。這樣的話,應該在多個線程間共享那個循環變數i。在創建線程前將i初始化為0,然後將i的地址交給每個線程
3、需要臨界區的地方在於循環里的 i++ 而不是處理過程。故臨界區應該這樣寫:
g_cs.Lock();
for(; i < g_runCount; ++i)
{
int thisi = i; //注意要把在臨界區內訪問到的 i 的值保存在當前線程私有的變數中
g_cs.Unlock();
//這里的代碼用到 i 的要換成 thisi
...//你原來的代碼
g_cs.Lock();
}
g_cs.Unlock();

Ⅸ 怎樣用vc++ 6.0訪問SQL Server資料庫

從功能簡單的資料庫(如Jet Engine)到復雜的大型資料庫系統(如oracle),VC++6.0都提供了一些編程介面。本文主要介紹以下五種: 1.ODBC API;2.MFC ODBC類;3.MFC DAO類;(數據訪問對象)4.MFC的OLE/DB;5.ActiveX數據對象(ADO)。6.RDO遠程數據訪問
1.開放資料庫連接(ODBC API):提供了一個通用的編程介面,允許程序與多種不同的資料庫連接。它為Oracle,SQL Server,MS Excel等都提供了驅動程序,使得用戶可以使用SQL語句對資料庫進行直接的底層功能操作。在使用ODBC API時,用戶須引入的頭文件為 "sql.h ", "sqlext.h ", "sqltypes.h "。用ODBC API創建資料庫應用程序遵循一定的基本步驟:
第一步是分配ODBC環境,使一些內部結構初始化。完成這一步,須分配一個SQLHENV類型的變數在ODBC環境中做句柄使用。
第二步是為將要使用的每一個數據源分配一個連接句柄,由函數SQLALLocHandle()完成。
第三步是使用SQLConnect()把連接句柄與資料庫連接,可以先通過SQLSetConnectAttr()設置連接屬性。
然後就可以進行SQL語句的操作,限於篇幅,相關的函數就不具體介紹了,讀者可以參考相關書籍。
操作完成後,用戶取回相應的結果,就可以取消與資料庫的連接。
最後需要釋放ODBC環境。
ODBC API的特點是功能強大豐富,提供了非同步操作,事務處理等高級功能,但相應的編程復雜,工作量大。
2.MFC ODBC類:MFC1.5後的版本里引入封裝了ODBC功能的類。通過這些類提供與ODBC的介面,使得用戶可以不須處理ODBC API中的繁雜處理就可以進行資料庫操作。主要的MFC ODBC類如下。
CDatabase類:一個CDatabase對象表示一個到數據源的連接,通過它可以操作數據源。應用程序可使用多個CDatabase對象:構造一個對象並調用OpenEx()成員函數打開一個連接。接著構造CRecordSet對象以操作連接的數據源,並向CDatabase對象傳遞記錄集構造程序指針。完成使用後用Close()成員函數銷毀CDatabase對象。一般情況下並不需要直接使用CDatabase對象,因為CRecordSet對象可以實現大多數的功能。但是在進行事務處理時,CDatabase就起到關鍵作用。事務(Transaction)指的是將一系列對數據源的更新放在一起,同時提交或一個也不提交,為的是確保多用戶對數據源同時操作時的數據正確性。
CRecordSet類:一個CRecordSet對象代表一個從數據源選擇的一組記錄的集合-記錄集。記錄集有兩種形式:snapshot和dynaset。前者表示數據的靜態視圖,後者表示記錄集與其他用戶對資料庫的更新保持同步。通過CRecordSet對象,用戶可以對資料庫中的記錄進行各種操作。
CRecordView類:CRecordView對象是在空間中顯示資料庫記錄的視圖。這種視圖是一種直接連到一個CRecordSet對象的格式視圖,它從一個對話框模板資源創建,並將CRecordSet對象的欄位顯示在對話框模板的控制項里。對象利用DDX和RFX機制,使格式上的控制項和記錄集的欄位之間數據移動自動化,也就是說,用戶甚至不要編寫一行代碼就可以實現簡單的資料庫記錄查看程序。
CDBException類:由Cexception類派生,以三個繼承的成員變數反映對資料庫操作時的異常:
m_nRetCode:以ODBC返回代碼(SQL_RETURN)的形式表明造成異常的原因。
m_strError:字元串,描述造成拋出異常的錯誤原因。
m_strStateNativeOrigin:字元串,用以描述以ODBC錯誤代碼表示的異常錯誤。
MFC資料庫類成員函數都能拋出CDBException類型的異常,所以在代碼對資料庫進行操作後監測異常是正確做法。
MFC ODBC類在實際開發中應用最廣,因為它功能豐富,操作相對簡便。
3.MFC DAO(數據訪問對象)編程:DAO用於和微軟的Access資料庫介面。在資料庫應用程序如果只需與Access資料庫介面時,使用DAO編程較方便。其主要類如下。
CDaoWorkspace:CDaoWorkspace對象可以讓一個用戶管理從登陸到離開期間,指定的密碼保護的資料庫會話全過程。大多數情況下不要多個工作區也不要創建明確的工作區對象。因為在打開資料庫和記錄集對象時,它們可以使用DAO預設工作區。
CDaoDatabase:代表一個連接,類似上述CDatabase類。
CDaoRecordSet:用來選擇記錄集並操作,類似上述CRecordSet類。
CDaoRecordView:類似上述CRecordView類。
CDaoException:類似上述CDBException類。
CDaoTableDef:表示基本表或附加表的定義。每個DAO資料庫對象包括一個稱為TableDef的收集,包含所有存儲的DAO表定義對象。CDaoTableDef對象可以用來控製表定義。
CDaoQueryDef:CDaoQueryDef對象表示了一個查詢定義(querydef)。
CDaoFieldExchange:支持資料庫類使用的DAO欄位交換(DFX)常式。也可處理事務,類似MFC ODBC類。
MFC DAO僅用來支持Access資料庫,應用范圍相對固定。
4.OLE DB:OLE DB在數據提供程序和用戶之間提供了靈活的組件對象模型(COM)介面,這種靈活性有時會使得操作復雜化。OLE DB框架定義了應用的三個基本類。
數據提供程序Data Provider:擁有自己的數據並以表格形式顯示數據的應用程序。提供OLE DB的行集COM介面,期顯示範圍可以從單一數據表格的簡單提供者知道更復雜的分布式資料庫系統。
使用者Consumers:使用OLE DB介面對存儲在數據提供程序中的數據進行控制的應用程序。用戶應用程序歸為使用類。
服務提供程序Service Provider:是數據提供程序和使用者的組合。服務提供程序沒有自己的數據,但使用
OLE DB使用者介面來訪問存儲在數據提供程序中的數據。然後,服務提供程序通過打開數據提供程序介面使得數據對使用者有效。服務提供程序常用於向應用程序提供高層次服務,比如高級分布式查詢。
OLE DB編程時,用戶使用組件對象開發應用程序。這些組件有:
枚舉器:用於列出可用的數據源;
數據源:代表單獨的數據和服務提供程序,用於創建對話;
對話:用於創建事務和命令;
事務:用於將多個操作歸並為單一事務處理;
命令:用於向數據源發送文本命令(SQL),返回行集;
錯誤:用於獲得錯誤信息。
5.ActiveX數據對象(ADO):是微軟提供的面向對象的介面,與OLE DB類似,但介面更簡單,具有更廣泛的特徵數組和更高程度的靈活性。ADO基於COM,提供編程語言可利用的對象,除了面向VC++,還提供面向其他各種開發工具的應用,如VB,VJ等。ADO在伺服器應用方面非常有用,特別是對於動態伺服器頁面ASP(Active Server Page)。
ADO對象結構類似於OLE DB,但並不依靠對象層次。大多數情況下,用戶只需要創建並只使用需要處理的對象。下面的對象類組成了ADO介面。
Connection:用於表示與資料庫的連接,以及處理一些命令和事務。
Command:用於處理傳送給數據源的命令。
Recordset:用於處理數據的表格集,包括獲取和修改數據。
Field:用於表示記錄集中的列信息,包括列值和其他信息。
Parameter:用於對傳送給數據源的命令之間來回傳送數據。
Property:用與操作在ADO中使用的其他對象的詳細屬性。
Error:用於獲得可能發生的錯誤的詳細信息。
在VC++使用ADO需要進行COM操作,詳細方法在此就不贅述了。
在當今流行的分布式開發環境下,VC++6.0在資料庫開發方面有較強的優勢,學會
在不同的場合選用不同的技術,對開發人員來說是必要的技術。

Ⅹ VC多線程訪問資料庫的數據傳遞問題

說一些概念性的東西吧。
COM操作,它有一套自己關於跨線程和跨進程的模型,這是個復合模型,會衍生出大約7,8種組合。學習COM,這個是一定要吃透的。樓主閱讀一下關於CoInitializeEx函數的幫助文檔,能多多少少體會到一些。但如果沒學習過COM,光看MSDN的幫助文檔,如墜雲里霧里一般,很難理解的。因此,建議買本COM的書,稍微參閱一下,其次網上譬如CSDN中有很多熱心人寫的關於線程進程有關的COM模型,和使用規則,優缺點,可以拜讀一下!

在MFC中,可能不太會形成跨線程傳遞變數的危害性,這種觀念吧。所以,在MFC中,似乎我們能隨心所欲在線程之間傳遞變數,但其實是不對的,典型的就是主線程創建的窗口和控制項,最好不要在其它線程中直接操縱,而是通過線程間通信的方法,讓創建窗口和控制項的主線程來操縱窗口和控制項。

因此,變數是不能亂傳地,到了COM中,這個限制是非常明顯的,COM中有概念叫MARSHAL、PROXY、STUB,當然它主要是進程相關的概念,同樣說明了,非線程自己創建的東西,不是該線程使用就會有問題。

像VIEW這種界面的東西不要隨便亂傳給工作線程這種非界面線程。
我的建議是:
建工作線程,因為資料庫操作及從資料庫反饋到程序級的數據需要進行再加工,這些步驟都可能會非常耗時,耗時操作放在界面線程,會使界面線程無法處理WM_XXX的消息,造成界面假死。因此,像智能指針這種東西放到工作線程里進行獨立管理,工作線程通過智能指針向資料庫要數據,然後處理,存放數據結果到程序中約定的地方,如全局變數,虛擬內存等地方。數據處理完,通過自定義消息,向界面線程發送自定義消息,使界面線程能夠在自定義消息中,將保存的數據顯示到界面中,發送線程消息有個函數就是PostThreadMessage。
其他的細微細節也可以考慮,到底是創建自己的線程,還是使用線程池等。隨著經驗的豐富,會考慮很多問題的,關鍵是理論知識要學,實踐也不能沒有。

最後就是概念修正, _ConnectionPtr它是一個標準的C++類,C++類可以重載->操作符,這個被重載的指針操作符,使得通過該類實例化的變數在實際使用時,行為更像是一個指針,而不是個普通變數,這個被重載的指針操作符才是智能指針,而不是指_ConnectionPtr類是智能指針,頂多說它是個智能指針類,我也見過有翻譯成靈巧指針的,英文原版是SMART POINTER。