2006年06月04日

有2种方法 1.用WebClient类;2用WebResponse类和WebRequest类

Mircsoft在dotnet1.1框架下提供的向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法。
通过这个类,大家可以在脱离浏览器的基础上模拟浏览器对互联网上的资源的访问和发送信息。
   WebClient类不能被继承,在dotnet1.1框架中已经为我们提供了WebRequest和WebResponse两个强大的类来
处理向URI标示的资源和获取数据了。然后,不足的是利用WebRequest和WebResponse时设置过于复杂。
使用起来颇为费劲。于是乎有了现在的WebClient,WebClient其实可以理解为对WebRequest和WebResponse等
协作的封装。它使人们使用起来更加简单方便,然后它也有先天不足的地方。那就是缺少对cookies/session的
支持,用户无法对是否自动url转向的控制,还有就是缺少对代理服务器的支持。关于session/url转向控制/代理
服务器的使用我将在以后关于WebRequest/WebResponse的话题里面向大家介绍。下面先给大家简单介绍一
下WebClinet类。

  类名:WebClient
  命名空间System.Net.WebClient

 

公共构造函数

WebClient 构造函数 初始化 WebClient 类的新实例。

公共属性

BaseAddress 获取或设置 WebClient 发出请求的基 URI。
Container(从 Component 继承) 获取 IContainer,它包含 Component
Credentials 获取或设置用于对向 Internet 资源的请求进行身份验证的网络凭据。
Headers 获取或设置与请求关联的标头名称/值对集合。
QueryString 获取或设置与请求关联的查询名称/值对集合。
ResponseHeaders 获取与响应关联的标头名称/值对集合。
Site(从 Component 继承) 获取或设置 ComponentISite

公共方法

CreateObjRef(从 MarshalByRefObject 继承) 创建一个对象,该对象包含生成用于与远程对象进行通讯的代理所需的全部相关信息。
Dispose(从 Component 继承) 已重载。释放由 Component 占用的资源。
DownloadData 从具有指定 URI 的资源下载数据。
DownloadFile 从具有指定 URI 的资源将数据下载到本地文件。
Equals(从 Object 继承) 已重载。确定两个 Object 实例是否相等。
GetHashCode(从 Object 继承) 用作特定类型的哈希函数,适合在哈希算法和数据结构(如哈希表)中使用。
GetLifetimeService(从 MarshalByRefObject 继承) 检索控制此实例的生存期策略的当前生存期服务对象。
GetType(从 Object 继承) 获取当前实例的 Type
InitializeLifetimeService(从 MarshalByRefObject 继承) 获取控制此实例的生存期策略的生存期服务对象。
OpenRead 为从具有指定 URI 的资源下载的数据打开一个可读的流。
OpenWrite 已重载。打开一个流以将数据写入具有指定 URI 的资源。
ToString(从 Object 继承) 返回表示当前 ObjectString
UploadData 已重载。将数据缓冲区上载到具有指定 URI 的资源。
UploadFile 已重载。将本地文件上载到具有指定 URI 的资源。
UploadValues 已重载。将名称/值集合上载到具有指定 URI 的资源。



从上表中我们可以看到WebClient提供四种将数据上载到资源的方法:

  • OpenWrite 返回一个用于将数据发送到资源的 Stream
  • UploadData 将字节数组发送到资源并返回包含任何响应的字节数组。
  • UploadFile 将本地文件发送到资源并返回包含任何响应的字节数组。
  • UploadValuesNameValueCollection 发送到资源并返回包含任何响应的字节数组。

另外WebClient还提供三种从资源下载数据的方法:


  下面我们将通过一个简单的应用程序来测试WebClient的最简单用法作为本小节的结束让大家对WebClient有个初步的认识
  
   例子1:利用WebClient实现对博客园首页的访问
  
    首先我们用HttpLook对这次访问进行分析,为了方便分析我特别将浏览器对图片的访问去掉 让我们能看到更简便的分析结果
   
     我们可以看到整个过程中我们发起了4次资源请求,其中第一次是对博客园首页进行访问
     第二次访问的是样式表文件,第三和四次访问的是js脚本。
     我们点击第一项可以看见关于这次资源访问的http头部信息,所谓http头部就是我们不能看见的浏览器和远程服务器传递的一些不可见元素。
