<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>我想网 &#187; .Net</title>
	<atom:link href="http://www.iwanna.cn/topics/develope/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.iwanna.cn</link>
	<description></description>
	<lastBuildDate>Sat, 31 Jul 2010 15:12:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>图解Linux下如何搭建C#开发环境</title>
		<link>http://www.iwanna.cn/archives/2010/07/13/4523/</link>
		<comments>http://www.iwanna.cn/archives/2010/07/13/4523/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 15:08:49 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=4523</guid>
		<description><![CDATA[如果平时主要开发控制台类、组件、后端服务等程序，可以尝试在Linux类操作系统下搭建C#.Net开发环境，好处是在Linux环境里你不用担心朋友或 同事拿你的电脑来玩魔兽世界或者一不小心被装了一大堆流氓软件  先看看本篇文章最终效果：在 Ubuntu 里跑的开发环境 MonoDevelop： 		

如果平时主要开发控制台类、组件、后端服务等程序，可以尝试在Linux类操作系统下搭建C#.Net开发环境，好处是在Linux环境里你不用担心朋友或同事拿你的电脑来玩魔兽世界或者一不小心被装了一大堆流氓软件 
1、Linux发行版的选择
在Linuxux操作系统里只要安装Mono环境就可以开发C#程序，Linux的众多发行版RedHat/CentOS/Fedora、OpenSuse、Debian、Ubuntu都可以安装Mono。
鉴于目前 Ubuntu 容易安装、界面漂亮而且比较多人用作桌面环境，所以这里推荐使用 Ubuntu 10.04 。官方网站 是：http://www.ubuntu.com/
在官方网站下载回来的是一个光盘映像文件（ISO格式），这里需要注意的是 Ubuntu 共有4个不同版本的ISO文件：Desktop版、Alternative版、Netbook版、Server版。一般下载Desktop就可以了。如果你想通过网络启动安装程序或者使用硬盘安装则需要下载Alternative版。
如果你的电脑硬件配置比较低（内存少于等于512MB），还可以下载一个轻量级的衍生版：Xubuntu（http://www.xubuntu.org/），如果你的电脑只有256MB内存，那 还可以 下载另一个衍生版Lubuntu（http://lubuntu.net/），这个更加轻量级，平时系统启动后只占用 70～100MB内存。
2、安装Ubuntu
安装Ubuntu 的方法非常简单，跟装WinXP差不多，只需点5，6次“下一步”过10来分钟就可以完成。因为关于安装Ubuntu的过程已经有大量的文章介绍，这里就不再赘述了，下面主要列举一下安装方式，大家可以根据自己的具体情况选择合适的：
（1）虚拟机安装
如果你的电脑速度飞快，内存比较大，用这种方式安装最快，虚拟机软件推荐使用免费的 VirtualBox。先装好虚拟机软件，然后创建一个新的虚拟机，把下载回来的 ISO文件挂靠到虚拟机，启动之后就可以安装了。
（2）尝试性安装
如果你仅仅想尝试一下在Linux环境开发C#的感觉，并不打算长期使用，则可以使用这种安装模式。这种安装模式不需要调整硬盘分区（因为整个Linux将安装到一个“虚拟硬盘”文件里头）、不会弄坏你的现有的系统和软件，只是性能会稍微减低一些。
首先你的系统必须是WinXP/Vista/Win7，然后把ISO文件和一个Wubi Installer (http://wubi-installer.org/) 的软件放在同一个目录，运行Wubi installer，选择Ubuntu的安装位置，然后就开始复制文件了，重启计算机会多出一项启动项“Ubuntu install”，选择它就开始真正的安装过程了。
下面的安装方式需要先在硬盘腾出一块空白的空间（最好准备至少10GB），主分区以外的自由空间或者扩展分区的自由空间都可以，你可以用PQMagic软件 慢慢 调整自己硬盘的分区大小。在安装过程中程序会询问你将Ubuntu安装在何处，选择使用“最大连续空间”即可。
（3）光盘安装
这种安装方式最简单，将下载回来的ISO文件刻 录成光盘，设置从光盘启动并重启计算机。
（4） 硬盘安装
要下载Alternative版的ISO文件， 放到C盘根目录，然后下载“UNetbootin
”（http://unetbootin.sourceforge.net/）软件，也放在C盘根目录，运行 UNetbootin，在发行版类型项选择Ubuntu和MediaHD即开始复制文件，重启电脑开始安装。
（5）用U盘安装/安装到U盘
先使用安装光盘启动计算机，选择“试用”进入LiveCD模式的Ubuntu，然后在“系统”-&#62;“系统管理”点击“制作启动盘”，准备一个1GB以上的U盘，启动盘制作程序会把Ubuntu的所有文件复制到U盘，然后就可以使用这个U盘启动其他电脑并安装系统了。也可以直接从这个U盘启动进入系统。
（6）通过网络安装
如果你的电脑没有光驱也不支持U盘启动，而带有从网卡启动（PXE）功能。或者有一批电脑需要批量安装，则可以使用这种安装模式，具体的请 见：http://kalashnicov.javaeye.com/blog/663337
3、安装开发环境 MonoDevelop
安装好Ubuntu10.04之后会发现系统已经自带Mono运行和编译环境，而且还有部分Ubuntu系统自带的软件是C#写的，比如tomboy便利帖、IQ测试游戏 gbrainy、照片查看和管理程序F-Spot

如果你已经习惯了Win7的任务栏，推荐另外一 个任务栏软件“Docky”，它也是C#写的

MacOS的同学请淡定。
记住在Ubuntu里安装软件是不需要去什么软 件下载网站的，所有需要的软件都可以在“Ubuntu软件中心”找到、安装、卸载。
运行“Ubuntu软件中心”，输入需要安装的软件名称，比如 “MonoDevelop”，然后点击“安装”，程序会自动上网下载并安装。
好了，现在就已经搭建好C#开发环境了，试试写一个HelloWorld吧（效果图 片见文章开头处）
4、其他
MonoDevelop除了能写C#程序之外， 还能写C，C++，Java等程序，只要安装相应的插件和编译器即可，

附录：
mono项目主页： http://mono-project.com
控制台、窗口、Web的HelloWorld演示程序：http://mono-project.com/Mono_Basics
mono 与 ms.net 的兼容性列表： http://mono-project.com/Compatibility

© 我想网 Akon 所有 , 2010. &#124;
永久链接 &#124;
没有评论 &#124;
提交到
Google [...]]]></description>
			<content:encoded><![CDATA[<p>如果平时主要开发控制台类、组件、后端服务等程序，可以尝试在<a href="http://www.iwanna.cn/tags/linux/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Linux">Linux</a>类操作系统下搭建C#.Net开发环境，好处是在<a href="http://www.iwanna.cn/tags/linux/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Linux">Linux</a>环境里你不用担心朋友或 同事拿你的电脑来玩魔兽世界或者一不小心被装了一大堆流氓软件 <img src='http://www.iwanna.cn/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> 先看看本篇文章最终效果：在 Ubuntu 里跑的开发环境 MonoDevelop： 		<img src="http://images.uheed.com/iwanna/2010/07/13/13564001408177609.jpg" alt="iwanna.cn 我想网" /><br />
<span id="more-4523"></span><br />
如果平时主要开发控制台类、组件、后端服务等程序，可以尝试在<a href="http://www.iwanna.cn/tags/linux/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Linux">Linux</a>类操作系统下搭建C#.Net开发环境，好处是在<a href="http://www.iwanna.cn/tags/linux/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Linux">Linux</a>环境里你不用担心朋友或同事拿你的电脑来玩魔兽世界或者一不小心被装了一大堆流氓软件 <img src='http://www.iwanna.cn/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
<strong>1、<a href="http://www.iwanna.cn/tags/linux/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Linux">Linux</a>发行版的选择</strong></p>
<p>在Linuxux操作系统里只要安装Mono环境就可以开发C#程序，<a href="http://www.iwanna.cn/tags/linux/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Linux">Linux</a>的众多发行版RedHat/CentOS/Fedora、OpenSuse、Debian、Ubuntu都可以安装Mono。</p>
<p>鉴于目前 Ubuntu 容易安装、界面漂亮而且比较多人用作桌面环境，所以这里推荐使用 Ubuntu 10.04 。官方网站 是：http://www.ubuntu.com/</p>
<p>在官方网站下载回来的是一个光盘映像文件（ISO格式），这里需要注意的是 Ubuntu 共有4个不同版本的ISO文件：Desktop版、Alternative版、Netbook版、Server版。一般下载Desktop就可以了。如果你想通过网络启动安装程序或者使用硬盘安装则需要下载Alternative版。</p>
<p>如果你的电脑硬件配置比较低（内存少于等于512MB），还可以下载一个轻量级的衍生版：Xubuntu（http://www.xubuntu.org/），如果你的电脑只有256MB内存，那 还可以 下载另一个衍生版Lubuntu（http://lubuntu<a href="http://www.iwanna.cn/tags/net/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with .Net">.net</a>/），这个更加轻量级，平时系统启动后只占用 70～100MB内存。</p>
<p><strong>2、安装Ubuntu</strong></p>
<p>安装Ubuntu 的方法非常简单，跟装WinXP差不多，只需点5，6次“下一步”过10来分钟就可以完成。因为关于安装Ubuntu的过程已经有大量的文章介绍，这里就不再赘述了，下面主要列举一下安装方式，大家可以根据自己的具体情况选择合适的：</p>
<p>（1）虚拟机安装</p>
<p>如果你的电脑速度飞快，内存比较大，用这种方式安装最快，虚拟机软件推荐使用免费的 VirtualBox。先装好虚拟机软件，然后创建一个新的虚拟机，把下载回来的 ISO文件挂靠到虚拟机，启动之后就可以安装了。</p>
<p>（2）尝试性安装</p>
<p>如果你仅仅想尝试一下在<a href="http://www.iwanna.cn/tags/linux/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Linux">Linux</a>环境开发C#的感觉，并不打算长期使用，则可以使用这种安装模式。这种安装模式不需要调整硬盘分区（因为整个<a href="http://www.iwanna.cn/tags/linux/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Linux">Linux</a>将安装到一个“虚拟硬盘”文件里头）、不会弄坏你的现有的系统和软件，只是性能会稍微减低一些。</p>
<p>首先你的系统必须是WinXP/Vista/Win7，然后把ISO文件和一个Wubi Installer (http://wubi-installer.org/) 的软件放在同一个目录，运行Wubi installer，选择Ubuntu的安装位置，然后就开始复制文件了，重启计算机会多出一项启动项“Ubuntu install”，选择它就开始真正的安装过程了。</p>
<p>下面的安装方式需要先在硬盘腾出一块空白的空间（最好准备至少10GB），主分区以外的自由空间或者扩展分区的自由空间都可以，你可以用PQMagic软件 慢慢 调整自己硬盘的分区大小。在安装过程中程序会询问你将Ubuntu安装在何处，选择使用“最大连续空间”即可。</p>
<p>（3）光盘安装</p>
<p>这种安装方式最简单，将下载回来的ISO文件刻 录成光盘，设置从光盘启动并重启计算机。</p>
<p>（4） 硬盘安装</p>
<p>要下载Alternative版的ISO文件， 放到C盘根目录，然后下载“UNetbootin</p>
<p>”（http://unetbootin.sourceforge<a href="http://www.iwanna.cn/tags/net/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with .Net">.net</a>/）软件，也放在C盘根目录，运行 UNetbootin，在发行版类型项选择Ubuntu和MediaHD即开始复制文件，重启电脑开始安装。</p>
<p>（5）用U盘安装/安装到U盘</p>
<p>先使用安装光盘启动计算机，选择“试用”进入LiveCD模式的Ubuntu，然后在“系统”-&gt;“系统管理”点击“制作启动盘”，准备一个1GB以上的U盘，启动盘制作程序会把Ubuntu的所有文件复制到U盘，然后就可以使用这个U盘启动其他电脑并安装系统了。也可以直接从这个U盘启动进入系统。</p>
<p>（6）通过网络安装</p>
<p>如果你的电脑没有光驱也不支持U盘启动，而带有从网卡启动（PXE）功能。或者有一批电脑需要批量安装，则可以使用这种安装模式，具体的请 见：http://kalashnicov.javaeye.com/blog/663337</p>
<p><strong>3、安装开发环境 MonoDevelop</strong></p>
<p>安装好Ubuntu10.04之后会发现系统已经自带Mono运行和编译环境，而且还有部分Ubuntu系统自带的软件是C#写的，比如tomboy便利帖、IQ测试游戏 gbrainy、照片查看和管理程序F-Spot</p>
<p><img src="http://images.uheed.com/iwanna/2010/07/13/1356401900590581.jpg" alt="iwanna.cn 我想网" /></p>
<p>如果你已经习惯了Win7的任务栏，推荐另外一 个任务栏软件“Docky”，它也是C#写的</p>
<p><img src="http://images.uheed.com/iwanna/2010/07/13/1356412543989522.jpg" alt="iwanna.cn 我想网" /></p>
<p>MacOS的同学请淡定。</p>
<p>记住在Ubuntu里安装软件是不需要去什么软 件下载网站的，所有需要的软件都可以在“Ubuntu软件中心”找到、安装、卸载。</p>
<p>运行“Ubuntu软件中心”，输入需要安装的软件名称，比如 “MonoDevelop”，然后点击“安装”，程序会自动上网下载并安装。</p>
<p>好了，现在就已经搭建好C#开发环境了，试试写一个HelloWorld吧（效果图 片见文章开头处）</p>
<p><strong>4、其他</strong></p>
<p>MonoDevelop除了能写C#程序之外， 还能写C，C++，<a href="http://www.iwanna.cn/tags/java/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Java">Java</a>等程序，只要安装相应的插件和编译器即可，</p>
<p><img src="http://images.uheed.com/iwanna/2010/07/13/13564131841418950.jpg" alt="iwanna.cn 我想网" /></p>
<p>附录：</p>
<p>mono项目主页： <a href="http://mono-project.com/" target="_blank">http://mono-project.com</a><br />
控制台、窗口、Web的HelloWorld演示程序：<a href="http://mono-project.com/Mono_Basics" target="_blank">http://mono-project.com/Mono_Basics</a><br />
mono 与 ms<a href="http://www.iwanna.cn/tags/net/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with .Net">.net</a> 的兼容性列表： <a href="http://mono-project.com/Compatibility" target="_blank">http://mono-project.com/Compatibility</a></p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2010. |
<a href="http://www.iwanna.cn/archives/2010/07/13/4523/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2010/07/13/4523/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2010/07/13/4523/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2010/07/13/4523/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2010/07/13/4523/">抓虾</a>
<hr />
</p>
	标签：<a href="http://www.iwanna.cn/topics/develope/net/" title=".Net" rel="tag nofollow">.Net</a>, <a href="http://www.iwanna.cn/tags/net/" title=".Net" rel="tag nofollow">.Net</a>, <a href="http://www.iwanna.cn/tags/linux/" title="Linux" rel="tag nofollow">Linux</a><br />

	<h2 class="related_post">您可能会感兴趣的其他文章</h2>
	<ul class="st-related-posts">
	<li><a href="http://www.iwanna.cn/archives/2009/04/02/149/" title="设计模式之单例模式 (2009年04月2日)">设计模式之单例模式</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/06/03/3657/" title="使用参数化查询防止SQL注入漏洞 (2010年06月3日)">使用参数化查询防止SQL注入漏洞</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/08/22/2181/" title="PHP开发者有了通往.net的新桥梁 (2009年08月22日)">PHP开发者有了通往.net的新桥梁</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/07/30/4802/" title="Linux流量监控工具 – iftop (最全面的iftop教程) (2010年07月30日)">Linux流量监控工具 – iftop (最全面的iftop教程)</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/08/23/2186/" title="42款最热门的Linux免费游戏 (2009年08月23日)">42款最热门的Linux免费游戏</a> </li>
</ul>


<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2010/07/13/4523/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用参数化查询防止SQL注入漏洞</title>
		<link>http://www.iwanna.cn/archives/2010/06/03/3657/</link>
		<comments>http://www.iwanna.cn/archives/2010/06/03/3657/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 15:31:06 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[Sql]]></category>
		<category><![CDATA[程序源码]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=3657</guid>
		<description><![CDATA[SQL注入漏洞曾经是Web应用程序的噩梦，CMS、BBS、Blog无一不曾受其害。
SQL注入的原理
以往在Web应用程序访问数据库时一般是采取拼接字符串的形式，比如登录的时候就是根据用户名和密码去查询：
string sql = "SELECT TOP 1 * FROM [User] WHERE UserName = ‘” +  userName + “‘ AND Password = ‘” + password + “‘”;
其中userName和password两个变量的值是由用户输入的。在userName和password都合法的情况下，这自然没有问题，但是 用户输入是不可信的，一些恶意用户只要用一些技巧，就可以绕过用户名、密码登录。
假设password的值是”1′ or ‘1′ = ‘1“，userName的值随便取，比如是”abc”，那变量sql的 值就是：

"SELECT TOP 1 * FROM [User] WHERE UserName = ‘abc’ AND Password  = ‘1′ or ‘1′ = ‘1′”
由于’1′ =  ‘1′恒为真，因此只要User表中有数据，不管UserName、Password的值是否匹配，这条SQL命令准能查出记录来。就这样，登录系统就被 破解了。
以往的防御方式
以前对付这种漏洞的方式主要有三种：

字符串检测：限定内容只能由英文、数字等常规字符，如果检查到用户输入有特殊字符，直接拒绝。但缺点是，系统 中不可避免地会有些内容包含特殊字符，这时候总不能拒绝入库。
字符串替换：把危险字符替换成其他字符，缺点是危险字符可能有很多，一一枚举替换相当麻烦，也可能有漏网之 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.iwanna.cn/tags/sql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Sql">SQL</a>注入漏洞曾经是Web应用程序的噩梦，CMS、BBS、Blog无一不曾受其害。</p>
<h3><a href="http://www.iwanna.cn/tags/sql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Sql">SQL</a>注入的原理</h3>
<p>以往在Web应用程序访问数据库时一般是采取<strong>拼接字符串</strong>的形式，比如登录的时候就是根据用户名和密码去查询：</p>
<p><code>string <a href="http://www.iwanna.cn/tags/sql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Sql">sql</a> = "SELECT TOP 1 * FROM [User] WHERE UserName = ‘” +  userName + “‘ AND Password = ‘” + password + “‘”;</code></p>
<p>其中userName和password两个变量的值是由用户输入的。在userName和password都合法的情况下，这自然没有问题，但是 用户输入是不可信的，一些恶意用户只要用一些技巧，就可以绕过用户名、密码登录。</p>
<p>假设password的值是”<em>1′ or ‘1′ = ‘1</em>“，userName的值随便取，比如是”abc”，那变量<a href="http://www.iwanna.cn/tags/sql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Sql">sql</a>的 值就是：<br />
<span id="more-3657"></span><br />
<code>"SELECT TOP 1 * FROM [User] WHERE UserName = ‘abc’ AND Password  = ‘1′ or ‘1′ = ‘1′”</code></p>
<p>由于’1′ =  ‘1′恒为真，因此只要User表中有数据，不管UserName、Password的值是否匹配，这条<a href="http://www.iwanna.cn/tags/sql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Sql">SQL</a>命令准能查出记录来。就这样，登录系统就被 破解了。</p>
<h3>以往的防御方式</h3>
<p>以前对付这种漏洞的方式主要有三种：</p>
<ul>
<li><strong>字符串检测</strong>：限定内容只能由英文、数字等常规字符，如果检查到用户输入有特殊字符，直接拒绝。但缺点是，系统 中不可避免地会有些内容包含特殊字符，这时候总不能拒绝入库。</li>
<li><strong>字符串替换</strong>：把危险字符替换成其他字符，缺点是危险字符可能有很多，一一枚举替换相当麻烦，也可能有漏网之 鱼。</li>
<li><strong>存储过程</strong>：把参数传到存储过程进行处理，但并不是所有数据库都支持存储过程。如果存储过程中执行的命令也是通 过拼接字符串出来的，还是会有漏洞。</li>
</ul>
<h3>参数化查询</h3>
<p>近年来，自从参数化查询出现后，<a href="http://www.iwanna.cn/tags/sql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Sql">SQL</a>注入漏洞已成明日黄花。</p>
<p>参数化查询（Parameterized Query 或 Parameterized  Statement）是访问数据库时，在需要填入数值或数据的地方，使用参数 (Parameter) 来给值。</p>
<p>在使用参数化查询的情况下，数据库服务器不会将参数的内容视为<a href="http://www.iwanna.cn/tags/sql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Sql">SQL</a>指令的一部份来处理，而是在<strong>数据库完成<a href="http://www.iwanna.cn/tags/sql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Sql">SQL</a>指令的编译后，才 套用参数运行</strong>，因此就算参数中含有指令，也不会被数据库运行。Access、<a href="http://www.iwanna.cn/tags/sql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Sql">SQL</a>  Server、<a href="http://www.iwanna.cn/tags/mysql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with MySQL">MySQL</a>、SQLite等常用数据库都支持参数化查询。</p>
<h4>在ASP程序中使用参数化查询</h4>
<p>ASP环境下的参数化查询主要由<strong>Connection对象</strong>和<strong>Command对象</strong>完 成。</p>
<p>Access数据库只支持匿名参数，在传入参数的位置用问号代替即可。<a href="http://www.iwanna.cn/tags/sql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Sql">SQL</a>  Server数据库虽然支持匿名和非匿名的参数，但是在ASP中也仅能使用匿名参数。</p>
<p><code>var conn = Server.CreateObject("ADODB.Connection");<br />
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +  Server.MapPath("Test.mdb");<br />
conn.Open();</code></p>
<p>var cmd = Server.CreateObject(&#8220;ADODB.Command&#8221;);<br />
cmd.ActiveConnection = conn;<br />
cmd.CommandType = 1;<br />
cmd.CommandText = &#8220;SELECT TOP 1 * FROM [User] WHERE <strong>UserName = ?  AND Password = ?</strong>“;<br />
cmd.Parameters.Append(cmd.CreateParameter(”@UserName”, 200, 1, 20,  “user01″));<br />
cmd.Parameters.Append(cmd.CreateParameter(”@Password”, 200, 1, 16,  “123456″));</p>
<p>var rs = cmd.Execute();<br />
Response.Write(rs(”UserId”).value);</p>
<p>rs.Close();<br />
conn.Close();</p>
<h4>在ASP<a href="http://www.iwanna.cn/tags/net/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with .Net">.NET</a>程序中使用参数化查询</h4>
<p>ASP<a href="http://www.iwanna.cn/tags/net/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with .Net">.NET</a>环境下的查询化查询也是通过Connection对象和Command对象完成。如果数据库是<a href="http://www.iwanna.cn/tags/sql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Sql">SQL</a>  Server，就可以用有名字的参数了，格式是<strong>“@”字符加上参数名</strong>。</p>
<p><code>SqlConnection conn = new  SqlConnection("server=(local)\\SQL2005;user id=sa;pwd=12345;initial  catalog=TestDb");<br />
conn.Open();</code></p>
<p>SqlCommand cmd = new SqlCommand(&#8220;SELECT TOP 1 * FROM [User] WHERE <strong>UserName  = @UserName AND Password = @Password</strong>“);<br />
cmd.Connection = conn;<br />
cmd.Parameters.AddWithValue(”UserName”, “user01″);<br />
cmd.Parameters.AddWithValue(”Password”, “123456″);</p>
<p>SqlDataReader reader = cmd.ExecuteReader();<br />
reader.Read();<br />
int userId = reader.GetInt32(0);</p>
<p>reader.Close();<br />
conn.Close();</p>
<p><a href="http://www.iwanna.cn/tags/mysql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with MySQL">MySQL</a>的参数格式与<a href="http://www.iwanna.cn/tags/sql/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Sql">SQL</a> Server有点区别，是以<strong>“?”加上参数名</strong>。</p>
<p><code>MySqlConnection conn = new  MySqlConnection("server=127.0.0.1;uid=root;pwd=12345;database=test;");<br />
conn.Open();</code></p>
<p>MySqlCommand cmd = new MySqlCommand(&#8220;SELECT * FROM `User` WHERE <strong>UserName  = ?UserName AND Password = ?Password</strong> LIMIT 1″);<br />
cmd.Connection = conn;<br />
cmd.Parameters.AddWithValue(”UserName”, “user01″);<br />
cmd.Parameters.AddWithValue(”Password”, “123456″);</p>
<p>MySqlDataReader reader = cmd.ExecuteReader();<br />
reader.Read();<br />
int userId = reader.GetInt32(0);</p>
<p>reader.Close();<br />
conn.Close();</p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2010. |
<a href="http://www.iwanna.cn/archives/2010/06/03/3657/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2010/06/03/3657/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2010/06/03/3657/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2010/06/03/3657/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2010/06/03/3657/">抓虾</a>
<hr />
</p>
	标签：<a href="http://www.iwanna.cn/topics/develope/net/" title=".Net" rel="tag nofollow">.Net</a>, <a href="http://www.iwanna.cn/tags/net/" title=".Net" rel="tag nofollow">.Net</a>, <a href="http://www.iwanna.cn/tags/mysql/" title="MySQL" rel="tag nofollow">MySQL</a>, <a href="http://www.iwanna.cn/topics/develope/sql/mysql-sql-develope/" title="Mysql" rel="tag nofollow">Mysql</a>, <a href="http://www.iwanna.cn/topics/develope/sql/" title="Sql" rel="tag nofollow">Sql</a>, <a href="http://www.iwanna.cn/tags/sql/" title="Sql" rel="tag nofollow">Sql</a>, <a href="http://www.iwanna.cn/topics/resource/" title="程序源码" rel="tag nofollow">程序源码</a><br />

	<h2 class="related_post">您可能会感兴趣的其他文章</h2>
	<ul class="st-related-posts">
	<li><a href="http://www.iwanna.cn/archives/2009/03/30/11/" title="MySQL 搜索中的大小写敏感性 (2009年03月30日)">MySQL 搜索中的大小写敏感性</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/06/30/1894/" title="40+ Web前端开发必备的备忘单[上] (2009年06月30日)">40+ Web前端开发必备的备忘单[上]</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/05/12/3089/" title="19条 WordPress 实用的 SQL 查询语句 (2010年05月12日)">19条 WordPress 实用的 SQL 查询语句</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/04/02/149/" title="设计模式之单例模式 (2009年04月2日)">设计模式之单例模式</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/04/22/778/" title="提高MySQL 查询效率的三个技巧 (2009年04月22日)">提高MySQL 查询效率的三个技巧</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/04/08/240/" title="常用的数据库统计SQL语句(2) (2009年04月8日)">常用的数据库统计SQL语句(2)</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/04/08/236/" title="常用的一些数据统计SQL语句 (2009年04月8日)">常用的一些数据统计SQL语句</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/07/06/4378/" title="如何释放已删除的InnoDB磁盘空间 (2010年07月6日)">如何释放已删除的InnoDB磁盘空间</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/07/13/4523/" title="图解Linux下如何搭建C#开发环境 (2010年07月13日)">图解Linux下如何搭建C#开发环境</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/03/29/2607/" title="关于数据大容量的导入导出小结[SQL Server] (2010年03月29日)">关于数据大容量的导入导出小结[SQL Server]</a> </li>
</ul>


<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2010/06/03/3657/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP开发者有了通往.net的新桥梁</title>
		<link>http://www.iwanna.cn/archives/2009/08/22/2181/</link>
		<comments>http://www.iwanna.cn/archives/2009/08/22/2181/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 15:37:28 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=2181</guid>
		<description><![CDATA[微软的互操作性战略开发组当地时间8月21日公布了一个开源PHP开发工具包,它可以让PHP轻松访问微软的ADO.Net数据服务.
该工具包可以从微软CodePlex网站下载到,它基于.net框架并采用BSD许可证发布,确认支持Visual Studio 2008 Service Pack 1和明年发布的Visual Studio 2010.微软支持了多达100-130个开发商来负责微软产品补充技术,让微软的互操作性更强.

下载:PHP Toolkit for ADO .NET Data Services


© 我想网 Akon 所有 , 2009. &#124;
永久链接 &#124;
没有评论 &#124;
提交到
Google Reader
鲜果
抓虾


	标签：.Net, .Net, PHP, PHP

	您可能会感兴趣的其他文章
	
	设计模式之单例模式 
	论述PHP开发框架: What, When, Why and Which? 
	腾讯PHP程序员面试题目 
	简易Wordpress模板代码帮助手册中文版 
	用PHP数组对百万数据进行排重 
	用 PHP 读取和编写 XML DOM 
	深入理解PHP之匿名函数 
	最快的 PHP 模板引擎 Blitz Templates 
	开发者不可不知的PHP框架深度解析 
	实用PHP技巧：万能Cache 



Feed enhanced by Better Feed from  [...]]]></description>
			<content:encoded><![CDATA[<p><strong>微软的互操作性战略开发组当地时间8月21日公布了一个开源<a href="http://www.iwanna.cn/tags/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP">PHP</a>开发工具包,它可以让<a href="http://www.iwanna.cn/tags/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP">PHP</a>轻松访问微软的ADO<a href="http://www.iwanna.cn/tags/net/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with .Net">.Net</a>数据服务.</strong><br />
该工具包可以从微软CodePlex网站下载到,它基于.net框架并采用BSD许可证发布,确认支持Visual Studio 2008 Service Pack 1和明年发布的Visual Studio 2010.微软支持了多达100-130个开发商来负责微软产品补充技术,让微软的互操作性更强.<br />
<span id="more-2181"></span><br />
<img src="http://www.cnbeta.com/articles/pic/down.gif" alt="" /><strong>下载:</strong><a href="http://phpdataservices.codeplex.com/" target="_blank">PHP Toolkit for ADO .NET Data Services</a></p>
<p><img src="http://blogs.msdn.com/blogfiles/interoperability/WindowsLiveWriter/AnewbridgeforPHPdevelope.NETDataServices_7FB3/PHP_ADO_DATA_SERVICEArchitecture_4.png" alt="http://blogs.msdn.com/blogfiles/interoperability/WindowsLiveWriter/AnewbridgeforPHPdevelope.NETDataServices_7FB3/PHP_ADO_DATA_SERVICEArchitecture_4.png" /></p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/08/22/2181/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/08/22/2181/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/08/22/2181/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/08/22/2181/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/08/22/2181/">抓虾</a>
<hr />
</p>
	标签：<a href="http://www.iwanna.cn/topics/develope/net/" title=".Net" rel="tag nofollow">.Net</a>, <a href="http://www.iwanna.cn/tags/net/" title=".Net" rel="tag nofollow">.Net</a>, <a href="http://www.iwanna.cn/topics/develope/php/" title="PHP" rel="tag nofollow">PHP</a>, <a href="http://www.iwanna.cn/tags/php/" title="PHP" rel="tag nofollow">PHP</a><br />

	<h2 class="related_post">您可能会感兴趣的其他文章</h2>
	<ul class="st-related-posts">
	<li><a href="http://www.iwanna.cn/archives/2009/04/02/149/" title="设计模式之单例模式 (2009年04月2日)">设计模式之单例模式</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/07/31/2088/" title="论述PHP开发框架: What, When, Why and Which? (2009年07月31日)">论述PHP开发框架: What, When, Why and Which?</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/06/08/3767/" title="腾讯PHP程序员面试题目 (2010年06月8日)">腾讯PHP程序员面试题目</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/04/03/171/" title="简易Wordpress模板代码帮助手册中文版 (2009年04月3日)">简易Wordpress模板代码帮助手册中文版</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/06/08/3769/" title="用PHP数组对百万数据进行排重 (2010年06月8日)">用PHP数组对百万数据进行排重</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/07/05/1933/" title="用 PHP 读取和编写 XML DOM (2009年07月5日)">用 PHP 读取和编写 XML DOM</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/06/20/4102/" title="深入理解PHP之匿名函数 (2010年06月20日)">深入理解PHP之匿名函数</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/08/20/2171/" title="最快的 PHP 模板引擎 Blitz Templates (2009年08月20日)">最快的 PHP 模板引擎 Blitz Templates</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/08/24/2193/" title="开发者不可不知的PHP框架深度解析 (2009年08月24日)">开发者不可不知的PHP框架深度解析</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/05/26/3396/" title="实用PHP技巧：万能Cache (2010年05月26日)">实用PHP技巧：万能Cache</a> </li>
</ul>


<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/08/22/2181/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>设计模式之单例模式</title>
		<link>http://www.iwanna.cn/archives/2009/04/02/149/</link>
		<comments>http://www.iwanna.cn/archives/2009/04/02/149/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 05:00:34 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Patten]]></category>
		<category><![CDATA[我想想想]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=149</guid>
		<description><![CDATA[1         单例模式的日常应用
我们在浏览BBS、SNS网站的时候，常常会看到“当前在线人数”这样的一项内容。对于
这样的一项功能，我们通常的做法是把当前的在线人数存放到一个内存、文件或者数据库中，每次用户登录的时候，就会马上从内存、文件或者数据库中取出，在其基础上加1后，作为当前的在线人数进行显示，然后再把它保存回内存、文件或者数据库里，这样后续登录的用户看到的就是更新后的当前在线人数；同样的道理，当用户退出后，当前在线人数进行减1的工作。所以，对于这样的一个需求，我们按照面向对象的设计思想，可以把它抽象为“在线计数器”这样一个对象，具体实现如下：

Java代码：
//在线人数计数器
class OnlineCounter {
//在线人数
private int onlineCount = 0;
//构造函数
public OnlineCounter(){
//从文件或者数据库读取数据,假如读出来的数据是100
this.onlineCount = 100;
}
//在用户登录后，在线人数加1
public void incCount(){
this.onlineCount++;
}
//在用户退出后，在线人数减1
public void decCount(){
this.onlineCount&#8211;;
}
//保存在线人数
public void saveCount(){
}
//获取在线人数
public int getCount(){
return onlineCount;
}
//测试函数
public static void main(String[] args) {
try{
OnlineCounter onlineCounter = new OnlineCounter();
System.out.println(&#8220;在线人数：&#8221; +onlineCounter.getCount());
onlineCounter.incCount();
System.out.println(&#8220;在线人数：&#8221; + onlineCounter.getCount());
onlineCounter.decCount();
System.out.println(&#8220;在线人数：&#8221; + onlineCounter.getCount());
}catch(Exception err){
}
}
}
.Net代码：
//在线人数计数器
class OnlineCounter{
//在线人数
private int onlineCount = 0;
//构造函数
public OnlineCounter(){
//从文件或者数据库读取数据,假如读出来的数据是100
this.onlineCount = 100;
}
//在用户登录后，在线人数加1
public void incCount(){
this.onlineCount++;
}
//在用户退出后，在线人数减1
public void decCount(){
this.onlineCount&#8211;;
}
//保存在线人数
public [...]]]></description>
			<content:encoded><![CDATA[<p>1         单例模式的日常应用</p>
<p>我们在浏览BBS、SNS网站的时候，常常会看到“当前在线人数”这样的一项内容。对于</p>
<p>这样的一项功能，我们通常的做法是把当前的在线人数存放到一个内存、文件或者数据库中，每次用户登录的时候，就会马上从内存、文件或者数据库中取出，在其基础上加1后，作为当前的在线人数进行显示，然后再把它保存回内存、文件或者数据库里，这样后续登录的用户看到的就是更新后的当前在线人数；同样的道理，当用户退出后，当前在线人数进行减1的工作。所以，对于这样的一个需求，我们按照面向对象的设计思想，可以把它抽象为“在线计数器”这样一个对象，具体实现如下：</p>
<p><span id="more-149"></span></p>
<p><a href="http://www.iwanna.cn/tags/java/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Java">Java</a>代码：</p>
<p>//在线人数计数器</p>
<p>class OnlineCounter {</p>
<p>//在线人数</p>
<p>private int onlineCount = 0;</p>
<p>//构造函数</p>
<p>public OnlineCounter(){</p>
<p>//从文件或者数据库读取数据,假如读出来的数据是100</p>
<p>this.onlineCount = 100;</p>
<p>}</p>
<p>//在用户登录后，在线人数加1</p>
<p>public void incCount(){</p>
<p>this.onlineCount++;</p>
<p>}</p>
<p>//在用户退出后，在线人数减1</p>
<p>public void decCount(){</p>
<p>this.onlineCount&#8211;;</p>
<p>}</p>
<p>//保存在线人数</p>
<p>public void saveCount(){</p>
<p>}</p>
<p>//获取在线人数</p>
<p>public int getCount(){</p>
<p>return onlineCount;</p>
<p>}</p>
<p>//测试函数</p>
<p>public static void main(String[] args) {</p>
<p>try{</p>
<p>OnlineCounter onlineCounter = new OnlineCounter();</p>
<p>System.out.println(&#8220;在线人数：&#8221; +onlineCounter.getCount());</p>
<p>onlineCounter.incCount();</p>
<p>System.out.println(&#8220;在线人数：&#8221; + onlineCounter.getCount());</p>
<p>onlineCounter.decCount();</p>
<p>System.out.println(&#8220;在线人数：&#8221; + onlineCounter.getCount());</p>
<p>}catch(Exception err){</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>.Net代码：</p>
<p>//在线人数计数器</p>
<p>class OnlineCounter{</p>
<p>//在线人数</p>
<p>private int onlineCount = 0;</p>
<p>//构造函数</p>
<p>public OnlineCounter(){</p>
<p>//从文件或者数据库读取数据,假如读出来的数据是100</p>
<p>this.onlineCount = 100;</p>
<p>}</p>
<p>//在用户登录后，在线人数加1</p>
<p>public void incCount(){</p>
<p>this.onlineCount++;</p>
<p>}</p>
<p>//在用户退出后，在线人数减1</p>
<p>public void decCount(){</p>
<p>this.onlineCount&#8211;;</p>
<p>}</p>
<p>//保存在线人数</p>
<p>public void saveCount(){</p>
<p>return onlineCount;</p>
<p>}</p>
<p>//获取在线人数</p>
<p>public int getCount(){</p>
<p>return onlineCount;</p>
<p>}</p>
<p>//测试函数</p>
<p>public static void Main(string[] args) {</p>
<p>OnlineCounter onlineCounter = new OnlineCounter();</p>
<p>Console.WriteLine(&#8220;在线人数：&#8221; + onlineCounter.getCount());</p>
<p>onlineCounter.incCount();</p>
<p>Console.WriteLine(&#8220;在线人数：&#8221; + onlineCounter.getCount());</p>
<p>onlineCounter.decCount();</p>
<p>Console.WriteLine(&#8220;在线人数：&#8221; + onlineCounter.getCount());</p>
<p>}</p>
<p>}</p>
<p><a href="http://www.iwanna.cn/tags/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP">Php</a>代码：</p>
<p>//在线人数计数器</p>
<p>class OnlineCounter {</p>
<p>//在线人数</p>
<p>private $onlineCount = 0;</p>
<p>//构造函数</p>
<p>public function __construct(){</p>
<p>//从文件或者数据库读取数据,假如读出来的数据是100</p>
<p>$this-&gt;onlineCount = 100;</p>
<p>}</p>
<p>//在用户登录后，在线人数加1</p>
<p>public function incCount(){</p>
<p>$this-&gt;onlineCount++;</p>
<p>}</p>
<p>//在用户退出后，在线人数减1</p>
<p>public function decCount(){</p>
<p>$this-&gt;onlineCount&#8211;;</p>
<p>}</p>
<p>//保存在线人数</p>
<p>public function saveCount(){</p>
<p>}</p>
<p>//获取在线人数</p>
<p>public function getCount(){</p>
<p>return $this-&gt;onlineCount;</p>
<p>}</p>
<p>//测试函数</p>
<p>public static function execute() {</p>
<p>$onlineCounter = new OnlineCounter();</p>
<p>echo &#8220;在线人数：&#8221; . $onlineCounter-&gt;getCount();</p>
<p>$onlineCounter-&gt;incCount();</p>
<p>echo &#8220;在线人数：&#8221; . $onlineCounter-&gt;getCount();</p>
<p>$onlineCounter-&gt;decCount();</p>
<p>echo &#8220;在线人数：&#8221; . $onlineCounter-&gt;getCount();</p>
<p>}</p>
<p>}</p>
<p>OnlineCounter::execute();</p>
<p>?&gt;</p>
<p>运行结果如下：</p>
<p>在线人数：100</p>
<p>在线人数：101</p>
<p>在线人数：100</p>
<p>网站代码中凡是用到计数器的地方，只要new一个计数器对象，然后就可以获取、保存、增加或者减少在线人数的数量。不过，我们的代码实际的使用效果并不好。假如有多个用户同时登录,那么在这个时刻，通过计数器取到的在线人数是相同的，于是他们使用各自的计数器加1后存入文件或者数据库。这样操作后续登陆的用户得到的在线人数，与实际的在线人数并不一致。所以，把这个计数器设计为一个全局对象，所有人都共用同一份数据，就可以避免类似的问题，这就是我们所说的单例模式的其中的一种应用。<br />
2         什么是单例模式</p>
<p>单例模式能够保证一个类仅有唯一的实例，并提供一个全局访问点。</p>
<p>我们是不是可以通过一个全局变量来实现单例模式的要求呢？我们只要仔细地想想看，全局变量确实可以提供一个全局访问点，但是它不能防止别人实例化多个对象。通过外部程序来控制的对象的产生的个数，势必会系统的增加管理成本，增大模块之间的耦合度。所以，最好的解决办法就是让类自己负责保存它的唯一实例，并且让这个类保证不会产生第二个实例，同时提供一个让外部对象访问该实例的方法。自己的事情自己办，而不是由别人代办，这非常符合面向对象的封装原则。</p>
<p>按照以上的思路，我们可以这样来设计单例类：</p>
<p><a href="http://www.iwanna.cn/tags/java/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Java">Java</a>代码:</p>
<p>class Singleton {</p>
<p>// 私有的静态对象</p>
<p>private static Singleton instance = null;</p>
<p>//私有的构造方法</p>
<p>private Singleton (){</p>
<p>}</p>
<p>// 公开的静态工厂方法,返回此类的唯一实例</p>
<p>public static Singleton getInstance(){</p>
<p>if(instance == null){</p>
<p>instance = new Singleton();</p>
<p>}</p>
<p>return instance;</p>
<p>}</p>
<p>}</p>
<p>.Net代码：</p>
<p>class Singleton{</p>
<p>// 私有的静态对象</p>
<p>private static Singleton instance = null;</p>
<p>//私有的构造方法</p>
<p>private Singleton(){</p>
<p>}</p>
<p>//公开的静态工厂方法,返回此类的唯一实例</p>
<p>public static Singleton getInstance(){</p>
<p>if (instance == null){</p>
<p>instance = new Singleton();</p>
<p>}</p>
<p>return instance;</p>
<p>}</p>
<p>}</p>
<p><a href="http://www.iwanna.cn/tags/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP">Php</a>代码：</p>
<p>class Singleton {</p>
<p>// 私有的静态对象</p>
<p>private static $instance = null;</p>
<p>//私有的构造方法</p>
<p>private function __construct(){</p>
<p>}</p>
<p>// 公开的静态工厂方法,返回此类的唯一实例</p>
<p>public static function getInstance(){</p>
<p>if(self::$instance == null){</p>
<p>self::$instance = new Singleton();</p>
<p>}</p>
<p>return self::$instance;</p>
<p>}</p>
<p>}</p>
<p>?&gt;</p>
<p>Singleton类含有一个instance的私有静态变量,用来保存该类唯一的实例对象，它对于外部对象是不可见的，只能通过getInstance方法才能获得。</p>
<p>Singleton类的构造器是private私有的，外部对象无法通过它的构造器生成实例，也就是说外部程序试图通过new操作符来创建实例是行不通的，因此，getInstance方法成为获得Singleton类实例的唯一途径。</p>
<p>getInstance方法的设计非常简单，它首先检测instance变量是否已经初始化，如果没有被初始化，就创建一个实例保存到instance变量，最后返回这个实例；如果这个实例已经被初始化，那么就直接返回这个实例。</p>
<p>getInstance方法的设计非常简单，它首先检测instance变量是否已经初始化，如果没有被初始化，就创建一个实例保存到instance变量，最后返回这个实例；如果这个实例已经被初始化，那么就直接返回这个实例。</p>
<p>单例模式的类图</p>
<p>单例模式主要有3个特点，：</p>
<p>1、单例类确保自己只有一个实例。</p>
<p>2、单例类必须自己创建自己的实例。</p>
<p>3、单例类必须为其他对象提供唯一的实例。<br />
3         安全的单例模式：双重检查锁定机制</p>
<p>我们虽然实现了单例模式，但是目前的解决办法并不安全，依然存在着一定的缺陷：</p>
<p>class Singleton {</p>
<p>private static Singleton instance = null;</p>
<p>private Singleton (){</p>
<p>}</p>
<p>public static Singleton getInstance(){</p>
<p>if(instance == null){</p>
<p>instance = new Singleton();</p>
<p>}</p>
<p>return instance;</p>
<p>}</p>
<p>}</p>
<p>这段代码意图通过检查if (instance == null)这个条件，来保证只创建一个Singleton实例。事实上，它运行在单线程环境中，得到的结果是正确的，没有问题，但是运行在多线程的环境中，它就会出现错误，可能有多个Singleton实例被创建出来。</p>
<p>我们分析一下，在多线程环境中，可能会出现这样的情形：线程A 和线程B几乎同时到达if (instance == null)语句，假设线程A 比线程B 早一点点，那么：</p>
<p>（1）A 会首先进入if (instance == null)块的内部，并开始执行new Singleton () 语句。此时，instance变量仍然是null，直到线程A 的new Singleton () 语句返回，并给instance变量赋值为止。</p>
<p>（2） 但是，此时的线程B 并不会在if (instance == null)语句的外面等待，因为此时(instance == null)是成立的，它会马上进入if (instance == null)语句块的内部。这样，线程B 会不可避免地执行instance=new Singleton()语句，从而创建出第二个实例来。</p>
<p>（3）线程A 的instance=new Singleton()语句执行完毕后，instance变量得到了真实的对象引用，(instance == null)不再为真。所以，后来的线程就不会再进入if (instance == null) 语句块的内部了。</p>
<p>（4）线程B 的instance=new Singleton()语句也执行完毕后，instance变量的值被覆盖。但是第一个instance对象被线程A 引用的事实已经无法改变了。这时候的线程A和B各自拥有一个独立的Singleton对象。</p>
<p>为了实现线程安全，我们对代码进行了一定的改造：</p>
<p><a href="http://www.iwanna.cn/tags/java/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Java">Java</a>代码：</p>
<p>class Singleton{</p>
<p>private static Singleton instance = null;</p>
<p>private Singleton() {</p>
<p>}</p>
<p>public static Singleton getInstance(){</p>
<p>//位置1，第1次检查instance</p>
<p>if (instance == null)</p>
<p>{</p>
<p>//位置2，某一时刻可能有n个线程到达</p>
<p>synchronized (this)</p>
<p>{</p>
<p>//位置3，任何时间只能有1个线程到达</p>
<p>if (instance == null) //位置4，第2次检查instance</p>
<p>{</p>
<p>instance = new Singleton();</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>return instance;</p>
<p>}</p>
<p>}</p>
<p>.Net代码：</p>
<p>class Singleton {</p>
<p>private static Singleton instance = null;</p>
<p>private static readonly object syncObj = new object();</p>
<p>private Singleton (){</p>
<p>}</p>
<p>public static Singleton getInstance(){</p>
<p>//位置1，第1次检查instance</p>
<p>if( instance == null ){</p>
<p>//位置2，某一时刻可能有n个线程到达</p>
<p>lock(syncObj)</p>
<p>{</p>
<p>//位置3，任何时间只能有1个线程到达</p>
<p>if (instance == null) //位置4，第2次检查instance</p>
<p>{</p>
<p>instance = new Singleton();</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>return instance;</p>
<p>}</p>
<p>}</p>
<p>我们通过引入了<a href="http://www.iwanna.cn/tags/java/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Java">Java</a>的synchronized或者.Net的lock同步化限制，各个线程到达临界区时，就会按照线性方式逐个执行。</p>
<p>我们再来分析一下：</p>
<p>（1）在多线程环境中，线程A 和B同时或几乎同时到达位置1。</p>
<p>（2）假设线程A 会首先到达位置2，并进入synchronized(this) 到达位置3。这时，由于synchronized(this) 的同步化限制，线程B 无法到达位置3，而只能在位置2 等候。</p>
<p>（3）线程A 执行instance = new Singleton()语句，instance变量得到赋值，此时，线程B 还只能继续在位置2 等候。</p>
<p>（4）线程A 退出synchronized(this) 块，并返回instance对象。</p>
<p>（5）线程B 进入synchronized(this)块，到达位置3，进而到达位置4。由于instance变量已经不是null 了，因此线程B 退出synchronized(this)，并返回instance，这时候的instance只有一个。</p>
<p>我们通过两次检查instance是否被实例化来解决线程安全问题，这种处理方式称为双重检查锁定机制（Double-checked locking）。还有另外一种解决线程安全的方法，就是把getInstance方法整体作为同步区，比如声明为public static synchronized Singleton getInstance()，这种方式由于锁定的区域过大，特殊情况下会造成系统性能的下降，成为系统的性能瓶颈。</p>
<p>双重检查锁定机制不仅解决了线程安全问题，而且把性能也处理得很不错，看起来非常完美。不幸的是我们应该注意不要在<a href="http://www.iwanna.cn/tags/java/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Java">java</a>中使用双重检查锁定机制，由于<a href="http://www.iwanna.cn/tags/java/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Java">Java</a>编译器和 JIT 的优化的原因，系统无法保证我们期望的执行次序。虽然<a href="http://www.iwanna.cn/tags/java/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Java">Java</a>语法中的volatile修饰符可以强制屏蔽编译器和 JIT 的优化工作，但它是一种非常脆弱的同步机制，比较难以控制，所以建议尽量减少使用。我们后面还提供了其它的一种实现方式。<br />
4         单例模式的实现方式：懒汉单例类和饿汉单例类</p>
<p>单例模式的实现有多种方法，常见的就有懒汉式单例类和饿汉式单例类。我们前面介绍的实现方法就属于懒汉式单例类。</p>
<p>l         懒汉式单例类</p>
<p>对于懒汉模式，我们可以这样理解：该单例类非常懒，只有在自身需要的时候才会行动，从来不知道及早做好准备。它在需要对象的时候，才判断是否已有对象，如果没有就立即创建一个对象，然后返回，如果已有对象就不再创建，立即返回。</p>
<p>懒汉模式只在外部对象第一次请求实例的时候才去创建。</p>
<p>l         饿汉式单例</p>
<p>对于饿汉模式，我们可以这样理解：该单例类非常饿，迫切需要吃东西，所以它在类加载的时候就立即创建对象。</p>
<p><a href="http://www.iwanna.cn/tags/java/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Java">Java</a>代码：</p>
<p>final class Singleton {</p>
<p>//私有的唯一实例成员,在类加载的时候就创建好了单例对象</p>
<p>private static final Singleton instance = new Singleton();</p>
<p>//私有的构造方法,避免外部创建类实例</p>
<p>private Singleton() {</p>
<p>}</p>
<p>//静态工厂方法,返回此类的唯一实例</p>
<p>public static Singleton getInstance() {</p>
<p>return instance;</p>
<p>}</p>
<p>}</p>
<p>.Net代码：</p>
<p>sealed class Singleton {</p>
<p>//私有的唯一实例成员,在类加载的时候就创建好了单例对象</p>
<p>private static readonly Singleton instance = new Singleton();</p>
<p>//私有的构造方法,避免外部创建类实例</p>
<p>private Singleton() {</p>
<p>}</p>
<p>//静态工厂方法,返回此类的唯一实例</p>
<p>public static Singleton getInstance() {</p>
<p>return instance;</p>
<p>}</p>
<p>}</p>
<p>使用<a href="http://www.iwanna.cn/tags/java/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Java">Java</a>中的final关键字和.Net中sealed关键字去修饰class，目的是阻止派生子类，而派生子类可能会导致实例不唯一。使用<a href="http://www.iwanna.cn/tags/java/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Java">Java</a>中的final关键字和.Net中readonly关键字去修饰变量，就意味着只能在类初始化时或者在构造器中分配该变量。</p>
<p>我们对比一下懒汉模式和饿汉模式的优缺点：</p>
<p>懒汉模式，它的特点是运行时获得对象的速度比较慢，但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。</p>
<p>饿汉模式，它的特点是加载类的时候比较慢，但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。</p>
<p>这两种模式对于初始化较快，占用资源少的对象来说，没有多大的性能差异，但是对于初始化慢，占用资源多的对象来说就会有比较明显的差别了。所以，对重量级对象应用饿汉模式，在类加载时需要较长时间，但运行时会有明显的时间效率的提升。对重量级对象应用懒汉模式，在类加载时很快，但至少第一次获得对象时需要等待很长时间。</p>
<p>从用户体验的角度来说，我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化，却不喜欢在程序运行时等待太久，给人一种反应迟钝的感觉，所以对于有重量级对象参与的单例模式，我们推荐使用饿汉模式。</p>
<p>而对于初始化较快的轻量级对象来说，选用哪种方法都可以。如果一个应用中使用了大量单例模式，我们就应该权衡两种方法了。轻量级对象的单例采用懒汉模式，减轻加载时的负担，缩短加载时间，提高加载效率；同时由于是轻量级对象，把这些对象的创建放在使用时进行，实际就是把创建单例对象所消耗的时间分摊到整个应用中去了，对于整个应用的运行效率没有太大影响。<br />
5         什么情况下使用单例模式</p>
<p>单例模式也是一种比较常见的设计模式，它到底能带给我们什么好处呢？其实无非是三个方面的作用：</p>
<p>第一、控制资源的使用，通过线程同步来控制资源的并发访问；</p>
<p>第二、控制实例产生的数量，达到节约资源的目的。</p>
<p>第三、作为通信媒介使用，也就是数据共享，它可以在不建立直接关联的条件下，让多个不相关的两个线程或者进程之间实现通信。</p>
<p>比如，数据库连接池的设计一般采用单例模式，数据库连接是一种数据库资源。软件系统中使用数据库连接池，主要是节省打开或者关闭数据库连接所引起的效率损耗，这种效率上的损耗还是非常昂贵的。当然，使用数据库连接池还有很多其它的好处，可以屏蔽不同数据数据库之间的差异，实现系统对数据库的低度耦合，也可以被多个系统同时使用，具有高可复用性，还能方便对数据库连接的管理等等。数据库连接池属于重量级资源，一个应用中只需要保留一份即可，既节省了资源又方便管理。所以数据库连接池采用单例模式进行设计会是一个非常好的选择。</p>
<p>在我们日常使用的在Windows中也有不少单例模式设计的组件，象常用的文件管理器。由于Windows操作系统是一个典型的多进程多线程系统，那么在创建或者删除某个文件的时候，就不可避免地出现多个进程或线程同时操作一个文件的现象。采用单例模式设计的文件管理器就可以完美的解决这个问题，所有的文件操作都必须通过唯一的实例进行，这样就不会产生混乱的现象。</p>
<p>再比如，每台计算机可以有若干个打印机，如果每一个进程或者线程都独立地使用打印机资源的话，那么我们打印出来的结果就有可能既包含这个打印任务的一部分，又包含另外一个打印任务的一部分。所以，大多数的操作系统最终为打印任务设计了一个单例模式的假脱机服务Printer Spooler，所有的打印任务都需要通过假脱机服务进行。</p>
<p>实际上，配置信息类、管理类、控制类、门面类、代理类通常被设计为单例类。像<a href="http://www.iwanna.cn/tags/java/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Java">Java</a>的Struts、Spring框架，.Net的Spring<a href="http://www.iwanna.cn/tags/net/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with .Net">.Net</a>框架，以及<a href="http://www.iwanna.cn/tags/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP">Php</a>的Zend框架都大量使用了单例模式。</p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/04/02/149/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/04/02/149/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/04/02/149/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/04/02/149/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/04/02/149/">抓虾</a>
<hr />
</p>
	标签：<a href="http://www.iwanna.cn/topics/develope/net/" title=".Net" rel="tag nofollow">.Net</a>, <a href="http://www.iwanna.cn/tags/net/" title=".Net" rel="tag nofollow">.Net</a>, <a href="http://www.iwanna.cn/topics/develope/java/" title="Java" rel="tag nofollow">Java</a>, <a href="http://www.iwanna.cn/tags/java/" title="Java" rel="tag nofollow">Java</a>, <a href="http://www.iwanna.cn/topics/develope/patten/" title="Patten" rel="tag nofollow">Patten</a>, <a href="http://www.iwanna.cn/tags/patten/" title="Patten" rel="tag nofollow">Patten</a>, <a href="http://www.iwanna.cn/topics/develope/php/" title="PHP" rel="tag nofollow">PHP</a>, <a href="http://www.iwanna.cn/tags/php/" title="PHP" rel="tag nofollow">PHP</a>, <a href="http://www.iwanna.cn/topics/iwanna/" title="我想想想" rel="tag nofollow">我想想想</a><br />

	<h2 class="related_post">您可能会感兴趣的其他文章</h2>
	<ul class="st-related-posts">
	<li><a href="http://www.iwanna.cn/archives/2009/08/22/2181/" title="PHP开发者有了通往.net的新桥梁 (2009年08月22日)">PHP开发者有了通往.net的新桥梁</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/06/12/3907/" title="适配器模式 (2010年06月12日)">适配器模式</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/07/31/2088/" title="论述PHP开发框架: What, When, Why and Which? (2009年07月31日)">论述PHP开发框架: What, When, Why and Which?</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/06/08/3767/" title="腾讯PHP程序员面试题目 (2010年06月8日)">腾讯PHP程序员面试题目</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/07/05/4365/" title="类的设计原则 (2010年07月5日)">类的设计原则</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/04/03/171/" title="简易Wordpress模板代码帮助手册中文版 (2009年04月3日)">简易Wordpress模板代码帮助手册中文版</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/06/08/3769/" title="用PHP数组对百万数据进行排重 (2010年06月8日)">用PHP数组对百万数据进行排重</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/07/05/1933/" title="用 PHP 读取和编写 XML DOM (2009年07月5日)">用 PHP 读取和编写 XML DOM</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2010/06/20/4102/" title="深入理解PHP之匿名函数 (2010年06月20日)">深入理解PHP之匿名函数</a> </li>
	<li><a href="http://www.iwanna.cn/archives/2009/08/20/2171/" title="最快的 PHP 模板引擎 Blitz Templates (2009年08月20日)">最快的 PHP 模板引擎 Blitz Templates</a> </li>
</ul>


<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/04/02/149/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
