国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

無法獲取ADO.NET Dataset內(nèi)存_.Net教程

2024-07-10 12:50:48
字體:
供稿:網(wǎng)友

推薦:ASP.NET 2.0控件異步回調(diào)
雖然已經(jīng)有了ASP.NET AJAX了,最近學(xué)習(xí)ASP.NET控件的時候,逐步理解了原始的控件異步回調(diào)(代碼取自《ASP.NET 2.0 高級編程》): 首先,在Render事件中添加好一個事件。 protected override void RenderContents(HtmlTextWriter output) { output.RenderBeg

無法獲取ADO.NET Dataset內(nèi)存,Dataset是ADO.NET在內(nèi)存保存數(shù)據(jù)所用的新結(jié)構(gòu)。在某些方面上,Dataset和ADO的Recordset對象相似;不過,Dataset可以把整個schema(包括table、關(guān)系、關(guān)鍵字連同真實(shí)數(shù)據(jù))保存在內(nèi)存中,在這一點(diǎn)上,Dataset比Recordset功能更強(qiáng)。因此,你可以查詢和修改Dataset而不必?fù)?dān)心影響到正在使用它的數(shù)據(jù)庫。

當(dāng)考慮到Dataset把它的全部數(shù)據(jù)放在內(nèi)存中,有些人會擔(dān)心如果內(nèi)存耗盡了會出現(xiàn)什么問題。做一個合理的猜測很容易,但是實(shí)際情況可能要比你猜測的要復(fù)雜一些。為了演示一下.NET在這種情況下會有什么動作,我先說說如何建立一個不停向一個Dataset中載入數(shù)據(jù)直到內(nèi)存耗盡的項目。注意我們并不推薦這個過程,只是向你證明耗盡內(nèi)存是多么容易的一件事。

建立TooMuchData項目

建立一個不停地向一個Dataset載入數(shù)據(jù)的項目很容易。打開Visual Studio .NET并創(chuàng)建一個新的VB.NET窗口應(yīng)用程序。向視窗(form)中添加一個按鈕控件并雙擊它,這樣就開打了它的代碼窗口。在代碼窗口中填寫下列代碼:

Private Sub Button1_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles Button1.ClickDim sConnString As String = "Server=localhost;Database=pubs;uid=sa;pwd=;"Dim sSQL As String = "SELECT * FROM authors"Dim daProduct As SqlDataAdapter = New SqlDataAdapter(sSQL, sConnString)Dim myDS As New DataSet()Do While TruedaProduct.Fill(myDS, "authors")If myDS.Tables("authors").Rows.Count Mod 100 = 0 ThenDebug.WriteLine(myDS.Tables("authors").Rows.Count.ToString())End IfLoopEnd Sub


代碼的第三行建立字符串到變量sConnString的聯(lián)接。如果你想重新建立這個項目,你或許需要修改這一行的代碼,除非你在服務(wù)器上運(yùn)行它并有一個"sa/no password"用戶ID和相應(yīng)的口令。

代碼的第四行建立一個簡單的SQL查詢。一般不推薦Select *這樣的用法,但是這里沒有什么問題,因?yàn)槲覀兊哪繕?biāo)就是抓到盡可能多的記錄。選擇的表格(table)的首要(primary)關(guān)鍵字域也不是問題,因?yàn)槲覀儎?chuàng)建的Dataset是weakly type而且用來載入數(shù)據(jù)的DataTable的首要關(guān)鍵字域也沒有設(shè)置。

下兩行代碼創(chuàng)建DataAdapter和Dataset對象。然后進(jìn)入一個死循環(huán),在死循環(huán)中調(diào)用DataAdapter的Fill方法并把記錄加入稱之為“authors”的DataTable中。循環(huán)包括一個If語句用來顯示行數(shù)的當(dāng)前值是否可以被100整除。這不是不必可少的,但是它可以有兩個方面的作用:首先,你可以知道程序依然在運(yùn)行;其次,你可以知道大概有多少個記錄加到Dataset中去了。

運(yùn)行本程序
當(dāng)你建立本程序后,你可能希望在運(yùn)行它之前作些修改。當(dāng)Dataset越來越大時,它將消耗越來越多的內(nèi)存。一旦它耗盡所有可用內(nèi)存,Windows就開始把內(nèi)存交換到內(nèi)存交換文件中。在許多機(jī)器上,交換文件是相當(dāng)大的,所以本程序可能要運(yùn)行好幾個小時。例如,我在測試本程序時,用的是600-MHz PIII CPU和512-MB RAM的筆記本電腦。頁交換文件設(shè)置為最小值以縮短程序運(yùn)行時間——這是盡快完成測試的訣竅。即使這樣,本程序在塞滿所有的可用內(nèi)存之前還是運(yùn)行了幾十分鐘或者若干小時。