1GET / HTTP/1.1
2Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
3Accept-Language: zh-cn
4UA-CPU: x86
5Accept-Encoding: gzip, deflate
6User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
7Host: www.cnblogs.com
8Connection: Keep-Alive
9Cookie: .DottextCookie=(隐藏)
  这些http信息包含了浏览器访问的过程。其中
  第一行:请求地址的相对路径和使用协议 相对路径为/ 协议采用http1.1
  第二行:表示我们请求的资源种类。
  第三行:我们的语言是简体中文。
  第四行:我们使用的cup结构。这个http头在一般的网页中并不过见。估计是博客园的一次调查??
  第五行:标示采用gzip方式压缩html编码进行传递。只有一些浏览器支持的gzip解压缩时采用这种方式传递文本。由于我们
  要写的程序不具备gzi解压缩的能力 所以我们不考虑使用这种方式发送请求。
  第六行:浏览器说明
  第七行:当前主机地址
  第八行:连接请求状态
  第九行:cookies信息
 
  我在新建的应用程序里面利用WebClient来实现这了一过程。
  
  下面我将就关键实现做一些解释
 1WebClient _client=new WebClient();
 2            _client.BaseAddress="http://www.cnblogs.com";
 3            _client.Headers.Add("Accept","image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
 4            _client.Headers.Add("Accept-Language","zh-cn");
 5            _client.Headers.Add("UA-CPU","x86");
 6            //_client.Headers.Add("Accept-Encoding","gzip, deflate");
 7            _client.Headers.Add("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");
 8            System.IO.Stream objStream=_client.OpenRead("/");
 9            System.IO.StreamReader _read=new System.IO.StreamReader(objStream,System.Text.Encoding.UTF8);
10            textBox1.Text=_read.ReadToEnd();

  第一行:新建一个WebClient 实例_client
  第二行~第七行:将上边捕捉到的Http头部放入到_client实例,注意第六行的被注释掉了。因为我们的程序无法进行gzip解码所以如果这样请求
  获得的资源可能无法解码。当然我们可以给程序加入gzip处理的模块 那是题外话了。
  第八行:利用_client.OpenRead(string URI)的方法获取网上资源的Stream
  第九行:利用StreamReader将Stream用我们需要的编码方法去解析。这里使用了UTF8。对应不同的网站可以使用Default等不同的解码方法。
  第十行:将我们解码后的内容放到textBox1里面显示出来

2.WebRequest和WebResponse类
   WebRequest request=WebRequest.Create(TextBox1.Text);
   WebResponse response=request.GetResponse();
   Stream resStream=response.GetResponseStream();
   StreamReader sr=new StreamReader(resStream,System.Text.Encoding.Default);
   string Webcode=sr.ReadToEnd();
   Response.Write(Webcode);
      resStream.Close();
   sr.Close();
总结 WebClient类使用起来比较简单,功能有限,特别是不能使用该类提供身份验证证书.这样上传数据时问题就出现了,许多站点都不会接受没有身份验证的上传文件.这时候就要用System.Net命名中的WebRequest类和WebResponse类了

/// <summary>
/// 去除HTML标记
/// </summary>
/// <param name=strHtml>包括HTML的源码 </param>
/// <returns>已经去除后的文字</returns>
public static string StripHTML(string strHtml)
{
string [] aryReg ={
@<script[^>]*?>.*?</script>,

@<(\\/\\s*)?!?((\\w+:)?\\w+)(\\w+(\\s*=?\\s*((['])(\\\\['tbnr]|[^\\7])*?\\7|\\w+)|.{0})|\\s)*?(\\/\\s*)?>,
@([\\r\\n])[\\s]+,
@&(quot|#34);,
@&(amp|#38);,
@&(lt|#60);,
@&(gt|#62);,
@&(nbsp|#160);,
@&(iexcl|#161);,
@&(cent|#162);,
@&(pound|#163);,
@&(copy|#169);,
@&#(\\d+);,
@–>,
@<!–.*\\n

};

string [] aryRep = {
,
,
,
\\,
&,
<,
>,
,
\\xa1,//chr(161),
\\xa2,//chr(162),
\\xa3,//chr(163),
\\xa9,//chr(169),
,
\\r\\n,

};

string newReg =aryReg[0];
string strOutput=strHtml;
for(int i = 0;i<aryReg.Length;i++)
{
Regex regex = new Regex(aryReg[i],RegexOptions.IgnoreCase );
strOutput = regex.Replace(strOutput,aryRep[i]);
}

strOutput.Replace(<,);
strOutput.Replace(>,);
strOutput.Replace(\\r\\n,);


return strOutput;
}
转自:http://goaler.xicp.net/ShowLog.asp?ID=477

一个正则表达式的类

转贴:xiaxia 日期:2004-08-06 人气:102
using System;
namespace Regexlib {
/// /// Class1 的摘要说明。
public class Regexlib {
public Regexlib() {
// // TODO: 在此处添加构造函数逻辑 //
}
//搜索输入字符串并返回所有 href="…"值
string DumpHrefs(String inputString) {
Regex r;
Match m;
r = new Regex("href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))",
RegexOptions.IgnoreCase|RegexOptions.Compiled);
for (m = r.Match(inputString);
m.Success; m = m.NextMatch()) {
Return("Found href " + m.Groups[1]);
}
}
//验证Email地址
bool IsValidEmail(string strIn) {
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}
//dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。
string MDYToDMY(String input) {
return Regex.Replace(input,"\\b(?\\d{1,2})/(?\\d{1,2})/(?\\d{2,4})\\b","${day}-${month}-${year}");
}
//验证是否为小数
bool IsValidDecimal(string strIn) {
return Regex.IsMatch(strIn,@"[0].\d{1,2}|[1]");
}
//验证是否为电话号码
bool IsValidTel(string strIn) {
return Regex.IsMatch(strIn,@"(\d+-)?(\d{4}-?\d{7}|\d{3}-?\d{8}|^\d{7,8})(-\d+)?");
}
//验证年月日
bool IsValidDate(string strIn) {
return Regex.IsMatch(strIn,@"^2\d{3}-(?:0?[1-9]|1[0-2])-(?:0?[1-9]|[1-2]\d|3[0-1])(?:0?[1-9]|1\d|2[0-3]):(?:0?[1-9]|[1-5]\d):(?:0?[1-9]|[1-5]\d)$");
}
//验证后缀名
bool IsValidPostfix(string strIn) {
return Regex.IsMatch(strIn,@"\.(?i:gif|jpg)$");
}
//验证字符是否再4至12之间
bool IsValidByte(string strIn) {
return Regex.IsMatch(strIn,@"^[a-z]{4,12}$");
}
//验证IP
bool IsValidIp(string strIn) {
return Regex.IsMatch(strIn,@"^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$");
}
}
}

using System;
using System.Xml;
using System.Text;
using System.Net;
using System.IO;
using System.Collections;
using System.Text.RegularExpressions;

public class App
{
public static void Main()
{
string strCode;
ArrayList alLinks;

Console.Write(请输入一个网页地址:);
string strURL = Console.ReadLine();
if(strURL.Substring(0,7) != @http://)
{
strURL = @http:// + strURL;
}

Console.WriteLine(正在获取页面代码,请稍侯…);
strCode = GetPageSource(strURL);

Console.WriteLine(正在提取超链接,请稍侯…);
alLinks = GetHyperLinks(strCode);

Console.WriteLine(正在写入文件,请稍侯…);
WriteToXml(strURL,alLinks);
}

// 获取指定网页的HTML代码
static string GetPageSource(string URL)
{
Uri uri =new Uri(URL);

HttpWebRequest hwReq = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse hwRes = (HttpWebResponse)hwReq.GetResponse();

hwReq.Method = Get;

hwReq.KeepAlive = false;

StreamReader reader = new StreamReader(hwRes.GetResponseStream(),System.Text.Encoding.GetEncoding(GB2312));

return reader.ReadToEnd();
}

// 提取HTML代码中的网址
static ArrayList GetHyperLinks(string htmlCode)
{
ArrayList al = new ArrayList();

string strRegex = @http://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?;

Regex r = new Regex(strRegex,RegexOptions.IgnoreCase);
MatchCollection m = r.Matches(htmlCode);

for(int i=0; i<=m.Count-1; i++)
{
bool rep = false;
string strNew = m[i].ToString();

// 过滤重复的URL
foreach(string str in al)
{
if(strNew==str)
{
rep =true;
break;
}
}

if(!rep) al.Add(strNew);
}

al.Sort();

return al;
}

// 把网址写入xml文件
static void WriteToXml(string strURL, ArrayList alHyperLinks)
{
XmlTextWriter writer = new XmlTextWriter(HyperLinks.xml,Encoding.UTF8);

writer.Formatting = Formatting.Indented;
writer.WriteStartDocument(false);
writer.WriteDocType(HyperLinks, null, urls.dtd, null);
writer.WriteComment(提取自 + strURL + 的超链接);
writer.WriteStartElement(HyperLinks);
writer.WriteStartElement(HyperLinks, null);
writer.WriteAttributeString(DateTime,DateTime.Now.ToString());


foreach(string str in alHyperLinks)
{
string title = GetDomain(str);
string body = str;
writer.WriteElementString(title,null,body);
}

writer.WriteEndElement();
writer.WriteEndElement();

writer.Flush();
writer.Close();
}

// 获取网址的域名后缀
static string GetDomain(string strURL)
{
string retVal;

string strRegex = @(\\.com/|\\.net/|\\.cn/|\\.org/|\\.gov/);

Regex r = new Regex(strRegex,RegexOptions.IgnoreCase);
Match m = r.Match(strURL);
retVal = m.ToString();

strRegex = @\\.|/$;
retVal = Regex.Replace(retVal, strRegex, ).ToString();

if(retVal == )
retVal = other;

return retVal;
}
}

2006年05月29日

我们不得不承认,Mono 项目对于开发者来说,已经成为在开源项目中最引人期待渴望的项目了。它的出现使得.NET framework可以首次在Linux和其它的平台上运行。把应用程序的部署扩大到了更大的范围。


最近,Mono项目的Beta3版已经发布。在这篇文章里,我希望可以使你了解到如何去得到Mono 的Beta3 版,并且如何使它在你的linux 系统中运行,还有如何通过Mono平台运行你的第一个.NET应用程序。

如果你是一个Windows 平台下的开发者,如果你正在考虑用 Linux作为你 .NET 应用程序的主机。那么Mono beta版提供了一个很好的办法,使你可以预先在Linux 平台上对您的应用程序进行测试和调试。

提醒:
Mono Beta 3仅仅是被用来测试,并不推荐当作一个产品去使用。
我们用Red Hat 9.0作为我们这次文章讲解的平台来安装和配置Mono。如果你现在还没有Red Hat 或者其它版本的Linux服务器,那么,你可以从here下载Red Hat 的ISO文件安装。

但是,如果你没有空闲的计算机或者服务器去运行RedHat,你可以在你的计算机上安装一个双启动,或者,你可以通过软件做一个虚拟机,例如像VMWare。不过请注意看?Red Hat.安装说明。

当你安装好Red Hat并成功运行了Red Hat后,你下一步需要做的就是下载Mono Beta3从Go-Mono Web site.请注意,针对不同的操作系统的

Mono有不同的版本。

?Red Hat 9.0/x86
?Fedora Core 1/x86
?Fedora Core 2/x86
?SLES 8/x86
?SUSE 9/x86
?SUSE 9.1/x86
?Windows (2000 and above)
?Mac OS X
针对这篇文章,你需要下载的版本是Red Hat 9.0/x86 version.。有两种不同的下载途径。一种是比较大尺寸的zip格式文件,这个文件里包含了所需的所有RPM文件。另外一种是单独下载你所需的每个独立的RPM文件。

关于RPM
如果你是一个Linux的新手,是否对RPM 感到陌生。RPM 是“Red Hat Package Manager”它是一个标准的文件格式。通常在Linux 上的文件管理格式都是RPM。你可以学习到更多的RPM在here.

当然,最方便的方法还是下载包含所有你所需RPM文件的zip文件。当你下载,并解压缩了那个zip包后。你就会看见很多独立的RPM文件。这时你可以双击每一个RPM文件逐个去安装。但是这种做法需要注意安装的从属关系,先后次序。所以,一种比较简单的安装方法是通过命令的方式对RPM文件进行一次统一的安装。


首先你要保证你是用root的身份登陆的,然后输入如下命令一次安装所有的这些packages文件。
rpm -Uvh –nodeps *.rpm

如果在这个时候,你已经安装了一部份package文件,也不要紧你可以使用下面的命令一次性的重新安装所有的Mono package。

rpm -Uvh –nodeps –force *.rpm

技巧,在对 RPM文件进行操作的时候,如果不记得命令,可以输入RPM –help 或者查看这个文档here.。

Mono是一个集体的, 自发的开发项目, 旨在开发一个开放源代码的, Linux版的Microsfot.NET 开发平台. 作为一个有机的.NET整体, 它包括一个C#编译器, 一个公用语言运行时环境, 以及相关的一整套类库. Mono项目将使开发者开发的.NET应用程序不仅能能在windows平台上运行, 也能在任何支持Mono的平台上运行, 包括Linux, Unix. Mono项目将使大家能开发出各种跨平台的应用程序, 并能极大提高开源领域的开发效率.
  Microsoft.NET是一套强大的GUI应用程序开发和Web Services (.NET开发框架)开发工具;一个提供给最终用户应用程序(比如web服务和大量其他企业产品)的用户身份识别和验证系统("Hailstorm"). .NET开发工具包括C#编译器, 公用语言构架(CLI). 它能使程序员用C#或其他语言编写的程序运行在非windows系统之上. Microsoft和Corel最近宣布他们将在遵守Microsoft的"代码共享"许可下, 合作在FreeBSD平台上实现.NET.
  随着C#以及CLI被提交给ECMA和W3C标准化组织, "代码共享"许可的局限性将限制开发者的开发工作, 包括在其他平台上的商业开发。比如Linux,Unix, Solaris。
  与此相对, Mono项目为开放源代码的开发者提供了一个真正的"创建一次,随处部署"的工具包, 并能充分利用Microsft.NET的各项优点. Mono项目遵守GPL和LGPL的各项条款, 开发者能自由地编写, 并发布商业的或个人的应用程序. 而这些, Microsoft的"代码共享"许可是做不到的.
  Mono在他的开发构架中将提供三个关键部件, 以帮助开发者快速的在linux平台上开发, 部署, 运行.NET的兼容程序: 一个延伸自GNOME平台的C#编译器, 他将使开发者能创建.NET相兼容的应用程序. 这些开发者还将能在开放源代码的系统上使用和Microsoft CLI相兼容的类库来进行最终用户程序开发和web服务开发. Mono还有一个Linux版的Microsfot公用语言运行时环境(CLR)的及时编译(JIT)引擎. 这样, Linux上就能运行在Windows, Linux, 或Unix平台上编写的程序了. 在广大的开放源代码志愿者的支持下, 这些类库和工具已经能提供下载和试用: www.go-mono.com.
开放源代码协会通过Linux软件开发公司Ximian开始了一个旨在将微软.Net平台移植到Linux上来的项目。这个叫做Mono工程的项目包括创建一个开发平台允许人们为基于Linux和基于Windows系统的.Net开发应用程序。
据Ximian公司的首席技术官员Miguel de Icaza说Mono项目的起因是GNOME社团特别是Ximain公司对于一个改进的开发工具的需要。
但是Mono项目的影响却是更加深远的,因为这些开发工具是基于CLI(通用语言架构)和微软提交给欧洲计算机制造协会(ECMA)的C#实现标准的。如果Mono能够创建完成一套基于这些标准Linux开发工具集的话,开发者将能够编写同时在Windows和Linux上运行的.Net程序,这些程序甚至还可能在其它非Windows的操作系统上运行,比方Unix。
除了实际的开发过程,Mono项目的工具必须在开放源代码社团的内部完成而不能违反微软的知识产权专利--这实际上意味着开发者们必须基于标准重新构造这些工具而不能查看微软的任何源代码。
Mono项目包括三个核心的部分:一个C#语言的编译器,一个CLI和一个类库。 CLI是包含了类加载器的虚拟机,实时的编译器,和一个运行时环境的垃圾收集器。CLI这个组件将允许用C#编写的应用程序能够在象Linux这样的非Windows操作系统上运行。这与Java世界中Java虚拟机能够让一个应用程序在不同的操作系统上运行是类似的。
Mono项目的类库能够让应用程序完成核心的诸如XML处理,文件输入输出,和连接网络之类的任务。它将会和微软的CLI兼容(与微软在.Net 框架中发布的东西紧密的配套),还有一点就是将由开放源代码团体编写的额外的类库也将和CLI兼容。
Ximian公司的de Icaza希望在年底到达项目的一个里程碑,这时编译器将能够编译类库了。图形用户界面组件--创建GUI程序所需的类库--将在明年中完成。 “我们在这个方面工作的原因是希望升级我们的开发平台来创建我们的Evolution桌面应用程序,”de Icazo说。Evolution是Ximian公司的电子邮件客户端及个人和工作组信息管理程序。“当我们看见.Net framework的时候,我们觉得这些就是我们将用来开发我们下一代产品要使用的工具,”他说。
Ximian并不将Mono和它自己看作是给Linux开发者一种途径在可用的开发工具方面赶上Windows。其实,Linux开发者将更喜欢用他们目前使用的工具来编写的编译应用程序。Ximian 将另一个开放源代码项目,SharpDevelop看作是用来提供与微软Visual Studio .Net类似的集成开发环境的一种途径。
通过以开放源代码的方式开发Mono,这个项目包含了许多对开发过程拥有广泛兴趣的人们。虽然Ximian可能希望找一些改进的开发工具来加速它的应用程序的开发过程,但其它的开发者可能是希望找到能够让他们在Windows上编写程序然后在Linux系统上运行它们的开发工具。
其中的一个大问题是如何避免微软的知识产权保护。“我们避免知识产权保护的方法是坚持非研究性的主题并使用现有的技术实现其功能,”de Icaza说。例如,Mono JIT编译器没有使用任何先进的JIT编译器技术,而是基于老的JIT技术。
De Icaza还声称Mono必须“着眼大处”还不仅仅是去年ECMA规定了些什么。也就是说,Ximian计划参与标准的制定过程并创建类库来提高.Net 框架的薄弱之处,比方说电子邮件管理。
据Giga Information Group的副分析师Stacey Quandt称,微软不太可能支持Mono因为其授权是与GNU 通用公众证书为C#的授权和GNU弱公众证书为类库和运行库的授权联系在一起的。
但即使微软不支持Mono,Mono的存在也证实了微软对于.Net能够移植到其它平台的声明是正确的。
Quandt说面向更广泛的开发团体是Mono面临的另一个挑战。例如IBM和Sun都在Java上花费了巨额的投资,自然也就很难容忍竞争行为。
要得到更多的Mono的信息,请访问:
http://www.go-mono.com/

由于富有竞争力的价格和易于使用,MySQL在市场占有率方面逐步提升。开放源代码社区为了扩展MySQL的使用范围,开发出了.Net框架(.NET Framework)中可以使用的数据库连接器。我们就来学习一下如何在.Net应用程序中使用MySQL。

  每周三发布的TechRepublic的.NET通讯,包含有网络服务, ASP.NET, ADO.NET, 和 Visual Studio .NET相关的实用技巧与代码实例. 现在就自动订阅!

  MySQL渐渐的成为了在选择数据库平台时一个切实可行的数据库方案。能够证明这一点的就是许多公司都选择mySQL作为他们的数据库平台,例如 Google、美联社(The Associated Press) 以及美国国家航空宇航局( NASA)。虽然对于一个开放源代码来说,低廉的价格常常被当作主要优点来说服客户,但是对于象Google那样的大规模的组织来说,他们不会放心的把非常有用的信息存放在一个只有价格优势的数据库产品中。MySQL真正的实力远远的超过了他的价格优势,他提供了丰富的来自开放源代码社区和商业化的附加工具。

  和.NET的数据整合

  MySQL 社区已经开发出了MySQL的数据接口,他提供了连接数据源和程序代码的基本功能。在Windows平台上,有如下的MySQL连接器:

  * MySQL Connector/Net 1.0 (之前被称为ByteFX.Data):是一个为MySQL设计的开放源代码.NET数据接口。它是完全用C#来开发的,我们可以在在 MySQL.com网站上找到它。(注意:在本文的例子中,我们都会使用MySQL Connector/Net 1.0这个数据接口来连接数据库,利用Windows安装程序即可轻易安装它,它的代码实例和文档也包含其中。)

  * MySQLDirect .NET Data Provider: 是一个由 Core Lab 开发的商业数据接口。他的价格由购买的许可证的类型决定,但是我们可以下载它的试用版。

  如果你使用 Mono,那么在 Mono网站上可以找到PHP连接器的下载。如果你在Windows平台上运行Mono的话,你下载的连接器包含了安装程序。如果不是的话,那就要根据你的操作系统的种类去下载合适的连接器了。

  使用MySQL数据接口

  安装好MySQL的数据接口后,你必须在你的代码中引入它才能使用。你可以使用 MySql.Data.MySqlClient这个名空间来连接 MySQL 服务器。在C#中,可以使用using语句来引入MySQL数据接口:

  using MySql.Data.MySqlClient;

  另外,你也可以在一个ASP.NET的网页表单(Web Form)中通过使用导入(Import)指令来引入MySQL数据接口:

  

  或者,你也可以在你的代码里在使用这个名空间时,写全一个类的完整路径,但是这样的话会比使用Import指令来导入输入更多的字符,浪费更多的字节。指定了名空间后,我们就可以和MySQL数据库进行数据交互了。 MySql.Data.MySqlClient这个名空间提供了许多用于处理MySQL数据的类。下面是这些类的一个样本:

  * MySqlConnection: 管理和 MySQL 服务器/数据库的连接;

  * MySqlDataAdapter: 一套用于填充DataSet对象和更新MySQL数据库的命令和连接的集合;

  * MySqlDataReader: 让你能够从一个 MySQL 数据库读取数据。它是一个单向的数据流;

  * MySqlCommand: 提供向数据库服务器发送指令的功能;

  * MySqlException: 当发生问题时提供例外处理。

  我们会使用其中的一些类去和我们的范例数据库进行数据交互。

  连接 MySQL 数据库

  使用MySQL数据库的第一步是要通过MySQLConnection类和数据库建立连接。通过一个连接字串,MySqlConnection 将会被实例化成一个示例。连接字符串将告诉代码到哪里去找MySQL服务器以及其他一些选项。

  一个连接字串告诉代码使用指定的用户名和密码去连接一个名为MySQLTestServer的MySQL服务器,并进入techrepublic数据库。我在我的测试机上设定了允许匿名登陆(这样的设定有非常大的安全漏洞,所以不建议你在生产服务器上也这么做),所以在范例中将会使用如下的连接字串:

  "server=localhost; database=sitepoint;"

  指定了连接字串后, MySqlConnection 对象的Open方法就被调用并打开连接。连接建立后,你就可以给MySQL数据库发送命令或从数据库获得数据了。

  ASP.NET和MySQL的组合

  让我们更深入的讨论一下结合MySqlConnection类和其他的类来生成一个MySQL服务器上的数据库列表。表 B列出了一个使用C#写的ASP.NET的网页表单。它建立了一个连接,接着给服务器下了一个指令(SHOW DATABASES),然后通过MySqlReader对象把结果显示出来。

  用 MySqlCommand 对象向MySQL服务器发送 SHOW DATABASES 命令和直接在 MySQL 管理工具中输入这个命令得结果是一样的。唯一的区别是,我们在代码中必须使用另一个对象来获取结果集。MySqlDataReader 对象在获取结果时被实例化(通过 MySqlCommand 类的 ExecuteReader 方法)。MySqlDataReader 对象的 GetString 方法被用于通过ASP.NET的标签控制来显示结果集中的数据。GetString 方法的指针0指定了显示结果集的当前行(在while循环中)的第一列数据。

  Mono提示

  如果你使用开放源代码的Mono开发平台,例子中的代码只需要做小小的改动就能正常的运行。MySQL的数据接口在 ByteFX.Data.MySqlClient 这个空间名里,而不是Windows上的MySql.Data.MySqlClient空间名。事实上 MySQL 的数据接口原来是由 ByteFX公司开发的,但是后被MySQL公司收购。所以如果你使用Mono的话,你必须这样声明空间名:

  using ByteFX.Data.MySqlClient;

  结语

  MySQL 和 .NET 的组合提供了一个强大的开发平台。MySQL在开源社区得到了强大的技术支持,.NET也通过 Mono 而被开放源代码社区所接受。这样的组合提供了一个在Windows,及其他语言如UNIX或Linux,环境下高度灵活的开发平台。