关闭顶部展开顶部

无法获取ADO.NET Dataset内存_.Net教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:ASP.NET 2.0控件异步回调
虽然已经有了ASP.NET AJAX了,最近学习ASP.NET控件的时候,逐步理解了原始的控件异步回调(代码取自《ASP.NET 2.0 高级编程》): 首先,在Render事件中添加好一个事件。 protected override void RenderContents(HtmlTextWriter output) { output.RenderBeg

无法获取ADO.NET Dataset内存,Dataset是ADO.NET在内存保存数据所用的新结构。在某些方面上,Dataset和ADO的Recordset对象相似;不过,Dataset可以把整个schema(包括table、关系、关键字连同真实数据)保存在内存中,在这一点上,Dataset比Recordset功能更强。因此,你可以查询和修改Dataset而不必担心影响到正在使用它的数据库。

当考虑到Dataset把它的全部数据放在内存中,有些人会担心如果内存耗尽了会出现什么问题。做一个合理的猜测很容易,但是实际情况可能要比你猜测的要复杂一些。为了演示一下.NET在这种情况下会有什么动作,我先说说如何建立一个不停向一个Dataset中载入数据直到内存耗尽的项目。注意我们并不推荐这个过程,只是向你证明耗尽内存是多么容易的一件事。

建立TooMuchData项目

建立一个不停地向一个Dataset载入数据的项目很容易。打开Visual Studio .NET并创建一个新的VB.NET窗口应用程序。向视窗(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的联接。如果你想重新建立这个项目,你或许需要修改这一行的代码,除非你在服务器上运行它并有一个"sa/no password"用户ID和相应的口令。

代码的第四行建立一个简单的SQL查询。一般不推荐Select *这样的用法,但是这里没有什么问题,因为我们的目标就是抓到尽可能多的记录。选择的表格(table)的首要(primary)关键字域也不是问题,因为我们创建的Dataset是weakly type而且用来载入数据的DataTable的首要关键字域也没有设置。

下两行代码创建DataAdapter和Dataset对象。然后进入一个死循环,在死循环中调用DataAdapter的Fill方法并把记录加入称之为“authors”的DataTable中。循环包括一个If语句用来显示行数的当前值是否可以被100整除。这不是不必可少的,但是它可以有两个方面的作用:首先,你可以知道程序依然在运行;其次,你可以知道大概有多少个记录加到Dataset中去了。

运行本程序
当你建立本程序后,你可能希望在运行它之前作些修改。当Dataset越来越大时,它将消耗越来越多的内存。一旦它耗尽所有可用内存,Windows就开始把内存交换到内存交换文件中。在许多机器上,交换文件是相当大的,所以本程序可能要运行好几个小时。例如,我在测试本程序时,用的是600-MHz PIII CPU和512-MB RAM的笔记本电脑。页交换文件设置为最小值以缩短程序运行时间——这是尽快完成测试的诀窍。即使这样,本程序在塞满所有的可用内存之前还是运行了几十分钟或者若干小时。

现在你可以运行本程序并点击按钮控件来开始处理过程。它建立了一个到服务器的联接,从表格中读取数据并传到Dataset中的DataTable对象。同样的记录也保存到该Dataset直到内存最终耗尽。你可以通过任务管理器来观察内存的使用情况,你甚至可以看到可用内存的随着内存和磁盘的数据交换而增减的情况。在我的机器中,Dataset在机器耗尽内存前已经长到1400000条记录的规模。

耗尽内存
一旦你耗尽内存后会发生什么取决你是在VS.NET环境下运行本程序还是运行本程序的编译版。如果你运行的是本程序的编译版并且没有进行错误处理(error handling),你在程序运行中不会发现错误,它仅仅是在内存耗尽时停止运行。如果你在VS.NET环境下运行代码并且没有进行错误处理,程序将会停止运行并在调试窗口下出现下面的错误信息:


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


因此,你可能会开始尝试添加一个错误处理函数来检测System.OutOfMemoryException的情况。例如,你可能用一个Try…Catch语句来观察是否出现例外。一个比较通用的方法如下:

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语句上设置一个断点,理论上当运行到这个语句上应该出现,但是这一点永远也不会到达。当最终耗尽内存时,调试窗口出现的却是下面的信息:

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


如果是MessageBox出现该消息情况会好些,但是相反,VS.NET(或者Framework)产生并显示了上述消息,跟踪这个特定的错误并不是有效的解决方法。

如果在本程序中添加错误处理并编译运行它,那么你将得到另外一种结果。这次,你会发现MessageBox报告说程序遇到了一个无法处理的错误,类型为System.OutOfMemoryException,位于system.data.dll。然而,这个MessageBox来自Framework而不是你自己用代码编写的MessageBox。

并不象听起来那么容易
你可以建立一个可以消耗所有可用内存的Dataset,但是消耗的过程并不简单,它需要大量的记录,尤其是大量的时间。Dataset可能需要几个小时才能填满内存,几乎没有什么应用程序可以在这种情况下运行很长时间,这就产生了问题。当然,每台机器的配置都不尽相同,如处理器速度、内存容量以及交换文件大小,但是这种结果的出现都是不受欢迎的。

无论这种结果是如何令人讨厌,错误都应该可以被捕获。不幸的是,我们在这种情况下无法捕获到System.OutOfMemoryException错误,也就是说我们在应用程序中很难处理这种特定错误。

分享: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、生成柱状图 //创建X坐标的值,表示月份

来源:模板无忧//所属分类:.Net教程/更新时间:2009-03-03
loading.. 评论加载中....
相关.Net教程
闂備焦鐪归崺鍕垂闁秵鍋ら柡鍥舵緛缂嶆牠鏌涢埄鍐姇闁抽攱甯楅妵鍕即濡も偓娴滄儳顪冮妶蹇曠Ф闁瑰嚖鎷�
婵犵數鍋涢顓熸叏椤撱垹纾婚柟鐐灱濡插牓鏌¢崒婵囩《濠⒀勭⊕娣囧﹪鎳犻澶嗗亾濠靛鐓熼柕蹇婃櫅閻忔煡鏌熼崙銈嗗
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掑嫷妫戠紒杈╁仜椤撳吋寰勭€n亝顓鹃柣搴f嚀鐎氼厽绔熼崱娆愬床濞戞柧绶氶弻锝夊閳轰胶浼堥梺鐟板殩閹凤拷
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掑嫷妫戠紒杈╁仜椤撳吋寰勬繝鍕靛悑闂備浇顕栭崹搴ㄥ礋椤撗勑氶梻浣筋嚙闁帮絽岣胯铻炴繛鎴欏灪閸嬪鏌ㄩ悤鍌涘
闂傚倷鑳舵灙缂佺粯鍔欓獮濠冩償閵娿儳鍔﹀銈嗗笒閸婂摜鏁崼鏇炵閻庢稒岣块惌鎺斺偓瑙勬礃缁诲牓寮幘缁樻櫢闁跨噦鎷�
闂傚倷鑳舵灙缂佺粯鍔欓獮濠冩償閵娿儳鍔﹀銈嗗坊閸嬫捇鏌涘顒夊剳缂侇喖锕弫鍌炲礈瑜忛悡鎾绘煟鎼搭垳宀涢柡鍛箞閹苯鈻庨幋鐘碉紳婵炴挻鑹鹃敃銉р偓姘炬嫹
闂傚倷娴囬妴鈧柛瀣尰閵囧嫰寮介妸褉妲堥梺浼欏瘜閸o綁寮诲☉妯锋斀闁归偊浜為懗铏圭磽娴i潧濡芥俊鐐舵椤曪綁濡搁埡濠冩櫖濠电偛妫欓崹鐢电箔閿熺姵鈷戦柛婵嗗閳ь剙顭烽獮濠囧箻閼告娼熼梺璺ㄥ櫐閹凤拷
闂傚倷绀侀幖顐﹀疮閻楀牊鍙忓瀣捣缁€濠傤熆閼搁潧濮堥柣鎿勭秮閹娼幏宀婂妳濠电偛鐪伴崐鏇㈡箒闂佹寧绻傚Λ娆戠矆閳ь剟姊洪崨濞氭垿鎮ч悩鑼殾闁规壆澧楅弲鎼佹煥閻曞倹瀚�
濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙淇婇姘倯閻庢氨绮妵鍕箻鐎靛摜鐣洪柣搴㈢啲閹凤拷
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掑嫷妫戠紒杈╁仜椤撳ジ宕堕妸銉紩婵$偑鍊栭幐鑽ゆ崲閸愵亖鍋撳铏彧濞e洤锕、娑樜旈埀顒佹櫠閸欏绡€妞ゎ偒鍠楃€氾拷
濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙鎱ㄥ璇蹭壕閻庤娲﹂崜鐔笺€佸▎鎾崇闁绘挸绨堕崑鎾绘偨閸涘﹦鍘搁梺鍓插亝缁诲嫬鐡┑鐘愁問閸n垶骞忛敓锟�
濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙鎱ㄥ璇蹭壕闂佸搫鑻幊姗€宕洪埀顒併亜閹哄棗浜鹃梺瀹狀嚙闁帮綁鐛幋锕€绠涢梻鍫熺⊕椤斿棝姊绘担鍛婃儓閻庢碍鎮傞獮蹇涙晸閿燂拷
濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙鎱ㄥ璇蹭壕閻庤娲╃紞渚€鐛€n亖鏀介柛顐亗缁憋拷
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掑嫷妫戠紒杈╁仜椤撳吋寰勬繝鍕幀闂備胶鎳撻悺銊ф崲閸曨垼鏁傞悗娑櫭肩换鍡樸亜閺嶎煈娈斿褍寮剁换婵嬶綖椤旇棄顏�
闂備浇顕ф鎼佸储濠婂牆绀堟繝闈涱儐閸嬪鏌熼幆鐗堫棄闁活厽顨呴埞鎴︽偐閹绘帗娈梺濂告涧缂嶅﹪寮婚妶澶嬪殟闁靛鍎遍~宥夋⒑缂佹ḿ澹勭紓宥勭閻e嘲鈻庨幘瀛樻闂佽法鍣﹂幏锟�
UB闂傚倷绀佸﹢杈╁垝椤栫偛绀夋俊銈呮噽瀹撲線鏌涢妷銏℃珕閻庢碍宀搁幃妤€鈽夊▍铏灴閿濈偤鏁撻敓锟�
闂傚倷娴囨竟鍫熴仈缁嬫娼栧┑鐘崇閻掗箖鎮楅悽鐢点€婇柛瀣崌閻涱噣宕归鍙ョ棯婵犵數濮崑鎾绘煥閻曞倹瀚�
闂備浇顕ф鍝ョ不瀹ュ鍨傞柛婵嗗閼板潡鏌涢姀銏犳
闂傚倷绀侀幉鈥愁潖缂佹ɑ鍙忓瀣捣缁€濠傤熆鐠鸿櫣鐏遍柛妤佺缁绘盯宕卞Δ鈧銏ゆ煕閻愬樊妲圭紒缁樼〒缁辨瑩鎮╅崫鍕腐闂備胶枪妤犲繘骞忛敓锟�
缂傚倸鍊搁崐鐑芥倿閿曞倹鍋¢柨鏇炲€搁崹鍌涚節婵犲倸顏い鈺呮敱閵囧嫰骞掑鍥舵М缂備焦褰冨﹢閬嶅焵椤掑倸浠柛濠冪箘缁辨挸顫濇0婵囨櫓闂佽法鍣﹂幏锟�
©2017 www.mb5u.com濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙鎱ㄥ璇蹭壕閻庢鍣崳锝夊箖閳哄懎绠甸柟鐑樻尭閻︼拷
闂傚倷娴囬妴鈧柛瀣崌閺岀喖顢涘⿰鍐炬毉濡炪們鍎婚幏锟�&闂傚倷绀侀幉锛勬暜閹烘嚦娑㈠籍閸噥妫呴梺璺ㄥ櫐閹凤拷