|
<p >最近我写了一个.net环境下的C#动态链接库xmldb.dll。它仅包括一个XMLDBComponent类,这个类大大简化了数据库编程的工作量。举例来说,它可以执行一个sql查询,并以一个简单的调用方法把得到的数据转化成xml文档。<p >源代码包中包含三个工程文件。<p >● xmldblib建立库,xmldb.dll;<p >● xmldbtest是一个asp.net的测试程序;<p >● xmldbservice是一个web服务,它令使用不同机器和平台的用户都可以访问xmldb.dll;<p >除非特殊情况,样例代码都是用c#写的。<p >xmldbcomponent是用System.Data.OleDb 名字空间的类实现的。现在你仅使用一个类就可以在.net中完成所有的基本数据库工作,无需使用5个或更多的类。代价就是,你不能完全拥有.net框架类可给与的力量和控制。我不想要适应SQL sever而限制我的数据库,所以我不用System.Data.SqlClient 名字空间的类来构建自己的类,而宁愿用MS Access。System.Data.OleDb类不支持ODBC数据源是最糟糕的了。<p >代码仅在win2000,sql7和sql2000,以及MS Access数据库的环境中测试过。<p ><center><font color="#000099"><strong>简单的数据库访问</strong></font></center><p >首先,我们得创建一个XMLDBComponent对象的实例。这是通过调用静态的方法CreateObject(),如下:<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>XMLDBLib.XMLDBComponent obj = XMLDBLib.XMLDBComponent.CreateObject( &quot rovider=myProvider;Database=myDB;Server=myServer;&quot; + &quot;User ID=me assword=&quot;);</ccid_code></pre></td></tr></table></ccid_nobr><p >上面代码中的参数是连接字符串。对象创建之后,下面的代码会执行一个sql查询,然后将返回的数据存成一个文件。<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>System.Xml.XmlDocument doc = obj.GetXmlDocument( &quot;select ID, firstname, lastname, hiringdate &quot; + &quot;from employee&quot;);obj.Close();// or call Release instead of Close:// obj.Release();if(doc==null){ String strError = obj.GetLastError(); // more error handling code}else{ doc.Save(&quot;c:\temp\employee.xml&quot;);}</ccid_code></pre></td></tr></table></ccid_nobr><p >Close()方法会关闭数据库连接,释放所有内部资源。如果你稍后还要用到XMLDBComponent对象就无需调用这个方法。即使你调用了Close(),在下一次使用对象的时候,它就知道如何自动的连接数据库。事实上,每次由于数据库出现错误而刷新数据库连接时,内部都会调用Close()方法。稍后我们会谈到Release()方法。<p >下面是展现上面代码返回数据的xml文件。<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>&lt;XMLData&gt; &lt;Record&gt; &lt;ID&gt;334&lt;/ID&gt; &lt;firstname&gt;Albert&lt;/firstname&gt; &lt;lastname&gt;Einstein&lt;/lastname&gt; &lt;hiringdate&gt;3/12/1999&lt;/hiringdate&gt; &lt;/Record&gt; &lt;Record&gt; &lt;ID&gt;404&lt;/ID&gt; &lt;firstname&gt;Clint&lt;/firstname&gt; &lt;lastname&gt;Eastwood&lt;/lastname&gt; &lt;hiringdate&gt;12/21/2000&lt;/hiringdate&gt; &lt;/Record&gt; &lt;Record&gt; &lt;ID&gt;536&lt;/ID&gt; &lt;firstname&gt;James&lt;/firstname&gt; &lt;lastname&gt;Bond&lt;/lastname&gt; &lt;hiringdate&gt;10/23/2002&lt;/hiringdate&gt; &lt;/Record&gt; &lt;RecordCount&gt;3&lt;/RecordCount&gt; &lt;FieldCount&gt;4&lt;/FieldCount&gt;&lt;/XMLData&gt;</ccid_code></pre></td></tr></table></ccid_nobr><p >GetXmlDocument()方法从数据库中取得数据,并且创建输出文档对象。它出错时返回null。在输出的xml文档中,每一个记录都被<ccid_code>&lt;Record&gt;</ccid_code>元素所包含,记录的每一字段都是子元素。如果一个字段值是null,那么相应的子元素不会出现在输出文档中。sql查询中使用的字段名会作为字段元素的名字使用。如果其字段没有指明(比如select * from..),数据库中相应的字段名会被用为元素名。sql查询时,计数字段必须给出名字,比如select count(*) as total from employee。在xml文档的末尾,有两个元素<ccid_code>&lt;RecordCount&gt; 和 &lt;FieldCount&gt; 显示了输出纪录集的大小。</ccid_code><p >GetXmlString()和GetXmlDocument() 除了输出的是字符串而不是文档对象外基本一样。这种方法在出错时其返回空字符串。而且,不会有由XMLDBComponent的问题引起的异常。你可以通过返回值来查错,GetLastError()返回最近错误的描述性信息。 <p align="center"><font color="FF0000" >1</font>2<span class="content01">下一页>></span></p></p> |
|