<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[靓丽的坐标]]></title>
<link>http://blog.pfan.cn/tujun</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[C#&nbsp;WebBrowser&nbsp;编程&nbsp;使用mshtml读取网页内容]]></title>
		<link>http://blog.pfan.cn/tujun/51406.html</link>
		<description><![CDATA[首先需要引用Microsoft.mshtml,AxInterop.SHDocVw
一些方法:
webBrowser.ScriptErrorsSuppressed = true;//允许脚本调试
webBrowser.WebBrowserShortcutsEnabled = true;//允许快捷键
/*********************一些事件的处理*******************/
webBrowser.CanGoForwardChanged += new EventHandler(webBrowser_CanGoForwardChanged);
webBrowser.CanGoBackChanged += new EventHandler(webBrowser_CanGoBackChanged);
webBrowser.StatusTextChanged += new EventHandler(webBrowser1_StatusTextChanged);
webBrowser.Navigating += new WebBrowserNavigatingEventHandler(webBrowser1_Navigating);
webBrowser.Navigated += new WebBrowserNavigatedEventHandler(webBrowser1_Navigated);
webBrowser.DocumentTitleChanged += new EventHandler(webBrowser1_DocumentTitleChanged);
webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
webBrowser.Disposed += new EventHandler(webBrowser1_Disposed);
(webBrowser.ActiveXInstance as SHDocVw.WebBrowser).NewWindow3 += new SHDocVw.DWebBrowserEvents2_NewWindow3EventHand]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2010-06-25 17:00:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Remoting模式下的通讯]]></title>
		<link>http://blog.pfan.cn/tujun/38962.html</link>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用C#下的Remoting有一段时间了，感觉开始的时候理解比较困难，不过了解了其工作模式后也相对觉得容易多了，现在将一些心得体会记录一下。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remoting原理：Remoting实际上就是在服务器与客户端之间利用一个对象（RemoteObject）进行通讯，服务器端产生这个对象，客户端远程获取这个对象并利用对象的属性和方法操作服务器端的数据。Remoting的通讯协议可以是IPC、HTTP或者TCP。从性能上讲，IPC信道的通讯性能最佳，但客户端服务器端只能存在于同一个域中；HTTP性能最差，但是HTTP协议几乎能穿越所有的防火墙，所以在远程访问中使用HTTP的情况较多；TCP性能介于前两者之间。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remoting模式的通讯省去了编写大量通讯协议的过程，将数据与方法用面向对象的方式进行的封装，大大加快了开发进度。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面，将举例开发一对简单的Remoting通讯的例子程序。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一步：创建公共对象类（CommProxyClass），公共对象类必须继承于MarshalByRefObject；
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class CommProxyClass：MarshalByRefObject{}；
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二步：为这个公共对象添加一个方法:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int GetProcessCount（）
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2008-10-17 22:21:00</pubDate>
		</item>
				<item>
		<title><![CDATA[在c#中利用keep-alive处理socket网络异常断开的方法]]></title>
		<link>http://blog.pfan.cn/tujun/38764.html</link>
		<description><![CDATA[本文摘自
http://www.z6688.com/info/57987-1.htm
&nbsp;
最近我负责一个IM项目的开发，服务端和客户端采用TCP协议连接。服务端采用C#开发，客户端采用Delphi开发。在服务端开发中我碰到了各种各样的网络异常断开现象。在处理这些异常的时候有了一些心得，现在写出来和大家分享一下。
那网络异常断开原因主要有那些呢？归纳起来主要有以下两种：
1、客户端程序异常。
　　对于这种情况，我们很好处理，因为客户端程序异常退出会在服务端引发ConnectionReset的Socket异常（就是WinSock2中的10054异常）。只要在服务端处理这个异常就可以了。
2、网络链路异常。
　　如：网线拔出、交换机掉电、客户端机器掉电。当出现这些情况的时候服务端不会出现任何异常。这样的话上面的代码就不能处理这种情况了。对于这种情况在MSDN里面是这样处理的，我在这里贴出MSDN的原文：
如果您需要确定连接的当前状态，请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035)，则该套接字仍然处于连接状态；否则，该套接字不再处于连接状态。
　　但是我在实际应用中发现，MSDN说的这种处理方法在很多时候根本无效，无法检测出网络已经异常断开了。那我们该怎么办呢？
　　我们知道，TCP有一个连接检测机制，就是如果在指定的时间内（一般为2个小时）没有数据传送，会给对端发送一个Keep-Alive数据报，使用的序列号是曾经发出的最后一个报文的最后一个字节的序列号，对端如果收到这个数据，回送一个TCP的ACK，确认这个字节已经收到，这样就知道此连接没有被断开。如果一段时间没有收到对方的响应，会进行重试，重试几次后，向对端发一个reset，然后将连接断掉。
　　在Windows中，第一次探测是在最后一次数据发送的两个小时，然后每隔1秒探测一次，一共探测5次，如果5次都没有收到回应的话，就会断开这个连接。但两个小时对于我们的项目来说显然太长了。我们必须缩短这个时间。那么我们该如何做呢？我要利用Socket类的IOControl()函数。我们来看看这个函数能干些什么：
使用 IOControlCode 枚举指定控制代码，为 Socket 设置低级操作模式。 
命名空间:Syste]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2008-10-08 16:52:00</pubDate>
		</item>
				<item>
		<title><![CDATA[MSSQL占用内存过大的解决方法]]></title>
		<link>http://blog.pfan.cn/tujun/38763.html</link>
		<description><![CDATA[本文摘自:
http://www.cnblogs.com/tomcat112906/archive/2008/09/29/1301842.html
经常使用mssql(WINDOWS平台上强大的数据库平台)的朋友都会发现一个小小的网站在运行若干天后mssql(WINDOWS平台上强大的数据库平台)就会把服务器上所有的内存都吃光,此时你不得不重新启动一下服务器或mssql(WINDOWS平台上强大的数据库平台)来释放内存,有人认为是mssql(WINDOWS平台上强大的数据库平台)有内存泄露问题,其实不然,微软给我们了明确说明: 
Quote:概要　　在您启动 sql server(WINDOWS平台上强大的数据库平台) 之后，sql server(WINDOWS平台上强大的数据库平台) 内存使用量将会持续稳定上升，即使当服务器上活动很少时也不会下降。另外，任务管理器和性能监视器将显示计算机上可用的物理内存稳定下降，直到可用内存降到 4 至 10 MB 为止。
　　仅仅出现这种状态不表示内存泄漏。此行为是正常的，并且是 sql server(WINDOWS平台上强大的数据库平台) 缓冲池的预期行为。
　　默认情况下，sql server(WINDOWS平台上强大的数据库平台) 根据操作系统报告的物理内存加载动态增大和收缩其缓冲池（缓存）的大小。只要有足够的内存可用于防止内存页面交换（在 4 至 10 MB 之间），sql server(WINDOWS平台上强大的数据库平台) 缓冲池就会继续增大。像在与 sql server(WINDOWS平台上强大的数据库平台) 分配内存位于相同计算机上的其他进程一样，sql server(WINDOWS平台上强大的数据库平台) 缓冲区管理器将在需要的时候释放内存。sql server(WINDOWS平台上强大的数据库平台) 每秒可以释放和获取几兆字节的内存，从而使它可以快速适应内存分配变化。 更多信息　　您可以通过服务器内存最小值和服务器内存最大值配置选项设置 sql server(WINDOWS平台上强大的数据库平台) 数据库引擎使用的内存（缓冲池）量的上下限。在设置服务器内存最小值和服务器内存最大值选项之前，请查阅以下 Microsoft 知识库文章中标题为'内存'一节中的参考信息：　　319942 HOW TO：De]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2008-10-08 16:47:00</pubDate>
		</item>
				<item>
		<title><![CDATA[(转)在IIS7下配置ASP.NET&nbsp;v1.1&nbsp;(VS2003)]]></title>
		<link>http://blog.pfan.cn/tujun/36599.html</link>
		<description><![CDATA[文章转自http://www.cublog.cn/u/884/showart.php?id=261667
&nbsp;
原文地址：http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/how-to-setup-asp-net-v1-1-visual-studio-net-2003-projects-on-iis7-vista.aspx
&nbsp;
如果你不大熟悉&nbsp;IIS 7.0 的配置, 要想让 ASP.NET 1.1 在 IIS 7.0&nbsp;上正常运行应该是很难的. 安装VS.NET2003时你将会得到以下的一些错误:



Microsoft Development EnvironmentError while trying to run project: Unable to start debugging on the web server. Could not start ASP.NET or ATL Server debugging.Verify that ASP.NET or ATL Server is correctly installed on the server.



Microsoft Developement EnvironmentError while trying to run project: Unable to start debugging on the web server. You do not have permissions to debug the server.Verify that you are a member of the "Debugger Users" group on the server.



ASP.NET Version MismatchVisual Studio .NET has detected that the Web server is running ASP.NET version 1.0. The Web application you are creating or opening can be configured to be compliant with ASP.NE]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2008-07-08 19:48:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Hashtable&nbsp;的多线程自同步测试]]></title>
		<link>http://blog.pfan.cn/tujun/33157.html</link>
		<description><![CDATA[以前多线程使用Hashtable的时候,都是使用lock(Hashtable)的方式进行同步,那天在网上忽然查到一个资料,就是Hashtable 对于多线程是安全的,可以实现自同步,也就是不需要lock也能实现同步,于是写了段代码测试:private Hashtable mObjectHash = null;//定义一个哈希表 
private int mMaxCount = 50000;//定义最大对象数///定义的测试对象类private class mShowObject{public int ID=-1;public String Name;public override string ToString(){ return String.Format("{0}\t{1}", this.ID, this.Name); } } ///定义的一些变量,用于计数 long threadAccess = 0; int deleteObjectcount = 0;int addobjectCount = 0;int editobjectcount = 0;DateTime startTime = DateTime.Now;//启动时间bool mActive = false;int mChangeThreadCount = 0;Random rnd = null;//构造函数public Form1(){ 
InitializeComponent();mObjectHash = Hashtable.Synchronized(new Hashtable(mMaxCount));//初始化一个具有自同步属性的哈希表rnd = new Random((int)DateTime.Now.Ticks);}private void AddObject(mShowObject obj){ 
if (obj == null) return;lock (mObjectHash){%%%%&nbsp;&nbsp;&nbsp; if (mObjectHash.ContainsKey(obj.ID)) return;//此处因为判断和添加事务之间可能会出现不同的结果,因此,需要手动同步 
mObjectHash.Add(obj.ID, obj);}}private void EditO]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2008-03-03 22:14:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C#&nbsp;在listview中添加进度条]]></title>
		<link>http://blog.pfan.cn/tujun/30787.html</link>
		<description><![CDATA[今天写了一个可以显示进度条的ListView控件,代码如下:
/// &lt;summary&gt;&nbsp;/// ListViewEx 的摘要说明。&nbsp;/// &lt;/summary&gt;&nbsp;public class ListViewEx : System.Windows.Forms.ListView&nbsp;{&nbsp;&nbsp;/// &lt;summary&gt; &nbsp;&nbsp;/// 必需的设计器变量。&nbsp;&nbsp;/// &lt;/summary&gt;&nbsp;&nbsp;private System.ComponentModel.Container components = null;
&nbsp;&nbsp;private String mProgressColumnText = String.Empty;&nbsp;&nbsp;/// &lt;summary&gt;&nbsp;&nbsp;/// 需要设置为进度条的列标头文字,根据这些文字判断所在列是否为进度条显示列&nbsp;&nbsp;/// &lt;/summary&gt;&nbsp;&nbsp;private String ProgressColumnText&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;get&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;return mProgressColumnText;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;set&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;mProgressColumnText = value;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;}&nbsp;&nbsp;private Color mProgressColor = Color.Red;&nbsp;&nbsp;public Color ProgressColor&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;get&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;return this.mProgressColor;&nbs]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-11-05 22:16:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C#做媒体播放器]]></title>
		<link>http://blog.pfan.cn/tujun/30620.html</link>
		<description><![CDATA[&nbsp;
参考网上一些类似代码写的,写的比较仓促,没有做较好的完善,以后再搞了!
&nbsp;
下载地址:&nbsp;http://upload.programfan.com/upfile/200710311146704.rar
&nbsp;]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-10-31 11:51:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C#下用GDI绘制城墙线波浪线等线型]]></title>
		<link>http://blog.pfan.cn/tujun/30619.html</link>
		<description><![CDATA[调用的API:
[DllImport("gdi32.dll", EntryPoint="LineDDA")]&nbsp;&nbsp;public static extern int LineDDA (&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp; nXStart,　　　　　　&nbsp;&nbsp; //&nbsp;&nbsp; 线条起点的X坐标&nbsp;&nbsp; &nbsp; 　　　　&nbsp;int&nbsp;&nbsp; nYStart,　　　　　　&nbsp;&nbsp; //&nbsp;&nbsp; 线条起点的Y坐标&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int&nbsp;&nbsp; nXEnd,　　　　　　　&nbsp;&nbsp; //&nbsp;&nbsp; 线条终点的X坐标&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int&nbsp;&nbsp; nYEnd,　　　　　　　&nbsp;&nbsp; //&nbsp;&nbsp; 线条终点的Y坐标&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;LineDDAProcHandle&nbsp; lpLineDDAProc,&nbsp;&nbsp;&nbsp;IntPtr lParam&nbsp;&nbsp;&nbsp;);&nbsp;&nbsp;public delegate void&nbsp;&nbsp;&nbsp; LineDDAProcHandle(&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int&nbsp;&nbsp; X, //&nbsp;&nbsp; 被求值点的X坐标&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int&nbsp;&nbsp; Y, //&nbsp;&nbsp; 被求值点的Y坐标&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;ref DrawStruct&nbsp;&nbsp; lpData );&nbsp;&nbsp;private void&nbsp;&nbsp;&nbsp; LineDDAProc(&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int&nbsp;&nbsp; X, //&nbsp;&nbsp; 被求值点的]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-10-31 11:37:00</pubDate>
		</item>
				<item>
		<title><![CDATA[2种通过经纬度坐标计算距离的方法]]></title>
		<link>http://blog.pfan.cn/tujun/30618.html</link>
		<description><![CDATA[2种方法都是在网上搜索来的,一种原来是java写的,一种是.net写的,java的那个我翻译成.net的了.
1:原JAVA
double distanceByLnglat(double _Longitude1,&nbsp;&nbsp;&nbsp;double _Latidute1,&nbsp;&nbsp;&nbsp;double _Longitude2,&nbsp;&nbsp;&nbsp;double _Latidute2)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double radLat1 = _Latidute1 * Math.PI / 180;&nbsp;&nbsp;&nbsp;double radLat2 = _Latidute2 * Math.PI / 180;&nbsp;&nbsp;&nbsp;double a = radLat1 - radLat2;&nbsp;&nbsp;&nbsp;double b = _Longitude1 * Math.PI / 180 - _Longitude2 * Math.PI / 180;&nbsp;&nbsp;&nbsp;double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) + Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));&nbsp;&nbsp;&nbsp;s = s * 6378137.0;// 取WGS84标准参考椭球中的地球长半径(单位:m)&nbsp;&nbsp;&nbsp;s = Math.Round(s * 10000) / 10000;
&nbsp;&nbsp;&nbsp;return s;&nbsp;&nbsp;}
&nbsp;
&nbsp;
&nbsp;2:原.Net
public struct EarthPoint&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;public const double Ea = 6378137; // 赤道半径 WGS84标准参考椭球中的地球长半径(单位:m)&nbsp; &nbsp;&nbsp;&nbsp;pu]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-10-31 11:26:00</pubDate>
		</item>
				<item>
		<title><![CDATA[获取数据库所有存储过程名称,内容以及参数的语句]]></title>
		<link>http://blog.pfan.cn/tujun/30477.html</link>
		<description><![CDATA[SELECT (CASE WHEN b.colorder = 1 OR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.colorder IS NULL THEN a.name ELSE '' END) AS N'表名', b.name AS N'字段名', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.NAME AS N'数据类型', b.prec AS N'长度', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CASE WHEN b.colstat = 4 THEN '√' ELSE '' END) N'是否输出', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.colorder N'字段序号', (CASE WHEN b.colorder = 1 OR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.colorder IS NULL THEN d .text ELSE '' END) AS N'内容'FROM sysobjects a LEFT JOIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; syscolumns b ON b.id = a.id LEFT JOIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; systypes C ON (C.xtype = B.xtype AND c.name &lt;&gt; 'sysname') LEFT JOIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; syscomments d ON d .id = a.idWHERE a.schema_ver = 0 AND a.xtype = 'p'ORDER BY a.name, b.colorder]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-10-25 11:55:00</pubDate>
		</item>
				<item>
		<title><![CDATA[尚未解决:服务器端异步方式的异常-不执行回调]]></title>
		<link>http://blog.pfan.cn/tujun/30301.html</link>
		<description><![CDATA[单位上一个用于通讯的服务器上的程序出了问题:
服务器程序使用UDP服务端,用的是异步Socket模式,服务器刚搭建好的时候没什么问题,最近由于通讯客户端增多(da大概1500个左右)后,出现这样的问题:
mySocket.Bind(ipe);&nbsp;&nbsp;&nbsp;&nbsp;mySocket.BeginReceiveFrom(obj.buffer,0,UdpTranslateObj.BUFFER_SIZE,SocketFlags.None,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ref obj.endPoint,new AsyncCallback(ReceiveCallBack),obj);
private void ReceiveCallBack(IAsyncResult ar)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;UdpTranslateObj obj = (UdpTranslateObj)ar.AsyncState;&nbsp;&nbsp;&nbsp;try&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;int k = obj.udpSock.EndReceiveFrom(ar,ref obj.endPoint);&nbsp;&nbsp;&nbsp;&nbsp;if(k &gt; 0)&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReceiveEventArgs e = new ReceiveEventArgs();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e._ReceiveBytes = new byte[k];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array.Copy(obj.buffer,0,e._ReceiveBytes,0,k);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e._RemoteEndPoint = obj.endPoint;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnReceive(e);&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-10-22 20:52:00</pubDate>
		</item>
				<item>
		<title><![CDATA[用ODBC导出数据到Excel中]]></title>
		<link>http://blog.pfan.cn/tujun/30209.html</link>
		<description><![CDATA[数据导出到Excel不一定要用Office的COM,利用ODBC也可以做到!
&nbsp;
定义一个连接Excel文件的连接字符串:
String excelSql = @"Driver={Microsoft Excel Driver (*.xls)};READONLY=FALSE;DriverId=790;Dbq={0};DefaultDir=c:\;" ;
其中的{0}要实际替换为目标文件的路径和全名.
this.saveFileDialog1.Filter = "Excel文件.xls | *.xls";
string saveFileName&nbsp; = "";&nbsp;&nbsp;&nbsp;DialogResult dr = this.saveFileDialog1.ShowDialog();&nbsp;&nbsp;&nbsp;if(dr != DialogResult.Cancel)&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;saveFileName = saveFileDialog1.FileName;&nbsp;&nbsp;&nbsp;&nbsp;if(File.Exists(saveFileName))&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File.Delete(saveFileName);//删除目标文件&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File.Copy("Book1.xls",saveFileName,true);//复制母板文件为目标文件
}
else
{&nbsp; 
return;//保存文件对话框中选择了'取消'
}&nbsp;String conSql =excelSql.Replace("{0}",saveFileName);//替换连接字符串中的占位符&nbsp;OdbcConnection cnn = new OdbcConnection(conSql);
try{
cnn.Open();//打开连接
}
catch
{
return;//打开连接失败,退出
}
///下面在Exce]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-10-19 09:44:00</pubDate>
		</item>
				<item>
		<title><![CDATA[如何获取SQL表字段的注释文本]]></title>
		<link>http://blog.pfan.cn/tujun/26249.html</link>
		<description><![CDATA[SQL2000:
SELECT B.name as 字段名,A.[value] as 注释FROM sysproperties A INNER JOIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; syscolumns&nbsp;B ON b.colid = A.smallid AND A.id = B.idWHERE (B.id = OBJECT_ID('表名称'))
SQL2005:
select * from fn_listextendedproperty('MS_Description',&nbsp;&nbsp; 'user',&nbsp;&nbsp; 'dbo',&nbsp;&nbsp; 'table',&nbsp;&nbsp; '表名称'',&nbsp;&nbsp; 'column',&nbsp;&nbsp; default) 注:次方法只能取出有注释的字段,如果指定表没有注释,则此方法不能获取到任何记录]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-05-29 22:08:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C#通讯编程步步高(一)]]></title>
		<link>http://blog.pfan.cn/tujun/26245.html</link>
		<description><![CDATA[&nbsp;
2. UDP
UDP协议是一种无连接的,不可靠的通讯模式,所谓不可靠,即它不保证数据能准确的发送到对方,因此使用它的时候必须考虑数据包丢失的情况. 使用UDP的场合一般是对数据包能否到达对方没有严格要求,只在乎数据能快速的到达对方.据我使用UDP协议编程的经验,UDP传输对服务器的压力最低,也就是服务器的开销最少,这对于需要处理海量连接的服务器而言,优势不言而喻.
由于UDP协议的无连接传输,也就是UDP协议在发送数据包之前不需要和对方建立连接,所以在使用UDP协议传输数据时要考虑数据确认的问题,因为发送方并不清楚目的计算机是否接收到了数据,或是数据包在传输过程中被丢弃.
UDP协议的通讯过程十分简单:发送方直接将数据发送到目标计算机的地址和端口即可.在C#中,UDP Socket在发送数据之前需要绑定一个本地端口或者用Connect方法连接目标计算机端口(事实上,这个方法并没有进行连接,它只是决定之后用这个Socket发送时是否需要提供远程主机的地址端口).
二.C#中的与Socket通讯相关的命名空间和类
1.System.Net命名空间:
这个命名空间提供了通讯协议的接口.
.Net Framwork SDK文档对这个命名空间的描述:System.Net 命名空间为当前网络上使用的多种协议提供了简单的编程接口。WebRequest 和 WebResponse 类形成了所谓的可插接式协议的基础。可插接式协议是网络服务的一种实现，它使您能够开发出使用 Internet 资源的应用程序，而不必考虑各种不同协议的具体细节。
2.System.Net.Sockets命名空间:
这个命名空间提供了构造Socket需要的类.
.Net Framwork SDK文档对这个命名空间的描述:
System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。
TCPClient、TCPListener 和 UDPClient 类封装有关创建到 Internet 的 TCP 和 UDP 连接的详细信息。
3.Socket编程常用的类:
(1) IPAddress类:
IPAddress类实现对IP地址的对象化封装.
常用方法和常量:
a.Pars]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-05-29 21:35:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C#通讯编程步步高(序)]]></title>
		<link>http://blog.pfan.cn/tujun/26208.html</link>
		<description><![CDATA[在C#中,通讯编程是十分容易的一件事情.以前在C++中很长的代码能完成的事情,在C#中几句代码就能解决,这得益于.net框架提供的高度封装的类库.学习C#3年了,觉得应该把自己的心得写出来,供别人也供自己以后学习.
注:以下内容纯粹属于随笔,没有目录.可能内容中有些错误,欢迎指正.
另:这里所说的通讯编程指Windows系统下的通讯编程.
一.网络通讯
网络通讯最主要的方法就是Socket通讯,所以我也只学习了Socket TCP/UDP通讯,至于什么命名管道啊什么的通讯我没有去学习,不是不值得学,而是因为自己精力有限,把所有的精力都放到了Socket TCP/UDP通讯上.
二.通讯协议
1.TCP
TCP通讯协议是基于IP协议之上的一种面向可靠连接的通讯协议,在它之上有类似很多的比如http,ftp等协议都是我们熟悉的.它的优点是传输可靠,能够保证数据完整的正确的发送到接收方,在对数据正确性和完整性比较高的场合,TCP通讯是我的选择.
TCP协议的通讯过程:首先,必须先建立和接收方的通讯链接(Connect),接收方响应链接(Accept);然后才是发送数据(Send),接收方接收数据(Receive);最后双方拆除链接(Disconnect).
上面的通讯过程是我们具体使用TCP协议进行编程时的操作,实际上对于底层通讯,在链接建立和数据通讯的过程中,通讯双方的Socket实际要做很多事情,当然,这些不是我们关心的,我们也无须控制它,除非我们熟知通讯双方的网络状况,我们才可以调整Socket在通讯过程中的一些配置参数(SetSocketOptions),参数非常之多,我也没具体了解过,不过可以参考&lt;TCP/IP协议详解&gt;和&lt;Windows网络编程&gt;等书.
使用TCP/IP协议编程务必了解NG算法.NG算法是一种排队算法,通俗的讲,因为TCP/IP的传输效率问题(TCP协议的数据头比UDP协议的数据头要大),它采用一种算法,使网络上一次数据交互能够最大可能的传输数据,也就是在一定时间内,调用Send方法发送数据的时候,TCP并非立即发送,而是等待缓冲区到一定水位后再进行发送,除非等待的时间到达,否则TCP会一直等待缓冲区内有更多的数据.
NG算法能解决TCP/IP通讯效率的问题,但是也给我们编程带来了一定的难度,其中最]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-05-27 22:46:00</pubDate>
		</item>
				<item>
		<title><![CDATA[浅析:setsockopt()改善socket网络程序的健壮性[转]]]></title>
		<link>http://blog.pfan.cn/tujun/25207.html</link>
		<description><![CDATA[1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分）调用closesocket（一般不会立即关闭而经历TIME_WAIT的过程
）后想继续重用该socket：BOOL bReuseaddr=TRUE;setsockopt(s，SOL_SOCKET ，SO_REUSEADDR，(const char*)&amp;bReuseaddr，sizeof(BOOL));
2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭，不经历TIME_WAIT的过程：BOOL bDontLinger = FALSE; setsockopt(s，SOL_SOCKET，SO_DONTLINGER，(const char*)&amp;bDontLinger，sizeof(BOOL));
3.在send()，recv()过程中有时由于网络状况等原因，发收不能预期进行，而设置收发时限：int nNetTimeout=1000;//1秒//发送时限setsockopt(socket，SOL_S0CKET，SO_SNDTIMEO，(char *)&amp;nNetTimeout，sizeof(int));//接收时限setsockopt(socket，SOL_S0CKET，SO_RCVTIMEO，(char *)&amp;nNetTimeout，sizeof(int));
4.在send()的时候，返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K)；在实际的过程中发送数据和接收数据量比较大，可以设置socket缓冲区，而避免了send()，recv()不断的循环收发：// 接收缓冲区int nRecvBuf=32*1024;//设置为32Ksetsockopt(s，SOL_SOCKET，SO_RCVBUF，(const char*)&amp;nRecvBuf，sizeof(int));//发送缓冲区int nSendBuf=32*1024;//设置为32Ksetsockopt(s，SOL_SOCKET，SO_SNDBUF，(const char*)&amp;nSendBuf，sizeof(int));
5. 如果在发送数据的时，希望不经历由系统]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-04-24 16:50:00</pubDate>
		</item>
				<item>
		<title><![CDATA[怎样用Shell调用sql执行sql脚本文件]]></title>
		<link>http://blog.pfan.cn/tujun/24848.html</link>
		<description><![CDATA[string sqlQuery = "osql.exe /uSQLLogUser /pPasswrod /sServerName /dDataBaseName /i yoursql.sql";]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-04-13 11:26:00</pubDate>
		</item>
				<item>
		<title><![CDATA[安装SQL2000报“挂起的文件操作”&nbsp;]]></title>
		<link>http://blog.pfan.cn/tujun/24603.html</link>
		<description><![CDATA[&nbsp;如果在安装SQL Server之前装过其他软件，常常报：“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机。”即使重启N次也不行，解决方法：开始》运行》regedt32 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager，HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager， HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager这三个项中的PendingFileRenameOperations值，删除即可。]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-04-04 22:47:00</pubDate>
		</item>
				<item>
		<title><![CDATA[关于“automation服务器不能创建对象”的问题的解决方案大全]]></title>
		<link>http://blog.pfan.cn/tujun/23862.html</link>
		<description><![CDATA[automation服务器不能创建对象”的问题的解决方案大全 
&nbsp;
文章引用至:
http://e.simwe.com/html/v/b/c/viewspace_2916.html本人工作中的应用系统都是jsp的，大量javascript程序，一旦出“automation服务器不能创建对象”问题，大量报表及查询无法保存，苦思冥 想、千尝万试，终于将其搞定，现将相关方案与大家共享。 1、如果是Scripting.FileSystemObject (FSO 文本文件读写)被关闭了，开启FSO功能即可，在“运行”中执行regsvr32 scrrun.dll即可 2、安全模式设置成“中”，如果javascript脚本中报这个错误，还应将IE的安全设置“不允许运行未标记为安全的activeX控件”启用即可。 注意如果您将相应的网站设成“受信任的站点”，必须对“受信任的站点”进行相应的IE安全设置，此时如果对“Internet”IE设置将是徒劳 的。 3、有些脚本需要微软的 MSXML 控件才能进入。当使用 IE 5 以上版本的缺省安全模式时，会提示是否接受 MSXML 控件，如果接受，MSXML 将 自动安装到您的机器上(得等上几分钟)。如果自动安装不成功，可以自行下载和安装 MSXML 3.0 SP7。有时是由于msxml 3服务被关掉了，使用 regsvr32 msxml3.dll即可 4、用上面方法基本上能决问题。如果是在安装某个软件后出现这种问题，可尝度卸载该软件或重装一下！ 
如果还是不行，试试以下方法：
5、请将以下语句复制到记事本中，另存为后缀为.cmd的文件，并运行。当然在命令行下一句句运行也没问题。 echo 正在修复，这个过程可能需要几分钟，请稍候…… rundll32.exe advpack.dll /DelNodeRunDLL32 %systemroot%/System32/dacui.dll rundll32.exe advpack.dll /DelNodeRunDLL32 %systemroot%/Catroot/icatalog.mdb regsvr32 /s comcat.dll regsvr32 /s asctrls.ocx regsvr32 /s oleaut32.dll regsvr32 /s shdocvw.dll]]></description>
		<author><![CDATA[tujun]]></author>
		<pubDate>2007-03-12 09:19:00</pubDate>
		</item>
		</channel>
</rss>