現(xiàn)在你可以運(yùn)行本程序并點(diǎn)擊按鈕控件來開始處理過程。它建立了一個到服務(wù)器的聯(lián)接,從表格中讀取數(shù)據(jù)并傳到Dataset中的DataTable對象。同樣的記錄也保存到該Dataset直到內(nèi)存最終耗盡。你可以通過任務(wù)管理器來觀察內(nèi)存的使用情況,你甚至可以看到可用內(nèi)存的隨著內(nèi)存和磁盤的數(shù)據(jù)交換而增減的情況。在我的機(jī)器中,Dataset在機(jī)器耗盡內(nèi)存前已經(jīng)長到1400000條記錄的規(guī)模。

耗盡內(nèi)存
一旦你耗盡內(nèi)存后會發(fā)生什么取決你是在VS.NET環(huán)境下運(yùn)行本程序還是運(yùn)行本程序的編譯版。如果你運(yùn)行的是本程序的編譯版并且沒有進(jìn)行錯誤處理(error handling),你在程序運(yùn)行中不會發(fā)現(xiàn)錯誤,它僅僅是在內(nèi)存耗盡時停止運(yùn)行。如果你在VS.NET環(huán)境下運(yùn)行代碼并且沒有進(jìn)行錯誤處理,程序?qū)V惯\(yùn)行并在調(diào)試窗口下出現(xiàn)下面的錯誤信息:


Fatal out of memory error.
The program '[2340] TooMuchData.exe' has exited with code 0 (0x0).


因此,你可能會開始嘗試添加一個錯誤處理函數(shù)來檢測System.OutOfMemoryException的情況。例如,你可能用一個Try…Catch語句來觀察是否出現(xiàn)例外。一個比較通用的方法如下:

Do While TrueTrydaProduct.Fill(myDS, "authors")If myDS.Tables("authors").Rows.Count Mod 100 = 0 ThenDebug.WriteLine(myDS.Tables("authors").Rows.Count.ToString())End IfCatch ex As ExceptionMessageBox.Show("Error: " & ex.Message)End TryLoop


不幸的是,這種方法根本就不工作。在MessageBox.Show語句上設(shè)置一個斷點(diǎn),理論上當(dāng)運(yùn)行到這個語句上應(yīng)該出現(xiàn),但是這一點(diǎn)永遠(yuǎn)也不會到達(dá)。當(dāng)最終耗盡內(nèi)存時,調(diào)試窗口出現(xiàn)的卻是下面的信息:

Fatal out of memory error.
An unhandled exception of type 'System.OutOfMemoryException' occurred in system.data.dll


如果是MessageBox出現(xiàn)該消息情況會好些,但是相反,VS.NET(或者Framework)產(chǎn)生并顯示了上述消息,跟蹤這個特定的錯誤并不是有效的解決方法。

如果在本程序中添加錯誤處理并編譯運(yùn)行它,那么你將得到另外一種結(jié)果。這次,你會發(fā)現(xiàn)MessageBox報告說程序遇到了一個無法處理的錯誤,類型為System.OutOfMemoryException,位于system.data.dll。然而,這個MessageBox來自Framework而不是你自己用代碼編寫的MessageBox。

并不象聽起來那么容易
你可以建立一個可以消耗所有可用內(nèi)存的Dataset,但是消耗的過程并不簡單,它需要大量的記錄,尤其是大量的時間。Dataset可能需要幾個小時才能填滿內(nèi)存,幾乎沒有什么應(yīng)用程序可以在這種情況下運(yùn)行很長時間,這就產(chǎn)生了問題。當(dāng)然,每臺機(jī)器的配置都不盡相同,如處理器速度、內(nèi)存容量以及交換文件大小,但是這種結(jié)果的出現(xiàn)都是不受歡迎的。

無論這種結(jié)果是如何令人討厭,錯誤都應(yīng)該可以被捕獲。不幸的是,我們在這種情況下無法捕獲到System.OutOfMemoryException錯誤,也就是說我們在應(yīng)用程序中很難處理這種特定錯誤。

分享:ASP.NET 2.0中使用OWC生成圖表
ASP.NET 2.0中,要顯示圖型的話,可以用MS office 2003的OWC組件,可以十分方便地看到圖表。在工程中,首先添加microsoft office web components 11.0的引用就可以了,然后要using Microsoft.Office.Interop.Owc11; 1、生成柱狀圖 //創(chuàng)建X坐標(biāo)的值,表示月份

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 甘孜县| 乐昌市| 前郭尔| 内江市| 新野县| 浑源县| 专栏| 那曲县| 武川县| 利川市| 邵东县| 新民市| 湾仔区| 信宜市| 黔江区| 濮阳县| 石阡县| 教育| 象山县| 建水县| 平凉市| 石城县| 勐海县| 焉耆| 东兴市| 清水河县| 攀枝花市| 瑞昌市| 镇原县| 清水县| 惠来县| 九龙县| 盐源县| 垫江县| 乾安县| 宁津县| 三江| 苍南县| 皮山县| 平邑县| 墨江|