<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-18523442759850498</id><updated>2011-04-21T15:51:32.717-07:00</updated><title type='text'>C#</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>62</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-6128294514655016548</id><published>2008-10-21T05:14:00.002-07:00</published><updated>2008-10-21T05:15:32.313-07:00</updated><title type='text'>c#2.0泛型学习</title><content type='html'>根据微软的视频教程"跟我一起学Visual Studio 2005C#语法篇"来学,因为里面有比较多的代码示例,学起来比较容易好理解&lt;br /&gt;&lt;br /&gt;1.未使用泛型的Stack类&lt;br /&gt;&lt;br /&gt; 1using System;&lt;br /&gt; 2&lt;br /&gt; 3public class Stack&lt;br /&gt; 4{&lt;br /&gt; 5    readonly int m_Size;&lt;br /&gt; 6    int m_StackPointer = 0;&lt;br /&gt; 7    object[] m_Items;&lt;br /&gt; 8    public Stack(): this(100)&lt;br /&gt; 9    { }&lt;br /&gt;10    public Stack(int size)&lt;br /&gt;11    {&lt;br /&gt;12        m_Size = size;&lt;br /&gt;13        m_Items = new object[m_Size];&lt;br /&gt;14    }&lt;br /&gt;15    public void Push(object item)&lt;br /&gt;16    {&lt;br /&gt;17        if (m_StackPointer &gt;= m_Size)&lt;br /&gt;18            throw new StackOverflowException();&lt;br /&gt;19&lt;br /&gt;20        m_Items[m_StackPointer] = item;&lt;br /&gt;21        m_StackPointer++;&lt;br /&gt;22    }&lt;br /&gt;23    public object Pop()&lt;br /&gt;24    {&lt;br /&gt;25        m_StackPointer--;&lt;br /&gt;26        if (m_StackPointer &gt;= 0)&lt;br /&gt;27        {&lt;br /&gt;28            return m_Items[m_StackPointer];&lt;br /&gt;29        }&lt;br /&gt;30        else&lt;br /&gt;31        {&lt;br /&gt;32            m_StackPointer = 0;&lt;br /&gt;33            throw new InvalidOperationException("Cannot pop an empty stack");&lt;br /&gt;34        }&lt;br /&gt;35    }&lt;br /&gt;36}&lt;br /&gt;37&lt;br /&gt;2.使用泛型的类&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 1using System;&lt;br /&gt; 2&lt;br /&gt; 3public class Stack&lt;T&gt;&lt;br /&gt; 4{&lt;br /&gt; 5    readonly int m_Size;&lt;br /&gt; 6    int m_StackPointer = 0;&lt;br /&gt; 7    T[] m_Items;&lt;br /&gt; 8    public Stack()&lt;br /&gt; 9        : this(100)&lt;br /&gt;10    {&lt;br /&gt;11    }&lt;br /&gt;12    public Stack(int size)&lt;br /&gt;13    {&lt;br /&gt;14        m_Size = size;&lt;br /&gt;15        m_Items = new T[m_Size];&lt;br /&gt;16    }&lt;br /&gt;17    public void Push(T item)&lt;br /&gt;18    {&lt;br /&gt;19        if (m_StackPointer &gt;= m_Size)&lt;br /&gt;20            throw new StackOverflowException();&lt;br /&gt;21&lt;br /&gt;22        m_Items[m_StackPointer] = item;&lt;br /&gt;23        m_StackPointer++;&lt;br /&gt;24    }&lt;br /&gt;25    public T Pop()&lt;br /&gt;26    {&lt;br /&gt;27        m_StackPointer--;&lt;br /&gt;28        if (m_StackPointer &gt;= 0)&lt;br /&gt;29        {&lt;br /&gt;30            return m_Items[m_StackPointer];&lt;br /&gt;31        }&lt;br /&gt;32        else&lt;br /&gt;33        {&lt;br /&gt;34            m_StackPointer = 0;&lt;br /&gt;35            //throw new InvalidOperationException("Cannot pop an empty stack");&lt;br /&gt;36            return default(T);&lt;br /&gt;37        }&lt;br /&gt;38    }&lt;br /&gt;39}&lt;br /&gt;40&lt;br /&gt;41public class Stack1&lt;T&gt; : Stack&lt;T&gt;&lt;br /&gt;42{ &lt;br /&gt;43&lt;br /&gt;44}&lt;br /&gt;45&lt;br /&gt;下为PDF文档,我感觉挺好的,很简单,我听的懂就是好的&lt;br /&gt;/Clingingboy/one.pdf&lt;br /&gt;&lt;br /&gt;多个泛型&lt;br /&gt; 1class Node&lt;K, T&gt;&lt;br /&gt; 2{&lt;br /&gt; 3    public K Key;&lt;br /&gt; 4    public T Item;&lt;br /&gt; 5    public Node&lt;K, T&gt; NextNode;&lt;br /&gt; 6    public Node()&lt;br /&gt; 7    {&lt;br /&gt; 8        Key = default(K);&lt;br /&gt; 9        Item = default(T);&lt;br /&gt;10        NextNode = null;&lt;br /&gt;11    }&lt;br /&gt;12    public Node(K key, T item, Node&lt;K, T&gt; nextNode)&lt;br /&gt;13    {&lt;br /&gt;14        Key = key;&lt;br /&gt;15        Item = item;&lt;br /&gt;16        NextNode = nextNode;&lt;br /&gt;17    }&lt;br /&gt;18}&lt;br /&gt;泛型别名&lt;br /&gt;&lt;br /&gt;1using list = LinkedList&lt;int, string&gt;;&lt;br /&gt;泛型约束&lt;br /&gt;&lt;br /&gt; 1public class LinkedList&lt;K, T&gt; where K : IComparable&lt;br /&gt; 2{&lt;br /&gt; 3    Node&lt;K, T&gt; m_Head;&lt;br /&gt; 4    public LinkedList()&lt;br /&gt; 5    {&lt;br /&gt; 6        m_Head = new Node&lt;K, T&gt;();&lt;br /&gt; 7    }&lt;br /&gt; 8    public void AddHead(K key, T item)&lt;br /&gt; 9    {&lt;br /&gt;10        Node&lt;K, T&gt; newNode = new Node&lt;K, T&gt;(key, item, m_Head.NextNode);&lt;br /&gt;11        m_Head.NextNode = newNode;&lt;br /&gt;12    }&lt;br /&gt;13&lt;br /&gt;14    T Find(K key)&lt;br /&gt;15    {&lt;br /&gt;16        Node&lt;K, T&gt; current = m_Head;&lt;br /&gt;17        while (current.NextNode != null)&lt;br /&gt;18        {&lt;br /&gt;19            if (current.Key.CompareTo(key) == 0)&lt;br /&gt;20                break;&lt;br /&gt;21            else&lt;br /&gt;22                current = current.NextNode;&lt;br /&gt;23        }&lt;br /&gt;24        return current.Item;&lt;br /&gt;25    }&lt;br /&gt;26&lt;br /&gt;27}&lt;br /&gt;28&lt;br /&gt;&lt;br /&gt; 1using System;&lt;br /&gt; 2using System.Collections.Generic;&lt;br /&gt; 3using System.Text;&lt;br /&gt; 4&lt;br /&gt; 5namespace VS2005Demo1&lt;br /&gt; 6{&lt;br /&gt; 7    public class MyBaseClassGeneric // sealed,static&lt;br /&gt; 8    {&lt;br /&gt; 9    }&lt;br /&gt;10&lt;br /&gt;11    interface IMyBaseInterface&lt;br /&gt;12    {&lt;br /&gt;13        void A();&lt;br /&gt;14    }&lt;br /&gt;15&lt;br /&gt;16    internal class GenericClass&lt;T&gt; where T : MyBaseClassGeneric,IMyBaseInterface&lt;br /&gt;17    { &lt;br /&gt;18    &lt;br /&gt;19    }&lt;br /&gt;20&lt;br /&gt;21    class GClass&lt;K, T&gt; where K : MyBaseClassGeneric,IMyBaseInterface,new() where T : K&lt;br /&gt;22    { &lt;br /&gt;23    &lt;br /&gt;24    }&lt;br /&gt;25&lt;br /&gt;26    class GUClass&lt;K, T&gt; where T : K where K : MyBaseClassGeneric,IMyBaseInterface, new()&lt;br /&gt;27    {&lt;br /&gt;28        GClass&lt;K, T&gt; obj = new GClass&lt;K, T&gt;();&lt;br /&gt;29    }&lt;br /&gt;30&lt;br /&gt;31&lt;br /&gt;32    不能将引用/值类型约束与基类约束一起使用，因为基类约束涉及到类#region 不能将引用/值类型约束与基类约束一起使用，因为基类约束涉及到类&lt;br /&gt;33    &lt;br /&gt;34    //class A&lt;T&gt; where T : struct,class&lt;br /&gt;35    //{}&lt;br /&gt;36    &lt;br /&gt;37    #endregion&lt;br /&gt;38&lt;br /&gt;39    不能使用结构和默认构造函数约束，因为默认构造函数约束也涉及到类#region 不能使用结构和默认构造函数约束，因为默认构造函数约束也涉及到类&lt;br /&gt;40&lt;br /&gt;41    //class A&lt;T&gt; where T : struct,new()&lt;br /&gt;42    //{}&lt;br /&gt;43&lt;br /&gt;44    #endregion&lt;br /&gt;45&lt;br /&gt;46    虽然您可以使用类和默认构造函数约束，但这样做没有任何价值#region 虽然您可以使用类和默认构造函数约束，但这样做没有任何价值&lt;br /&gt;47&lt;br /&gt;48    class A&lt;T&gt; where T : new()&lt;br /&gt;49    {&lt;br /&gt;50        T obj = new T();&lt;br /&gt;51    }&lt;br /&gt;52&lt;br /&gt;53    class TypeA&lt;br /&gt;54    {&lt;br /&gt;55        public TypeA() { }&lt;br /&gt;56    }&lt;br /&gt;57&lt;br /&gt;58    class TestA&lt;br /&gt;59    {&lt;br /&gt;60        A&lt;TypeA&gt; obj = new A&lt;TypeA&gt;();&lt;br /&gt;61    }&lt;br /&gt;62&lt;br /&gt;63    #endregion&lt;br /&gt;64&lt;br /&gt;65    可以将引用/值类型约束与接口约束组合起来，前提是引用/值类型约束出现在约束列表的开头#region 可以将引用/值类型约束与接口约束组合起来，前提是引用/值类型约束出现在约束列表的开头&lt;br /&gt;66    &lt;br /&gt;67    class SClass&lt;K&gt; where K : struct, IMyBaseInterface&lt;br /&gt;68    { }&lt;br /&gt;69&lt;br /&gt;70    class CClass&lt;K&gt; where K : class, IMyBaseInterface&lt;br /&gt;71    { }&lt;br /&gt;72    &lt;br /&gt;73    #endregion&lt;br /&gt;74}&lt;br /&gt;75&lt;br /&gt;&lt;br /&gt;资料引用:http://www.knowsky.com/339311.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-6128294514655016548?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/6128294514655016548/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=6128294514655016548' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/6128294514655016548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/6128294514655016548'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c20.html' title='c#2.0泛型学习'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-9087521857421239082</id><published>2008-10-21T05:14:00.001-07:00</published><updated>2008-10-21T05:14:49.840-07:00</updated><title type='text'>C#编程--基础知识点</title><content type='html'>.NetFramework简介&lt;br /&gt;.netframework运行于操作系统之上，提供良好的跨语言特性。&lt;br /&gt;.netframework包含两个内容：公共语言运行时（CLR）和类库集（FCL）&lt;br /&gt;MSIL微软中间语言。当编译.net支持的语言编写的代码的时候，输出的代码为MSIL&lt;br /&gt;CLR又包含：通用语言规范(CLS:保证语言互操作性的一组规则)和公共类型系统(CTS:包含了.net支持的各语言间兼容的数据类型和功能)&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;C#中的变量和常量&lt;br /&gt;C#中的基本数据类型：&lt;br /&gt;值类型和引用类型&lt;br /&gt;值类型：简单类型、结构类型和枚举类型。&lt;br /&gt;简单类型：整数类型、浮点类型、小数类型（decimal）和布尔类型等&lt;br /&gt;sbyte是有符号的，相当java的byte型，范围-128~127&lt;br /&gt;C#中byte是无符号的，范围0~255&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;变量命名方法：&lt;br /&gt;帕斯卡命名法和骆驼命名法&lt;br /&gt;帕斯卡命名法：如果有多个单词组成，每个单词首字母大写&lt;br /&gt;骆驼命名法：如果有多个单词组成，第一个单词全部小写，后面的单词大写&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;C#中的常量：const与readonly两种&lt;br /&gt;const声明的常量：叫静态常量，必须声明时就初始化，且只能用常数值初始化&lt;br /&gt;readonly声明的常量：叫动态常量，可以在声明时不初始化，只能在构造函数中初始化，但必须每个构造函数中都要初始化；而且可以使用变量值初始化&lt;br /&gt;&lt;br /&gt;class Test&lt;br /&gt;{&lt;br /&gt;        const  float PI = 3.1416f;       //常量命名：全部大写&lt;br /&gt;        readonly float G;&lt;br /&gt;        public Test()&lt;br /&gt;        {&lt;br /&gt;                G = 9.80F;&lt;br /&gt;        }&lt;br /&gt;        public Test(float g) //每个构造函数中都要初始化；而且可以使用变量值初始化&lt;br /&gt;        {&lt;br /&gt;                G = g;&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;C#中的装箱和拆箱&lt;br /&gt;装箱：值类型转换成有引用类型&lt;br /&gt;拆箱：引用类型转换成值类型&lt;br /&gt;值类型：存在栈中&lt;br /&gt;引用类型：在堆中存放对象的地址（即引用），对象本身存放在栈中&lt;br /&gt;拆装箱允许值类型和引用类型相互处理&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;C#语法&lt;br /&gt;&lt;br /&gt;Switch()括号中可以是int ,char和string ,switch语句中的case语句冒号后什么都不写，可以不写break,其他情况一定要写break，否则报错&lt;br /&gt;&lt;br /&gt;数组：五种声明方式&lt;br /&gt;   int []array;&lt;br /&gt;   array = new int[2];&lt;br /&gt;&lt;br /&gt;   //第二种声明方式&lt;br /&gt;   int []array1 = new int[2];&lt;br /&gt;&lt;br /&gt;   //第三种声明方式&lt;br /&gt;   int []array2 = {1,2,3};&lt;br /&gt;&lt;br /&gt;   //第四种声明方式&lt;br /&gt;   int []array3 = new int[]{1,2,3};&lt;br /&gt;&lt;br /&gt;   //第五种声明方式&lt;br /&gt;   int []array4 = new int[3]{1,2,3};&lt;br /&gt;&lt;br /&gt;   //数组大小也可以是变量&lt;br /&gt;   int count = 3;&lt;br /&gt;   int []arr = new int[count];&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;枚举：用有意义的字符去访问数据&lt;br /&gt;public enum Contry:long  //指定枚举类型，必须是整型,不写为int型&lt;br /&gt;  {&lt;br /&gt;   Pacific,         //第一个未付值，默认为零&lt;br /&gt;   China=1860,&lt;br /&gt;   Japan,&lt;br /&gt;   US=1901,&lt;br /&gt;   Canada&lt;br /&gt;  &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;C#中的面向对象&lt;br /&gt;析构函数：函数名与构造函数名一样，~函数名（），不接受参数，由垃圾回收器自动调用（GC.Collect()调用垃圾回收器）&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;virtual关键字：C#中，子类要重写父类的方法，必须把父类的方法标识为virtual(虚拟的)，同时重写方法用override修饰&lt;br /&gt;new 关键字：new关键字：在子类中定义的一个和父类方法签名一样，但是个全新的方法。并非重写父类的方法。&lt;br /&gt;base关键字：用base关键字调用父类的方法&lt;br /&gt;&lt;br /&gt;访问修饰符：&lt;br /&gt;public 公有的，&lt;br /&gt;internal 在一个项目中的，&lt;br /&gt;protected有父子关系的类，&lt;br /&gt;private仅所属类的成员&lt;br /&gt;&lt;br /&gt;注意：如果有一个类既继承类又实现接口，类名要写在接口名前面。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;属性，索引器，委托，事件&lt;br /&gt;&lt;br /&gt;属性：访问修饰一般为public，首字母大写。属性内有get和set访问器，get内必须要有return，set内有value关键字，代表从外部接受的值。&lt;br /&gt;索引器：索引器的作用：像处理数组一样去处理类的对象。&lt;br /&gt;    public class Student&lt;br /&gt;      {&lt;br /&gt;          private string []obj=new string[10];&lt;br /&gt;&lt;br /&gt;          //this关键字在这里代表每一个类的对象，[]中整数是指通过下标访问&lt;br /&gt;          public string this[int index]            //此是可以通过索引号去访问每一个类的成员   &lt;br /&gt;          {&lt;br /&gt;               get&lt;br /&gt;               {&lt;br /&gt;                    return obj[index];&lt;br /&gt;               }&lt;br /&gt;               set&lt;br /&gt;               {&lt;br /&gt;                    if(value!=null)&lt;br /&gt;                    obj[index]=value;&lt;br /&gt;               }&lt;br /&gt;          }&lt;br /&gt;         static void Main(string []args)&lt;br /&gt;         {&lt;br /&gt;                  Student stucollection=new Student();&lt;br /&gt;                   stucollection[0]="柯南";&lt;br /&gt;                   stucollection[1]="小五郎";&lt;br /&gt;                   stucollection[5]="怪盗基德";&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;委托：相当于函数指针，可使程序在运行是再指定具体要运行的方法。&lt;br /&gt;(1) 定义委托：Public delegate int Call()&lt;br /&gt;(2) 实例化委托：objcall=new Call(方法名)&lt;br /&gt;(3) 调用委托：objcall();&lt;br /&gt;&lt;br /&gt;事件：事件实际上是一种特殊的委托，委托每次只能指向一个方法，而事件可以指向多个方法&lt;br /&gt;（1）定义一个委托public delegate void delegateMe();&lt;br /&gt;（2）定义一个事件 private event delegate eventMe;&lt;br /&gt;（3）订阅事件    eventMe+=new delegateMe(方法名1（）);&lt;br /&gt;                       eventMe+=new delegateMe(方法名2（）);&lt;br /&gt;（4） 引发事件    if(condition)   then  eventMe();&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;多线程&lt;br /&gt;&lt;br /&gt;创建线程实例：&lt;br /&gt;Thread obj=new Thread(new ThreadStart(方法名称))&lt;br /&gt;开始：Start();&lt;br /&gt;休眠：Sleep();&lt;br /&gt;终止：Abort();&lt;br /&gt;挂起：Suspend();&lt;br /&gt;恢复：Resume();&lt;br /&gt;当前线程：Thread.CurrentThread&lt;br /&gt;ThreadPriority枚举值用来指定调度线程的优先级（共5级）&lt;br /&gt;&lt;br /&gt;lock关键字&lt;br /&gt;C#中通过lock关键字提供同步&lt;br /&gt;线程同步：确保不同的线程对共享资源进行访问时，每次只有一个线程访问资源。&lt;br /&gt;Lock(this)&lt;br /&gt;{&lt;br /&gt;     For(int i=0;i&lt;10;i++)&lt;br /&gt;     { &lt;br /&gt;          //语句;&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;数组集合对象&lt;br /&gt;&lt;br /&gt;Array: Array和数组很相似,还可以相互转化和拷贝,很多方法都是是通用， 可以用Array的静态方法对数组实现反转，排序，这是数组本身无法做到的&lt;br /&gt;&lt;br /&gt;using  system.Array;&lt;br /&gt;Array ar=Array.CreateInstance(typeof(int),5);   //创建一个Array的实例&lt;br /&gt;ar.SetValue(12,0);                          //赋值&lt;br /&gt;&lt;br /&gt; Array.Reverse(ar);    // 反转&lt;br /&gt; Array.Sort(ar);        // 排序&lt;br /&gt;&lt;br /&gt;ArrayList:最常用的集合之一.集合的好处是在不知道数据大小时，可以实现容量自动增长，而数组做不到.&lt;br /&gt;Add()添加元素&lt;br /&gt;Remove(位置)移除元素&lt;br /&gt;&lt;br /&gt;ArrayList al=new ArrayList();&lt;br /&gt;//如果要遍历集合元素，&lt;br /&gt;   //方法一：&lt;br /&gt;   //将集合中的数拷贝到数组中&lt;br /&gt;   object []temp=al.ToArray();&lt;br /&gt;   foreach(object t in temp)&lt;br /&gt;   {&lt;br /&gt;    Console.WriteLine(t);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   //方法二，使用迭代器&lt;br /&gt;   IEnumerator ie=al.GetEnumerator();&lt;br /&gt;   while(ie.MoveNext())&lt;br /&gt;   {&lt;br /&gt;    Console.WriteLine(ie.Current);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;HashTable:以键值对的形式保存值&lt;br /&gt;&lt;br /&gt;Hashtable hash=new Hashtable(4);&lt;br /&gt; hash.Add("中国",1860);          &lt;br /&gt; hash.Add("德国",1940);&lt;br /&gt;&lt;br /&gt; Console.WriteLine(hash["中国"].ToString());通过key获得value&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SortedList :是 Hashtable 和 Array 的混合&lt;br /&gt;能存放键值对，类似Hashtable&lt;br /&gt;能通过自身提供的方法通过索引直接遍历，类似于Array&lt;br /&gt;objsortlist.GetKey(i)   方法获得键&lt;br /&gt;objsortlist.GetByIndex(i)方法获得值&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-9087521857421239082?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/9087521857421239082/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=9087521857421239082' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/9087521857421239082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/9087521857421239082'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_1753.html' title='C#编程--基础知识点'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-2763639386780159798</id><published>2008-10-21T05:13:00.001-07:00</published><updated>2008-10-21T05:13:58.647-07:00</updated><title type='text'>.NET 2.0下读取数据库中的全部表以及表内的字段名</title><content type='html'>TDBOperator db = null;&lt;br /&gt;&lt;br /&gt;            try&lt;br /&gt;&lt;br /&gt;            {&lt;br /&gt;&lt;br /&gt;                db = TDBOperatorFactory.GetDBOperator(comFunction.getDBLink());&lt;br /&gt;&lt;br /&gt;                 //打开数据库连接&lt;br /&gt;&lt;br /&gt;                db.Open();&lt;br /&gt;&lt;br /&gt;                System.Data.Common.DbConnection dc = db.getDbConnection();&lt;br /&gt;&lt;br /&gt;                string[] res = new string[4];&lt;br /&gt;&lt;br /&gt;                res[1] = "dbo";&lt;br /&gt;&lt;br /&gt;                //取得全部表名&lt;br /&gt;&lt;br /&gt;                DataTable dt = dc.GetSchema("Tables");&lt;br /&gt;&lt;br /&gt;                this.Text = dt.Rows.Count.ToString();&lt;br /&gt;&lt;br /&gt;                dt.WriteXml("table.xml");&lt;br /&gt;&lt;br /&gt;                foreach (System.Data.DataRow row in dt.Rows)&lt;br /&gt;&lt;br /&gt;                {&lt;br /&gt;&lt;br /&gt;                    //取出数据库中系统表外的所有表名&lt;br /&gt;&lt;br /&gt;                    if (row[3].ToString() == "TABLE")&lt;br /&gt;&lt;br /&gt;                    {&lt;br /&gt;&lt;br /&gt;                        listBox1.Items.Add(row[2].ToString());&lt;br /&gt;&lt;br /&gt;                        listBox1.Items.Add("============================");&lt;br /&gt;&lt;br /&gt;                        for (int i = 0; i &lt; 4; i++) res[i] = null;&lt;br /&gt;&lt;br /&gt;                        res[2] = row[2].ToString();&lt;br /&gt;&lt;br /&gt;                        //取得相应表的所有字段&lt;br /&gt;&lt;br /&gt;                        DataTable dtColumns = dc.GetSchema("Columns", res);&lt;br /&gt;&lt;br /&gt;                        foreach (System.Data.DataRow rowColumns in dtColumns.Rows)&lt;br /&gt;&lt;br /&gt;                        {&lt;br /&gt;&lt;br /&gt;                            listBox1.Items.Add(rowColumns[3].ToString());&lt;br /&gt;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        dtColumns.WriteXml(row[2].ToString() + "b.xml");&lt;br /&gt;&lt;br /&gt;                        listBox1.Items.Add("============================");&lt;br /&gt;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            catch (Exception ex)&lt;br /&gt;&lt;br /&gt;            {&lt;br /&gt;&lt;br /&gt;                comMsgBox.showError(ex.Message);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            finally&lt;br /&gt;&lt;br /&gt;            {&lt;br /&gt;&lt;br /&gt;                db.Close();&lt;br /&gt;&lt;br /&gt;            }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-2763639386780159798?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/2763639386780159798/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=2763639386780159798' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2763639386780159798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2763639386780159798'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/net-20.html' title='.NET 2.0下读取数据库中的全部表以及表内的字段名'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-4527095776433112514</id><published>2008-10-21T05:12:00.002-07:00</published><updated>2008-10-21T05:13:31.438-07:00</updated><title type='text'>C#通过ADO.NET建表点实现方法</title><content type='html'>新建表：&lt;br /&gt;        create table [表名]&lt;br /&gt;        (&lt;br /&gt;        [自动编号字段] int IDENTITY (1,1) PRIMARY KEY ,&lt;br /&gt;        [字段1] nVarChar(50) default '默认值' null ,&lt;br /&gt;        [字段2] ntext null ,&lt;br /&gt;        [字段3] datetime,&lt;br /&gt;        [字段4] money null ,&lt;br /&gt;        [字段5] int default 0,&lt;br /&gt;        [字段6] Decimal (12,4) default 0,&lt;br /&gt;        [字段7] image null ,&lt;br /&gt;        )&lt;br /&gt;&lt;br /&gt;        删除表：&lt;br /&gt;        Drop table [表名]&lt;br /&gt;&lt;br /&gt;        插入数据：&lt;br /&gt;        INSERT INTO [表名] (字段1,字段2) VALUES (100,'abc.NET')&lt;br /&gt;&lt;br /&gt;        删除数据：&lt;br /&gt;        DELETE FROM [表名] WHERE [字段名]&gt;100&lt;br /&gt;&lt;br /&gt;        更新数据：&lt;br /&gt;        UPDATE [表名] SET [字段1] = 200,[字段2] = 'abc.NET' WHERE [字段三] = 'HAIWA'&lt;br /&gt;&lt;br /&gt;        新增字段：&lt;br /&gt;        ALTER TABLE [表名] ADD [字段名] NVARCHAR (50) NULL&lt;br /&gt;&lt;br /&gt;        删除字段：&lt;br /&gt;        ALTER TABLE [表名] DROP COLUMN [字段名]&lt;br /&gt;&lt;br /&gt;        修改字段：&lt;br /&gt;        ALTER TABLE [表名] ALTER COLUMN [字段名] NVARCHAR (50) NULL&lt;br /&gt;&lt;br /&gt;        重命名表：(Access 重命名表，请参考文章：在Access数据库中重命名表)&lt;br /&gt;        sp_rename '表名', '新表名', 'OBJECT'&lt;br /&gt;&lt;br /&gt;        新建约束：&lt;br /&gt;        ALTER TABLE [表名] ADD CONSTRAINT 约束名 CHECK ([约束字段] &lt;= '2000-1-1')&lt;br /&gt;&lt;br /&gt;        删除约束：&lt;br /&gt;        ALTER TABLE [表名] DROP CONSTRAINT 约束名&lt;br /&gt;&lt;br /&gt;        新建默认值&lt;br /&gt;        ALTER TABLE [表名] ADD CONSTRAINT 默认值名 DEFAULT 'abc.NET' FOR [字段名]&lt;br /&gt;&lt;br /&gt;        删除默认值&lt;br /&gt;        ALTER TABLE [表名] DROP CONSTRAINT 默认值名&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-4527095776433112514?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/4527095776433112514/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=4527095776433112514' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4527095776433112514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4527095776433112514'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/cadonet.html' title='C#通过ADO.NET建表点实现方法'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-8194969576202505840</id><published>2008-10-21T05:12:00.001-07:00</published><updated>2008-10-21T05:12:53.551-07:00</updated><title type='text'>汉字转换为拼音的函数收藏</title><content type='html'>using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Text.RegularExpressions;&lt;br /&gt;&lt;br /&gt;namespace SplitWord&lt;br /&gt;{&lt;br /&gt;    /**//**//**//// 用C#实现汉字转化为拼音 &lt;br /&gt;    /// 实现的原理就是先将汉字转化成为内码，然后通过内码和拼音的对照来查找。 &lt;br /&gt;    public class chs2py&lt;br /&gt;  {&lt;br /&gt;        /**//**//**//**/&lt;br /&gt;        /**//**//**//**/&lt;br /&gt;        /**//**//**//**/&lt;br /&gt;        /**//**//**//// &lt;summary&gt; &lt;br /&gt;        ///将汉字转换成为拼音 &lt;br /&gt;        ///作者：&lt;br /&gt;        ///完成于：&lt;br /&gt;        /// &lt;/summary&gt; &lt;br /&gt;        static Regex MyRegex = new Regex("^[一-龥]$");        //汉字的正则表达式.eg: if(MyRegex.IsMatch(chrstr.ToString()))&lt;br /&gt;        private static int[] pyvalue = new int[]{-20319,-20317,-20304,-20295,-20292,-20283,-20265,-20257,-20242,-20230,-20051,-20036,-20032,-20026, &lt;br /&gt;                                        -20002,-19990,-19986,-19982,-19976,-19805,-19784,-19775,-19774,-19763,-19756,-19751,-19746,-19741,-19739,-19728, &lt;br /&gt;                                        -19725,-19715,-19540,-19531,-19525,-19515,-19500,-19484,-19479,-19467,-19289,-19288,-19281,-19275,-19270,-19263, &lt;br /&gt;                                        -19261,-19249,-19243,-19242,-19238,-19235,-19227,-19224,-19218,-19212,-19038,-19023,-19018,-19006,-19003,-18996, &lt;br /&gt;                                        -18977,-18961,-18952,-18783,-18774,-18773,-18763,-18756,-18741,-18735,-18731,-18722,-18710,-18697,-18696,-18526, &lt;br /&gt;                                        -18518,-18501,-18490,-18478,-18463,-18448,-18447,-18446,-18239,-18237,-18231,-18220,-18211,-18201,-18184,-18183, &lt;br /&gt;                                        -18181,-18012,-17997,-17988,-17970,-17964,-17961,-17950,-17947,-17931,-17928,-17922,-17759,-17752,-17733,-17730, &lt;br /&gt;                                        -17721,-17703,-17701,-17697,-17692,-17683,-17676,-17496,-17487,-17482,-17468,-17454,-17433,-17427,-17417,-17202, &lt;br /&gt;                                        -17185,-16983,-16970,-16942,-16915,-16733,-16708,-16706,-16689,-16664,-16657,-16647,-16474,-16470,-16465,-16459, &lt;br /&gt;                                        -16452,-16448,-16433,-16429,-16427,-16423,-16419,-16412,-16407,-16403,-16401,-16393,-16220,-16216,-16212,-16205, &lt;br /&gt;                                        -16202,-16187,-16180,-16171,-16169,-16158,-16155,-15959,-15958,-15944,-15933,-15920,-15915,-15903,-15889,-15878, &lt;br /&gt;                                        -15707,-15701,-15681,-15667,-15661,-15659,-15652,-15640,-15631,-15625,-15454,-15448,-15436,-15435,-15419,-15416, &lt;br /&gt;                                        -15408,-15394,-15385,-15377,-15375,-15369,-15363,-15362,-15183,-15180,-15165,-15158,-15153,-15150,-15149,-15144, &lt;br /&gt;                                        -15143,-15141,-15140,-15139,-15128,-15121,-15119,-15117,-15110,-15109,-14941,-14937,-14933,-14930,-14929,-14928, &lt;br /&gt;                                        -14926,-14922,-14921,-14914,-14908,-14902,-14894,-14889,-14882,-14873,-14871,-14857,-14678,-14674,-14670,-14668, &lt;br /&gt;                                        -14663,-14654,-14645,-14630,-14594,-14429,-14407,-14399,-14384,-14379,-14368,-14355,-14353,-14345,-14170,-14159, &lt;br /&gt;                                        -14151,-14149,-14145,-14140,-14137,-14135,-14125,-14123,-14122,-14112,-14109,-14099,-14097,-14094,-14092,-14090, &lt;br /&gt;                                        -14087,-14083,-13917,-13914,-13910,-13907,-13906,-13905,-13896,-13894,-13878,-13870,-13859,-13847,-13831,-13658, &lt;br /&gt;                                        -13611,-13601,-13406,-13404,-13400,-13398,-13395,-13391,-13387,-13383,-13367,-13359,-13356,-13343,-13340,-13329, &lt;br /&gt;                                        -13326,-13318,-13147,-13138,-13120,-13107,-13096,-13095,-13091,-13076,-13068,-13063,-13060,-12888,-12875,-12871, &lt;br /&gt;                                        -12860,-12858,-12852,-12849,-12838,-12831,-12829,-12812,-12802,-12607,-12597,-12594,-12585,-12556,-12359,-12346, &lt;br /&gt;                                        -12320,-12300,-12120,-12099,-12089,-12074,-12067,-12058,-12039,-11867,-11861,-11847,-11831,-11798,-11781,-11604, &lt;br /&gt;                                        -11589,-11536,-11358,-11340,-11339,-11324,-11303,-11097,-11077,-11067,-11055,-11052,-11045,-11041,-11038,-11024, &lt;br /&gt;                                        -11020,-11019,-11018,-11014,-10838,-10832,-10815,-10800,-10790,-10780,-10764,-10587,-10544,-10533,-10519,-10331, &lt;br /&gt;                                        -10329,-10328,-10322,-10315,-10309,-10307,-10296,-10281,-10274,-10270,-10262,-10260,-10256,-10254};&lt;br /&gt;        private static string[] pystr = new string[]{"a","ai","an","ang","ao","ba","bai","ban","bang","bao","bei","ben","beng","bi","bian","biao", &lt;br /&gt;                                      "bie","bin","bing","bo","bu","ca","cai","can","cang","cao","ce","ceng","cha","chai","chan","chang","chao","che","chen", &lt;br /&gt;                                      "cheng","chi","chong","chou","chu","chuai","chuan","chuang","chui","chun","chuo","ci","cong","cou","cu","cuan","cui", &lt;br /&gt;                                      "cun","cuo","da","dai","dan","dang","dao","de","deng","di","dian","diao","die","ding","diu","dong","dou","du","duan", &lt;br /&gt;                                      "dui","dun","duo","e","en","er","fa","fan","fang","fei","fen","feng","fo","fou","fu","ga","gai","gan","gang","gao", &lt;br /&gt;                                      "ge","gei","gen","geng","gong","gou","gu","gua","guai","guan","guang","gui","gun","guo","ha","hai","han","hang", &lt;br /&gt;                                      "hao","he","hei","hen","heng","hong","hou","hu","hua","huai","huan","huang","hui","hun","huo","ji","jia","jian", &lt;br /&gt;                                      "jiang","jiao","jie","jin","jing","jiong","jiu","ju","juan","jue","jun","ka","kai","kan","kang","kao","ke","ken", &lt;br /&gt;                                      "keng","kong","kou","ku","kua","kuai","kuan","kuang","kui","kun","kuo","la","lai","lan","lang","lao","le","lei", &lt;br /&gt;                                      "leng","li","lia","lian","liang","liao","lie","lin","ling","liu","long","lou","lu","lv","luan","lue","lun","luo", &lt;br /&gt;                                      "ma","mai","man","mang","mao","me","mei","men","meng","mi","mian","miao","mie","min","ming","miu","mo","mou","mu", &lt;br /&gt;                                      "na","nai","nan","nang","nao","ne","nei","nen","neng","ni","nian","niang","niao","nie","nin","ning","niu","nong", &lt;br /&gt;                                      "nu","nv","nuan","nue","nuo","o","ou","pa","pai","pan","pang","pao","pei","pen","peng","pi","pian","piao","pie", &lt;br /&gt;                                      "pin","ping","po","pu","qi","qia","qian","qiang","qiao","qie","qin","qing","qiong","qiu","qu","quan","que","qun", &lt;br /&gt;                                      "ran","rang","rao","re","ren","reng","ri","rong","rou","ru","ruan","rui","run","ruo","sa","sai","san","sang", &lt;br /&gt;                                      "sao","se","sen","seng","sha","shai","shan","shang","shao","she","shen","sheng","shi","shou","shu","shua", &lt;br /&gt;                                      "shuai","shuan","shuang","shui","shun","shuo","si","song","sou","su","suan","sui","sun","suo","ta","tai", &lt;br /&gt;                                      "tan","tang","tao","te","teng","ti","tian","tiao","tie","ting","tong","tou","tu","tuan","tui","tun","tuo", &lt;br /&gt;                                      "wa","wai","wan","wang","wei","wen","weng","wo","wu","xi","xia","xian","xiang","xiao","xie","xin","xing", &lt;br /&gt;                                      "xiong","xiu","xu","xuan","xue","xun","ya","yan","yang","yao","ye","yi","yin","ying","yo","yong","you", &lt;br /&gt;                                      "yu","yuan","yue","yun","za","zai","zan","zang","zao","ze","zei","zen","zeng","zha","zhai","zhan","zhang", &lt;br /&gt;                                      "zhao","zhe","zhen","zheng","zhi","zhong","zhou","zhu","zhua","zhuai","zhuan","zhuang","zhui","zhun","zhuo", &lt;br /&gt;                                      "zi","zong","zou","zu","zuan","zui","zun","zuo"};&lt;br /&gt;        /**//**//**//// &lt;summary&gt;&lt;br /&gt;        /// 转化汉字的全部拼音&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="chrstr"&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;        public static string Convert(string chrstr)&lt;br /&gt;      {&lt;br /&gt;            Regex MyRegex = new Regex("^[一-龥]$");&lt;br /&gt;            byte[] array = new byte[2];&lt;br /&gt;            string returnstr = "";&lt;br /&gt;            int chrasc = 0;&lt;br /&gt;            int i1 = 0;&lt;br /&gt;            int i2 = 0;&lt;br /&gt;            char[] nowchar = chrstr.ToCharArray();&lt;br /&gt;            for (int j = 0; j &lt; nowchar.Length; j++)&lt;br /&gt;          {&lt;br /&gt;                if (MyRegex.IsMatch(nowchar[j].ToString()))&lt;br /&gt;              {&lt;br /&gt;                    array = System.Text.Encoding.Default.GetBytes(nowchar[j].ToString());&lt;br /&gt;                    i1 = (short)(array[0]);&lt;br /&gt;                    i2 = (short)(array[1]);&lt;br /&gt;                    chrasc = i1 * 256 + i2 - 65536;&lt;br /&gt;                    if (chrasc &gt; 0 &amp;&amp; chrasc &lt; 160)&lt;br /&gt;                  {&lt;br /&gt;                        returnstr += nowchar[j];&lt;br /&gt;                    }&lt;br /&gt;                    else&lt;br /&gt;                  {&lt;br /&gt;                        for (int i = (pyvalue.Length - 1); i &gt;= 0; i--)&lt;br /&gt;                      {&lt;br /&gt;                            if (pyvalue[i] &lt;= chrasc)&lt;br /&gt;                          {&lt;br /&gt;                                returnstr += pystr[i];&lt;br /&gt;                                break;&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;              {&lt;br /&gt;                    returnstr += nowchar[j].ToString();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            return returnstr;&lt;br /&gt;        }&lt;br /&gt;        //ChineseToPY&lt;br /&gt;        /**//**//**//// &lt;summary&gt;&lt;br /&gt;        /// 只转换汉字首字母&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="strText"&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;        public static string GetChineseSpell(string strText)&lt;br /&gt;      {&lt;br /&gt;            int len = strText.Length;&lt;br /&gt;            string myStr = "";&lt;br /&gt;            for (int i = 0; i &lt; len; i++)&lt;br /&gt;          {&lt;br /&gt;                myStr += getSpell(strText.Substring(i, 1));&lt;br /&gt;            }&lt;br /&gt;            return myStr;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        public static string getSpell(string cnChar)&lt;br /&gt;      {&lt;br /&gt;            byte[] arrCN = Encoding.Default.GetBytes(cnChar);&lt;br /&gt;            if (arrCN.Length &gt; 1)&lt;br /&gt;          {&lt;br /&gt;                int area = (short)arrCN[0];&lt;br /&gt;                int pos = (short)arrCN[1];&lt;br /&gt;                int code = (area &lt;&lt; 8) + pos;&lt;br /&gt;                int[] areacode ={ 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 48119, 48119, 49062, 49324, 49896, 50371, 50614, 50622, 50906, 51387, 51446, 52218, 52698, 52698, 52698, 52980, 53689, 54481 };&lt;br /&gt;                for (int i = 0; i &lt; 26; i++)&lt;br /&gt;              {&lt;br /&gt;                    int max = 55290;&lt;br /&gt;                    if (i != 25) max = areacode[i + 1];&lt;br /&gt;                    if (areacode[i] &lt;= code &amp;&amp; code &lt; max)&lt;br /&gt;                  {&lt;br /&gt;                        return Encoding.Default.GetString(new byte[]{ (byte)(65 + i) });&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                return "*";&lt;br /&gt;            }&lt;br /&gt;            else return cnChar;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-8194969576202505840?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/8194969576202505840/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=8194969576202505840' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8194969576202505840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8194969576202505840'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/blog-post_3489.html' title='汉字转换为拼音的函数收藏'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-2672947167060779703</id><published>2008-10-21T05:11:00.002-07:00</published><updated>2008-10-21T05:12:17.308-07:00</updated><title type='text'>关于.NET使用自定义XML做参数配置文件 </title><content type='html'>WEB开发,尤其是大型项目的开发,其中不乏大名鼎鼎的CMS,XXMS,呵呵.&lt;br /&gt;他们都有个共同的特点,那就是网站配置参数N多.&lt;br /&gt;怎么设置好众多的参数配置,是在项目初期需要规划的一个重点.&lt;br /&gt;总结这几年做WEB开发的一点点积累.个人认为以下方案是比较合理化的,对于以后参数的增加修改带来的一些问题可以得到一定的控制.同样适合WINFORM哈.&lt;br /&gt;&lt;br /&gt;运行环境: .NET 2.0&lt;br /&gt;在项目设计过程中,采用模块化设计,所以参数也得独立开,每个模块的参数配置单独存放与一个单独的XML文件中.&lt;br /&gt;原理:利用XML的序列化与反序列化配合实体读取和保存参数设置到XML文件中.&lt;br /&gt;先看XML结构&lt;br /&gt;SystemInfo.xml&lt;br /&gt;&lt;?xml version="1.0"?&gt;&lt;br /&gt;&lt;SystemInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;&lt;br /&gt;  &lt;SiteTitle&gt;&lt;br /&gt;    &lt;Title&gt;网站标题&lt;/Title&gt;&lt;br /&gt;    &lt;Name&gt;SiteTitle&lt;/Name&gt;&lt;br /&gt;    &lt;Explain&gt;设置网站的标题&lt;/Explain&gt;&lt;br /&gt;    &lt;Mode&gt;Text&lt;/Mode&gt;&lt;br /&gt;    &lt;Value&gt;博客园&lt;/Value&gt;&lt;br /&gt;    &lt;Pattern&gt;^.*$&lt;/Pattern&gt;&lt;br /&gt;    &lt;Required&gt;False&lt;/Required&gt;&lt;br /&gt;  &lt;/SiteTitle&gt;&lt;br /&gt;  &lt;SiteUrl&gt;&lt;br /&gt;    &lt;Title&gt;网站地址&lt;/Title&gt;&lt;br /&gt;    &lt;Name&gt;SiteUrl&lt;/Name&gt;&lt;br /&gt;    &lt;Explain&gt;设置网站的地址&lt;/Explain&gt;&lt;br /&gt;    &lt;Mode&gt;Text&lt;/Mode&gt;&lt;br /&gt;    &lt;Value&gt;http://www.cnblogs.com&lt;/Value&gt;&lt;br /&gt;    &lt;Pattern&gt;^.*$&lt;/Pattern&gt;&lt;br /&gt;    &lt;Required&gt;False&lt;/Required&gt;&lt;br /&gt;  &lt;/SiteUrl&gt;&lt;br /&gt;&lt;/SystemInfo&gt;&lt;br /&gt;配置文件子节点结构&lt;br /&gt;    /**/''' &lt;summary&gt;&lt;br /&gt;    ''' 配置文件结构&lt;br /&gt;     ''' &lt;/summary&gt;&lt;br /&gt;    ''' &lt;remarks&gt;&lt;/remarks&gt;&lt;br /&gt;&lt;br /&gt;    &lt;Serializable()&gt; _&lt;br /&gt;    Public Class ItemClass Item&lt;br /&gt;&lt;br /&gt;        Private _ColsDisplay As UInt16&lt;br /&gt;        Private _isRequired As Boolean&lt;br /&gt;        Private _name As String&lt;br /&gt;        Private _title As String&lt;br /&gt;        Private _explain As String&lt;br /&gt;        Private _mode As String&lt;br /&gt;        Private _value As String&lt;br /&gt;        Private _pattern As String&lt;br /&gt;        Private _range As String&lt;br /&gt;        Private _rangeHint As String&lt;br /&gt;&lt;br /&gt;        /**/''' &lt;summary&gt;&lt;br /&gt;        ''' 节点名称&lt;br /&gt;        ''' &lt;/summary&gt;&lt;br /&gt;        Public Property Name()Property Name() As String&lt;br /&gt;            Get&lt;br /&gt;                Return Me._name&lt;br /&gt;            End Get&lt;br /&gt;            Set(ByVal value As String)&lt;br /&gt;                Me._name = value&lt;br /&gt;            End Set&lt;br /&gt;        End Property&lt;br /&gt;&lt;br /&gt;        /**/''' &lt;summary&gt;&lt;br /&gt;        ''' 节点标题&lt;br /&gt;        ''' &lt;/summary&gt;&lt;br /&gt;        Public Property Title()Property Title() As String&lt;br /&gt;            Get&lt;br /&gt;                Return Me._title&lt;br /&gt;            End Get&lt;br /&gt;            Set(ByVal value As String)&lt;br /&gt;                Me._title = value&lt;br /&gt;            End Set&lt;br /&gt;        End Property&lt;br /&gt;&lt;br /&gt;        /**/''' &lt;summary&gt;&lt;br /&gt;        ''' 节点说明&lt;br /&gt;        ''' &lt;/summary&gt;&lt;br /&gt;        Public Property Explain()Property Explain() As String&lt;br /&gt;            Get&lt;br /&gt;                Return Me._explain&lt;br /&gt;            End Get&lt;br /&gt;            Set(ByVal value As String)&lt;br /&gt;                Me._explain = value&lt;br /&gt;            End Set&lt;br /&gt;        End Property&lt;br /&gt;&lt;br /&gt;        /**/''' &lt;summary&gt;&lt;br /&gt;        ''' 节点值类型&lt;br /&gt;        ''' &lt;/summary&gt;&lt;br /&gt;        Public Property Mode()Property Mode() As String&lt;br /&gt;            Get&lt;br /&gt;                Return Me._mode&lt;br /&gt;            End Get&lt;br /&gt;            Set(ByVal value As String)&lt;br /&gt;                Me._mode = value&lt;br /&gt;            End Set&lt;br /&gt;        End Property&lt;br /&gt;&lt;br /&gt;        /**/''' &lt;summary&gt;&lt;br /&gt;        ''' 节点值&lt;br /&gt;        ''' &lt;/summary&gt;&lt;br /&gt;        Public Property Value()Property Value() As String&lt;br /&gt;            Get&lt;br /&gt;                Return Me._value&lt;br /&gt;            End Get&lt;br /&gt;            Set(ByVal value As String)&lt;br /&gt;                Me._value = value&lt;br /&gt;            End Set&lt;br /&gt;        End Property&lt;br /&gt;&lt;br /&gt;        /**/''' &lt;summary&gt;&lt;br /&gt;        ''' 限制格式&lt;br /&gt;        ''' &lt;/summary&gt;&lt;br /&gt;        Public Property Pattern()Property Pattern() As String&lt;br /&gt;            Get&lt;br /&gt;                Return Me._pattern&lt;br /&gt;            End Get&lt;br /&gt;            Set(ByVal value As String)&lt;br /&gt;                Me._pattern = value&lt;br /&gt;            End Set&lt;br /&gt;        End Property&lt;br /&gt;&lt;br /&gt;        /**/''' &lt;summary&gt;&lt;br /&gt;        ''' 选择范围&lt;br /&gt;        ''' &lt;/summary&gt;&lt;br /&gt;        Public Property Range()Property Range() As String&lt;br /&gt;            Get&lt;br /&gt;                Return Me._range&lt;br /&gt;            End Get&lt;br /&gt;            Set(ByVal value As String)&lt;br /&gt;                Me._range = value&lt;br /&gt;            End Set&lt;br /&gt;        End Property&lt;br /&gt;&lt;br /&gt;        /**/''' &lt;summary&gt;&lt;br /&gt;        ''' 选择范围标题&lt;br /&gt;        ''' &lt;/summary&gt;&lt;br /&gt;        Public Property RangeHint()Property RangeHint() As String&lt;br /&gt;            Get&lt;br /&gt;                Return Me._rangeHint&lt;br /&gt;            End Get&lt;br /&gt;            Set(ByVal value As String)&lt;br /&gt;                Me._rangeHint = value&lt;br /&gt;            End Set&lt;br /&gt;        End Property&lt;br /&gt;&lt;br /&gt;        /**/''' &lt;summary&gt;&lt;br /&gt;        ''' 是否必需&lt;br /&gt;        ''' &lt;/summary&gt;&lt;br /&gt;        Public Property IsRequired()Property IsRequired() As Boolean&lt;br /&gt;            Get&lt;br /&gt;                Return Me._isRequired&lt;br /&gt;            End Get&lt;br /&gt;            Set(ByVal value As Boolean)&lt;br /&gt;                Me._isRequired = value&lt;br /&gt;            End Set&lt;br /&gt;        End Property&lt;br /&gt;&lt;br /&gt;        /**/''' &lt;summary&gt;&lt;br /&gt;        ''' 列显示&lt;br /&gt;        ''' &lt;/summary&gt;&lt;br /&gt;        Public Property ColsDisplay()Property ColsDisplay() As UInt16&lt;br /&gt;            Get&lt;br /&gt;                Return Me._ColsDisplay&lt;br /&gt;            End Get&lt;br /&gt;            Set(ByVal value As UInt16)&lt;br /&gt;                Me._ColsDisplay = value&lt;br /&gt;            End Set&lt;br /&gt;        End Property&lt;br /&gt;&lt;br /&gt;    End Class&lt;br /&gt;自定义配置文件实体&lt;br /&gt;    /**/''' &lt;summary&gt;&lt;br /&gt;    ''' 自定义配置文件实体&lt;br /&gt;    ''' &lt;/summary&gt;&lt;br /&gt;    ''' &lt;remarks&gt;&lt;/remarks&gt;&lt;br /&gt;&lt;br /&gt;    &lt;Serializable()&gt; _&lt;br /&gt;Public Class ConfigsClass Configs&lt;br /&gt;&lt;br /&gt;        Private _SiteTitle As Item&lt;br /&gt;        Private _SiteUrl As Item&lt;br /&gt;&lt;br /&gt;        /**/''' &lt;summary&gt;&lt;br /&gt;        ''' 网站标题&lt;br /&gt;        ''' &lt;/summary&gt;&lt;br /&gt;        Public Property SiteTitle()Property SiteTitle() As Item&lt;br /&gt;            Get&lt;br /&gt;                Return Me._SiteTitle&lt;br /&gt;            End Get&lt;br /&gt;            Set(ByVal value As Item)&lt;br /&gt;                Me._SiteTitle = value&lt;br /&gt;            End Set&lt;br /&gt;        End Property&lt;br /&gt;&lt;br /&gt;        /**/''' &lt;summary&gt;&lt;br /&gt;        ''' 网站地址&lt;br /&gt;        ''' &lt;/summary&gt;&lt;br /&gt;        Public Property SiteUrl()Property SiteUrl() As Item&lt;br /&gt;            Get&lt;br /&gt;                Return Me._SiteUrl&lt;br /&gt;            End Get&lt;br /&gt;            Set(ByVal value As Item)&lt;br /&gt;                Me._SiteUrl = value&lt;br /&gt;            End Set&lt;br /&gt;        End Property&lt;br /&gt;&lt;br /&gt;End Class&lt;br /&gt;以下需引用&lt;br /&gt;Imports System.Xml&lt;br /&gt;Imports System.Xml.Serialization&lt;br /&gt;&lt;br /&gt;序列化XML文件的读取&lt;br /&gt;/**/''' &lt;summary&gt;&lt;br /&gt;''' 读取序列化XML配置文件内容&lt;br /&gt;''' &lt;/summary&gt;&lt;br /&gt;''' &lt;param name="Types"&gt;类型&lt;/param&gt;&lt;br /&gt;''' &lt;param name="FilePath"&gt;配置文件地址,绝对地址&lt;/param&gt;&lt;br /&gt;''' &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;''' &lt;remarks&gt;&lt;/remarks&gt;&lt;br /&gt;Public Shared Function Deserialize()Function Deserialize(ByVal Types As Type, ByVal FilePath As String) As Object&lt;br /&gt;Dim Fs As FileStream = Nothing&lt;br /&gt;Dim Xmls As Object = String.Empty&lt;br /&gt;Fs = New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)&lt;br /&gt;Dim Xms As XmlSerializer = New XmlSerializer(Types)&lt;br /&gt;Xmls = Xms.Deserialize(Fs)&lt;br /&gt;Fs.Flush()&lt;br /&gt;Fs.Close()&lt;br /&gt;Return Xmls&lt;br /&gt;End Function&lt;br /&gt;XML文件保存&lt;br /&gt;/**/''' &lt;summary&gt;&lt;br /&gt;''' 保存序列化XML配置文件内容&lt;br /&gt;''' &lt;/summary&gt;&lt;br /&gt;''' &lt;param name="Types"&gt;类型&lt;/param&gt;&lt;br /&gt;''' &lt;param name="Info"&gt;实体&lt;/param&gt;&lt;br /&gt;''' &lt;param name="FilePath"&gt;配置文件地址,绝对地址&lt;/param&gt;&lt;br /&gt;''' &lt;remarks&gt;&lt;/remarks&gt;&lt;br /&gt;Public Shared Sub SaveConfig()Sub SaveConfig(ByVal Types As Type, ByVal Info As Configs, ByVal FilePath As String)&lt;br /&gt;   Dim Fs As Stream = New FileStream(FilePath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)&lt;br /&gt;   Dim Xms As XmlSerializer = New XmlSerializer(Types)&lt;br /&gt;   Xms.Serialize(Fs, Info)&lt;br /&gt;   Fs.Flush()&lt;br /&gt;   Fs.Close()&lt;br /&gt;End Sub&lt;br /&gt;调用参数&lt;br /&gt;&lt;br /&gt;  Dim Info As Configs = New Configs&lt;br /&gt;  Info = Deserialize(GetType (Configs), "SystemInfo.Xml")&lt;br /&gt;  Response.write(Info.SiteTitle.Title)&lt;br /&gt;  Response.write(Info.SiteTitle.Value)&lt;br /&gt;&lt;br /&gt;以上为全部代码&lt;br /&gt;&lt;br /&gt;下面做简单说明&lt;br /&gt;以前自己做项目的时候.只是运用到简单的序列化与反序列化,同样也是在CNBLOG先辈们的手迹中得到的解释.&lt;br /&gt;在运用一段时间后发现很繁琐. 因为我只用到了一层结构.&lt;br /&gt;&lt;?xml version="1.0"?&gt;&lt;br /&gt;&lt;SysInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;&lt;br /&gt;  &lt;SiteTitle&gt;博客园&lt;/SiteTitle&gt;&lt;br /&gt;&lt;/SysInfo&gt;&lt;br /&gt;虽然这样很简单明了.可是在实际开发中,不免存在一些问题,比如:&lt;br /&gt;1、输入值的类型判断&lt;br /&gt;2、输入值是否允许空&lt;br /&gt;3、输入值是否符合指定类型&lt;br /&gt;4、在做UI的时候还需要找到对应的控件，再写相关的说明文字。&lt;br /&gt;等等。。很繁琐。&lt;br /&gt;&lt;br /&gt;而新的代码。解决了这些问题，在使用中，只需要调用相应节点的值就OK了。在对于内容解释及类型控制上尤其方便。再也不需要因为更改一个参数的控制，而去在N个HTML代码中定位你的配置参数控件，然后再XXXXX。直接使用XML文件编辑器修改XML文件就OK啦。&lt;br /&gt;&lt;br /&gt;小弟第一次发表，欢迎大家批评指正！ &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-2672947167060779703?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/2672947167060779703/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=2672947167060779703' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2672947167060779703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2672947167060779703'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/netxml.html' title='关于.NET使用自定义XML做参数配置文件 '/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-7419464193384785774</id><published>2008-10-21T05:11:00.001-07:00</published><updated>2008-10-21T05:11:42.430-07:00</updated><title type='text'>一种简便实效的配置文件读写方法</title><content type='html'>主要做法：&lt;br /&gt;&lt;br /&gt;第一步，将配置信息做一个简单的类。&lt;br /&gt;&lt;br /&gt;要点：因为要用到序列化，而且是用XmlSerializer来序列化，所以要存到文件的变量信息都要声明为Public,要序列化的类用&lt;Serializable()&gt;修饰。&lt;br /&gt;&lt;br /&gt;示例：一个连接数据库的配置信息&lt;br /&gt;&lt;br /&gt;'配置信息&lt;br /&gt;&lt;br /&gt;&lt;Serializable()&gt; Public Class Item&lt;br /&gt;&lt;br /&gt;    '初始默认值&lt;br /&gt;&lt;br /&gt;    Public ID As Integer = 0&lt;br /&gt;&lt;br /&gt;    Public Server As String = "(Local)"&lt;br /&gt;&lt;br /&gt;    Public Database As String = "NorthWind"&lt;br /&gt;&lt;br /&gt;    Public Tusted As Boolean = True&lt;br /&gt;&lt;br /&gt;    Public User As String = ""&lt;br /&gt;&lt;br /&gt;    Public Password As String = ""&lt;br /&gt;&lt;br /&gt;End Class&lt;br /&gt;&lt;br /&gt;第二步：配置处理的类。&lt;br /&gt;&lt;br /&gt;说明：这个类是通用的。用到别的配置，你只需修改上面的配置信息类就可以了。它实现了存档和读取的功能，并转化为配置信息对象，操作起来较为方便。你可以添加内容加密的处理。&lt;br /&gt;&lt;br /&gt;&lt;Serializable()&gt; Public Class Config&lt;br /&gt;&lt;br /&gt;    '默认ConnectionInfo的ID&lt;br /&gt;&lt;br /&gt;    Public ID As Integer&lt;br /&gt;&lt;br /&gt;    '必须是Public,XmlSerializer只对Pulbic变量作用&lt;br /&gt;&lt;br /&gt;    Public Items As Item()&lt;br /&gt;&lt;br /&gt;    Private m_Count As Integer = 0&lt;br /&gt;&lt;br /&gt;    '添加配置信息&lt;br /&gt;&lt;br /&gt;    Public Sub Add(ByVal ConnectionInfo As Item)&lt;br /&gt;&lt;br /&gt;        If ConnectionInfo Is Nothing Then Exit Sub&lt;br /&gt;&lt;br /&gt;        If m_Count &gt; 0 Then&lt;br /&gt;&lt;br /&gt;            If Not Me.ConnectionInfo(ConnectionInfo.ID) Is Nothing Then&lt;br /&gt;&lt;br /&gt;                MsgBox(ID.ToString &amp; "已存在")&lt;br /&gt;&lt;br /&gt;                Exit Sub&lt;br /&gt;&lt;br /&gt;            End If&lt;br /&gt;&lt;br /&gt;        End If&lt;br /&gt;&lt;br /&gt;        ReDim Preserve Me.Items(m_Count)&lt;br /&gt;&lt;br /&gt;        Me.Items(m_Count) = ConnectionInfo&lt;br /&gt;&lt;br /&gt;        m_Count += 1&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    '取指定ID的配置信息&lt;br /&gt;&lt;br /&gt;    Public ReadOnly Property ConnectionInfo(ByVal ID As Integer) As Item&lt;br /&gt;&lt;br /&gt;        Get&lt;br /&gt;&lt;br /&gt;            Dim mItem As Item&lt;br /&gt;&lt;br /&gt;            Dim i As Integer&lt;br /&gt;&lt;br /&gt;            For i = 0 To m_Count - 1&lt;br /&gt;&lt;br /&gt;                If Me.Items(i).ID = ID Then&lt;br /&gt;&lt;br /&gt;                    mItem = Me.Items(ID)&lt;br /&gt;&lt;br /&gt;                    Exit For&lt;br /&gt;&lt;br /&gt;                End If&lt;br /&gt;&lt;br /&gt;            Next&lt;br /&gt;&lt;br /&gt;            Return mItem&lt;br /&gt;&lt;br /&gt;        End Get&lt;br /&gt;&lt;br /&gt;    End Property&lt;br /&gt;&lt;br /&gt;    '序列化并保存到指定文件&lt;br /&gt;&lt;br /&gt;    Public Sub SaveXmlFile(ByVal FileName As String)&lt;br /&gt;&lt;br /&gt;        If Me Is Nothing Then Exit Sub&lt;br /&gt;&lt;br /&gt;        Dim XmlWriter As New System.IO.StreamWriter(FileName, False)&lt;br /&gt;&lt;br /&gt;        XmlWriter.Write(SerializeClass.GetXML(Me))&lt;br /&gt;&lt;br /&gt;        XmlWriter.Close()&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    '从指定文件读取反序列化转为对象&lt;br /&gt;&lt;br /&gt;    Public Function LoadXmlFile(ByVal FileName As String) As Config&lt;br /&gt;&lt;br /&gt;        Dim XmlReader As New System.IO.StreamReader(FileName, System.Text.Encoding.Default)&lt;br /&gt;&lt;br /&gt;        Dim mConfig As Config&lt;br /&gt;&lt;br /&gt;        mConfig = CType(SerializeClass.LoadXML(GetType(Config), XmlReader.ReadToEnd), Config)&lt;br /&gt;&lt;br /&gt;        XmlReader.Close()&lt;br /&gt;&lt;br /&gt;        mConfig.m_Count = mConfig.Items.Length&lt;br /&gt;&lt;br /&gt;        Return mConfig&lt;br /&gt;&lt;br /&gt;    End Function&lt;br /&gt;&lt;br /&gt;End Class&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;就以上两步就可以了，下面这个类是用来序列化用的。&lt;br /&gt;&lt;br /&gt;'这是用XmlSerializer序列化对象的类&lt;br /&gt;&lt;br /&gt;Public Class SerializeClass&lt;br /&gt;&lt;br /&gt;    Public Shared Function GetXML(ByVal mObject As Object) As String&lt;br /&gt;&lt;br /&gt;        Dim oSerializer As New System.Xml.Serialization.XmlSerializer(mObject.GetType)&lt;br /&gt;&lt;br /&gt;        Dim oStringWriter As New System.IO.StringWriter&lt;br /&gt;&lt;br /&gt;        oSerializer.Serialize(oStringWriter, mObject)&lt;br /&gt;&lt;br /&gt;        Return oStringWriter.ToString&lt;br /&gt;&lt;br /&gt;    End Function&lt;br /&gt;&lt;br /&gt;    Public Shared Function LoadXML(ByVal mClass As Type, ByVal XML As String) As Object&lt;br /&gt;&lt;br /&gt;        Dim oSerializer As New System.Xml.Serialization.XmlSerializer(mClass)&lt;br /&gt;&lt;br /&gt;        Dim oStringReader As New System.IO.StringReader(XML)&lt;br /&gt;&lt;br /&gt;        Return oSerializer.Deserialize(oStringReader)&lt;br /&gt;&lt;br /&gt;    End Function&lt;br /&gt;&lt;br /&gt;End Class&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以下是使用方法示例：&lt;br /&gt;&lt;br /&gt;    '测试存配置文件&lt;br /&gt;&lt;br /&gt;    Private Sub TestSaveConfig()&lt;br /&gt;&lt;br /&gt;        Dim mConfig As Config = New Config&lt;br /&gt;&lt;br /&gt;        Dim mItem As Item&lt;br /&gt;&lt;br /&gt;        mItem = New Item&lt;br /&gt;&lt;br /&gt;        mConfig.Add(mItem)&lt;br /&gt;&lt;br /&gt;        mItem = New Item&lt;br /&gt;&lt;br /&gt;        With mItem&lt;br /&gt;&lt;br /&gt;            .ID = 1&lt;br /&gt;&lt;br /&gt;            .User = "Master"&lt;br /&gt;&lt;br /&gt;            .Password = "123456"&lt;br /&gt;&lt;br /&gt;            .Tusted = False&lt;br /&gt;&lt;br /&gt;        End With&lt;br /&gt;&lt;br /&gt;        mConfig.Add(mItem)&lt;br /&gt;&lt;br /&gt;        mConfig.SaveXmlFile(Application.StartupPath &amp; "\Config.xml")&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;    '测试读配置文件&lt;br /&gt;&lt;br /&gt;    Private Sub TestLoadConfig()&lt;br /&gt;&lt;br /&gt;        Dim mConfig As Config = New Config&lt;br /&gt;&lt;br /&gt;        mConfig = mConfig.LoadXmlFile(Application.StartupPath &amp; "\Config.xml")&lt;br /&gt;&lt;br /&gt;        '读取默认值的用户名&lt;br /&gt;&lt;br /&gt;        MsgBox(mConfig.Items(mConfig.ID).User)&lt;br /&gt;&lt;br /&gt;        '不妨修改一下配置&lt;br /&gt;&lt;br /&gt;        mConfig.ID = 1&lt;br /&gt;&lt;br /&gt;        mConfig.ConnectionInfo(0).Server = "Server"&lt;br /&gt;&lt;br /&gt;        mConfig.ConnectionInfo(1).Database = "Master"&lt;br /&gt;&lt;br /&gt;        '再存盘&lt;br /&gt;&lt;br /&gt;        mConfig.SaveXmlFile(Application.StartupPath &amp; "\Config.xml")&lt;br /&gt;&lt;br /&gt;    End Sub&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-7419464193384785774?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/7419464193384785774/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=7419464193384785774' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/7419464193384785774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/7419464193384785774'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/blog-post_21.html' title='一种简便实效的配置文件读写方法'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-4826172742943578101</id><published>2008-10-21T05:10:00.002-07:00</published><updated>2008-10-21T05:11:18.144-07:00</updated><title type='text'>MS SQL数据类型及长度限制</title><content type='html'>可以定义用户定义的数据类型，其是系统提供的数据类型的别名。有关用户定义的数据类型的更多信息，请参见 sp_addtype 和创建用户定义的数据类型。 &lt;br /&gt;　　当两个具有不同数据类型、排序规则、精度、小数位数或长度的表达式通过运算符进行组合时：  &lt;br /&gt;通过将数据类型的优先顺序规则应用到输入表达式的数据类型来确定所得值的数据类型。有关更多信息，请参见数据类型的优先顺序。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　如果结果数据类型为 char、varchar、text、nchar、nvarchar 或 ntext，则结果值的排序规则由排序规则的优先顺序规则决定。有关更多信息，请参见排序规则的优先顺序。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　结果的精度、小数位数及长度取决于输入表达式的精度、小数位数及长度。有关更多信息，请参见精度、小数位数和长度。  &lt;br /&gt;　　SQL Server 为 SQL-92 兼容性提供了数据类型同义词。有关更多信息，请参见数据类型同义词。 &lt;br /&gt;&lt;br /&gt;精确数字&lt;br /&gt;&lt;br /&gt;整数 &lt;br /&gt;&lt;br /&gt;bigint   从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据（所有数字）。 &lt;br /&gt;&lt;br /&gt;int   从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据（所有数字）。 &lt;br /&gt;&lt;br /&gt;smallint   从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整数数据。 &lt;br /&gt;&lt;br /&gt;tinyint   从 0 到 255 的整数数据。 &lt;br /&gt;&lt;br /&gt;bit &lt;br /&gt;&lt;br /&gt;bit   1 或 0 的整数数据。 &lt;br /&gt;&lt;br /&gt;decimal 和 numeric &lt;br /&gt;&lt;br /&gt;decimal   从 -10^38 +1 到 10^38 –1 的固定精度和小数位的数字数据。 &lt;br /&gt;&lt;br /&gt;numeric   功能上等同于 decimal。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;money 和 smallmoney &lt;br /&gt;&lt;br /&gt;money   货币数据值介于 -2^63 (-922,337,203,685,477.5808) 与 2^63 -1 (+922,337,203,685,477.5807) 之间，精确到货币单位的千分之十。 &lt;br /&gt;&lt;br /&gt;smallmoney   货币数据值介于 -214,748.3648 与 +214,748.3647 之间，精确到货币单位的千分之十。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;近似数字 &lt;br /&gt;&lt;br /&gt;float  从 -1.79E + 308 到 1.79E + 308 的浮点精度数字。 &lt;br /&gt;&lt;br /&gt;real   从 -3.40E + 38 到 3.40E + 38 的浮点精度数字。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;datetime 和 smalldatetime &lt;br /&gt;&lt;br /&gt;datetime  从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据，精确到百分之三秒（或 3.33 毫秒）。&lt;br /&gt;&lt;br /&gt;smalldatetime  从 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和时间数据，精确到分钟。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;字符串&lt;br /&gt;&lt;br /&gt;char  固定长度的非 Unicode 字符数据，最大长度为 8,000 个字符。 &lt;br /&gt;&lt;br /&gt;varchar 可变长度的非 Unicode 数据，最长为 8,000 个字符。 &lt;br /&gt;&lt;br /&gt;text  可变长度的非 Unicode 数据，最大长度为 2^31 - 1 (2,147,483,647) 个字符。 &lt;br /&gt;&lt;br /&gt;Unicode 字符串 &lt;br /&gt;&lt;br /&gt;nchar  固定长度的 Unicode 数据，最大长度为 4,000 个字符。  &lt;br /&gt;&lt;br /&gt;nvarchar  可变长度 Unicode 数据，其最大长度为 4,000 字符。sysname 是系统提供用户定义的数据类型，在功能上等同于 nvarchar(128)，用于引用数据库对象名。 &lt;br /&gt;&lt;br /&gt;ntext  可变长度 Unicode 数据，其最大长度为 2^30 - 1 (1,073,741,823) 个字符。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;二进制字符串 &lt;br /&gt;&lt;br /&gt;binary  固定长度的二进制数据，其最大长度为 8,000 个字节。 &lt;br /&gt;varbinary  可变长度的二进制数据，其最大长度为 8,000 个字节。 &lt;br /&gt;image  可变长度的二进制数据，其最大长度为 2^31 - 1 (2,147,483,647) 个字节。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;其它数据类型 &lt;br /&gt;&lt;br /&gt;cursor  游标的引用。 &lt;br /&gt;&lt;br /&gt;sql_variant &lt;br /&gt;一种存储 SQL Server 支持的各种数据类型（text、ntext、timestamp 和 sql_variant 除外）值的数据类型。&lt;br /&gt;&lt;br /&gt;table &lt;br /&gt;一种特殊的数据类型，存储供以后处理的结果集。&lt;br /&gt;&lt;br /&gt;timestamp &lt;br /&gt;数据库范围的唯一数字，每次更新行时也进行更新。 &lt;br /&gt;&lt;br /&gt;uniqueidentifier &lt;br /&gt;全局唯一标识符 (GUID)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-4826172742943578101?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/4826172742943578101/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=4826172742943578101' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4826172742943578101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4826172742943578101'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/ms-sql.html' title='MS SQL数据类型及长度限制'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-2574053581449434128</id><published>2008-10-21T05:10:00.001-07:00</published><updated>2008-10-21T05:10:44.825-07:00</updated><title type='text'>C#实现USB接口的程序代码</title><content type='html'>namespace ConsoleApplication1&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            USB usb;&lt;br /&gt;            usb = new UDisk();//插入U盘&lt;br /&gt;            usb.OutputFile();//从U盘读出文件&lt;br /&gt;            usb.InputFile();//往U盘写入文件&lt;br /&gt;            usb.Dispose();//拔出U盘 &lt;br /&gt;            Console.WriteLine("");&lt;br /&gt;            usb = new MDisk();//插入移动硬盘&lt;br /&gt;            usb.OutputFile();//从移动硬盘读出文件&lt;br /&gt;            usb.InputFile();//往移动硬盘写入文件&lt;br /&gt;            usb.Dispose();//拔出移动硬盘&lt;br /&gt;            Console.WriteLine("");&lt;br /&gt;            usb = new MP4();//插入MP4&lt;br /&gt;            usb.OutputFile();//从MP4读出文件&lt;br /&gt;            usb.InputFile();//往MP4写入文件&lt;br /&gt;            usb.Dispose();//拔出MP4 &lt;br /&gt;            Console.ReadKey();&lt;br /&gt;        } &lt;br /&gt;&lt;br /&gt;        //USB接口&lt;br /&gt;        public interface USB : IDisposable&lt;br /&gt;        {&lt;br /&gt;            void OutputFile();//读出文件&lt;br /&gt;            void InputFile();//写入文件&lt;br /&gt;        } &lt;br /&gt;&lt;br /&gt;        //U盘&lt;br /&gt;        public class UDisk : USB&lt;br /&gt;        {&lt;br /&gt;            public UDisk()&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("U盘准备就绪...");&lt;br /&gt;            }&lt;br /&gt;            public void OutputFile()&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("从U盘读出文件");&lt;br /&gt;            }&lt;br /&gt;            public void InputFile() &lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("往U盘写入文件");&lt;br /&gt;            }&lt;br /&gt;            public void Dispose()&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("U盘已被拔出");&lt;br /&gt;            }&lt;br /&gt;        } &lt;br /&gt;&lt;br /&gt;        //移动硬盘&lt;br /&gt;        public class MDisk : USB&lt;br /&gt;        {&lt;br /&gt;            public MDisk()&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("移动硬盘准备就绪...");&lt;br /&gt;            }&lt;br /&gt;            public void OutputFile()&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("从移动硬盘读出文件");&lt;br /&gt;            }&lt;br /&gt;            public void InputFile() &lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("往移动硬盘写入文件");&lt;br /&gt;            }&lt;br /&gt;            public void Dispose()&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("移动硬盘已被拔出");&lt;br /&gt;            }&lt;br /&gt;        } &lt;br /&gt;&lt;br /&gt;        //MP4&lt;br /&gt;        public class MP4 : USB&lt;br /&gt;        {&lt;br /&gt;            public MP4()&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("MP4准备就绪...");&lt;br /&gt;            }&lt;br /&gt;            public void OutputFile()&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("从MP4读出文件");&lt;br /&gt;            }&lt;br /&gt;            public void InputFile() &lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("往MP4写入文件");&lt;br /&gt;            }&lt;br /&gt;            public void Dispose()&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("MP4已被拔出");&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-2574053581449434128?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/2574053581449434128/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=2574053581449434128' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2574053581449434128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2574053581449434128'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/cusb.html' title='C#实现USB接口的程序代码'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-3534083291511850778</id><published>2008-10-21T05:09:00.000-07:00</published><updated>2008-10-21T05:10:16.944-07:00</updated><title type='text'>C#编程 忘记密码功能的实现方法</title><content type='html'>int result  = user.GetBackPassword(LoginName.Text.Trim(), Question.Text.Trim(), &lt;br /&gt;    Answer.Text.Trim(), Email.Text); &lt;br /&gt;&lt;br /&gt;   if (result == 1) &lt;br /&gt;   { &lt;br /&gt;    Message.Text = "您的密码已发送，请到邮箱查收"; &lt;br /&gt;    //user.ChangePassword( &lt;br /&gt;   } &lt;br /&gt;   else &lt;br /&gt;   { &lt;br /&gt;    Message.Text = "您的输入信息有误！"; &lt;br /&gt;   } &lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;public int GetBackPassword(string userName, string question, string answer, string email) &lt;br /&gt;  { &lt;br /&gt;   object m_DBNull = Convert.DBNull; &lt;br /&gt;   //获得新的随机密码 &lt;br /&gt;   string newPassword = MakePassword(6); &lt;br /&gt;   //定义存储过程参数  &lt;br /&gt;   SqlParameter[] para = { &lt;br /&gt;           new SqlParameter("@userName", userName), &lt;br /&gt;           new SqlParameter("@question", question), &lt;br /&gt;           new SqlParameter("@answer", answer), &lt;br /&gt;           new SqlParameter("@newPassword", newPassword), &lt;br /&gt;           new SqlParameter("@result", SqlDbType.Int, 8, ParameterDirection.Output, &lt;br /&gt;           true, 0, 0, "", DataRowVersion.Default, m_DBNull) &lt;br /&gt;          }; &lt;br /&gt;    &lt;br /&gt;   //执行存储过程 &lt;br /&gt;   try &lt;br /&gt;   { &lt;br /&gt;    DAL.SQLHelper.ExecuteNonQuery(DAL.SQLHelper.CONN_STRING, CommandType.StoredProcedure, &lt;br /&gt;     "GetBackPwd", para); &lt;br /&gt;   } &lt;br /&gt;   catch &lt;br /&gt;   { &lt;br /&gt;    throw new Exception("邮件无法发送！"); &lt;br /&gt;   } &lt;br /&gt;   //获得输出参数的值 &lt;br /&gt;   int result = Convert.ToInt32(para[4].Value); &lt;br /&gt;   //如果密码保护资料填写正确 &lt;br /&gt;   if (result == 1) &lt;br /&gt;   { &lt;br /&gt;    //从Web.config获取发信人地址、邮件标题、邮件用户名和密码以及SmtpServer &lt;br /&gt;    string sender = System.Configuration.ConfigurationSettings.AppSettings["mainSender"]; &lt;br /&gt;    string title = System.Configuration.ConfigurationSettings.AppSettings["mailTitle"]; &lt;br /&gt;    string mailUser =  System.Configuration.ConfigurationSettings.AppSettings["mailUser"]; &lt;br /&gt;    string mailPwd = System.Configuration.ConfigurationSettings.AppSettings["mailPwd"]; &lt;br /&gt;    string smtpServer = System.Configuration.ConfigurationSettings.AppSettings["mailSmtpServer"]; &lt;br /&gt;    //发信 &lt;br /&gt;    try &lt;br /&gt;    { &lt;br /&gt;     Mail.CDOsendmail(sender, email, title, "您在eshop的密码已找回,新密码为"+newPassword  &lt;br /&gt;      , mailUser, mailPwd, smtpServer); &lt;br /&gt;    } &lt;br /&gt;    catch(Exception ex) &lt;br /&gt;    { &lt;br /&gt;     throw new Exception(ex.Message); &lt;br /&gt;    } &lt;br /&gt;   } &lt;br /&gt;&lt;br /&gt;   return result; &lt;br /&gt;  }  &lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;//随机生成密码 &lt;br /&gt;  private static string MakePassword(int pwdLength) &lt;br /&gt;  { &lt;br /&gt;   //声明要返回的字符串 &lt;br /&gt;   string tmpstr = ""; &lt;br /&gt;   //密码中包含的字符数组 &lt;br /&gt;   string pwdchars="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; &lt;br /&gt;   //数组索引随机数 &lt;br /&gt;   int iRandNum; &lt;br /&gt;   //随机数生成器 &lt;br /&gt;   Random rnd = new Random(); &lt;br /&gt;   for(int i=0;i&lt;pwdLength;i++) &lt;br /&gt;   { &lt;br /&gt;    //Random类的Next方法生成一个指定范围的随机数 &lt;br /&gt;    iRandNum = rnd.Next(pwdchars.Length); &lt;br /&gt;    //tmpstr随机添加一个字符 &lt;br /&gt;    tmpstr += pwdchars[iRandNum]; &lt;br /&gt;   } &lt;br /&gt;   return tmpstr; &lt;br /&gt;  } &lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;ALTER  PROCEDURE GetBackPwd &lt;br /&gt;@question nvarchar(50), &lt;br /&gt;@answer nvarchar(50), &lt;br /&gt;@userName nvarchar(50), &lt;br /&gt;@newPassword nvarchar(50), &lt;br /&gt;@result int output &lt;br /&gt;AS &lt;br /&gt; if exists (SELECT * FROM USERINFO WHERE USERNAME=@USERNAME AND QUESTION=@QUESTION &lt;br /&gt;    AND ANSWER=@ANSWER) &lt;br /&gt; BEGIN &lt;br /&gt;  SET @RESULT = 1 &lt;br /&gt;  UPDATE USERINFO &lt;br /&gt;  SET USERPWD = @newPassword &lt;br /&gt;  WHERE userName = @userName &lt;br /&gt; END &lt;br /&gt; ELSE &lt;br /&gt; BEGIN &lt;br /&gt;  SET @RESULT = -1 &lt;br /&gt; END &lt;br /&gt;GO &lt;br /&gt;SET QUOTED_IDENTIFIER OFF  &lt;br /&gt;GO &lt;br /&gt;SET ANSI_NULLS ON  &lt;br /&gt;GO &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;add key="mailUser" value="" /&gt; &lt;br /&gt;    &lt;add key="mailPwd" value="" /&gt; &lt;br /&gt;    &lt;add key="mailSmtpServer" value="" /&gt; &lt;br /&gt;    &lt;add key="mailSender" value="" /&gt; &lt;br /&gt; &lt;add key="mailTitle" value="" /&gt; &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-3534083291511850778?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/3534083291511850778/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=3534083291511850778' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/3534083291511850778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/3534083291511850778'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_8252.html' title='C#编程 忘记密码功能的实现方法'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-6192593470548847414</id><published>2008-10-21T05:08:00.000-07:00</published><updated>2008-10-21T05:09:34.131-07:00</updated><title type='text'>用Visual C#制作新闻阅读器</title><content type='html'>一、弄清结构再动手&lt;br /&gt;&lt;br /&gt;　　要想轻松的抽取RSS信息，自然先要了解它的结构，所谓“知己知彼，百战不殆”嘛。 &lt;br /&gt;&lt;br /&gt;　　1、RSS的结构&lt;br /&gt;&lt;br /&gt;　　我们先打开百度新闻一个RSS链接，如果你再多打开几个别的网站的RSS链接，会发现他们都有大致相同的结构。而我们在揭秘RSS（上）中为大家讲解的其实就是编成实现这样的一个XML文件。&lt;br /&gt;&lt;br /&gt;　　为了能够方便地对这样的XML文档进行处理，在本文里，我们使用C#作为开发的语言。&lt;br /&gt;&lt;br /&gt;　　分析整个RSS链接后，我们知道RSS大致的结构入图1。&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LACRXgkTnEo/SOjQBroqFZI/AAAAAAAAABg/uR15slDMTm4/s1600-h/10439.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_LACRXgkTnEo/SOjQBroqFZI/AAAAAAAAABg/uR15slDMTm4/s320/10439.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5253677692639384978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;　　2、抽取的原理&lt;br /&gt;&lt;br /&gt;　　知道了结构，我们还要知道结构中各部分的含义。在图1中RSS节点表示当前是一个RSS文件，它由一个CHANNEL节点及其子节点组成，其中一些子节点提供关于频道本身的信息，比如title表示频道的名称（“百度互联网新闻”）。&lt;br /&gt;&lt;br /&gt;　　CHANNEL节点又包含多个ITEM子节点，而ITEM节点就是程序需要处理的部分，因为它对应着每条实际的新闻项信息, 每个ITEM节点又通过其子节点提供关于这条新闻的详细信息，比如title表示新闻的标题（“微软IM称王”），link对应新闻实际的链接。&lt;br /&gt;&lt;br /&gt;　　RSS具体规范可查看http://blogs.law.harvard.edu/tech/rss&lt;br /&gt;&lt;br /&gt;　　知道了这些后，要编程就不困难啦。我们只需提取并显示出CHANNEL和ITEM下的各条信息就可以了。现在来看看具体的实现方法吧。&lt;br /&gt;&lt;br /&gt;　　二．做个程序读新闻&lt;br /&gt;&lt;br /&gt;　　对RSS有一定了解后，我们开始编写程序。先还是需要一个最简单的界面。新建一个Win Form 工程，在Form上放置一个Label，一个文本框txtURL用来输入RSS链接（就是各网站RSS链接中包含的地址），一个按钮bnRead用来执行读取新闻, 一个TreeView树形控件treeRSS显示读出的新闻项。&lt;br /&gt;&lt;br /&gt;　　1、定义装载结构&lt;br /&gt;&lt;br /&gt;　　根据上面分析的RSS结构，我们首先来建立一个rss类，用它来装载RSS链接中CHANNEL和ITEM的各条信息。代码如下：&lt;br /&gt;&lt;br /&gt;public class rss&lt;br /&gt;{&lt;br /&gt;　public struct Channel&lt;br /&gt;　{&lt;br /&gt;　　public string Title;&lt;br /&gt;　　public Hashtable Items;&lt;br /&gt;　}&lt;br /&gt;&lt;br /&gt;　public struct Item&lt;br /&gt;　{&lt;br /&gt;　　public string Title;&lt;br /&gt;　　public string Description;&lt;br /&gt;　　public string Link;&lt;br /&gt;　}&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;　　Channel结构将存储CHANNEL节点包含的所有子节点信息，其中Items成员字段是一个Hashtable集合，程序会将Item结构作为对象加入集合，用来存储Channel下的所有Item节点。这里我只读取了有限的几个节点，读者可以根据实际需要扩展整个结构定义。&lt;br /&gt;&lt;br /&gt;　　2、从RSS链接中获取新闻信息&lt;br /&gt;&lt;br /&gt;　　现在我们就可以开始编写读取函数，将抽取出的RSS信息放入上面设计好的结构中。&lt;br /&gt;&lt;br /&gt;　　C#提供了专门的类来访问XML, 使我们能够轻松地读出RSS的内容。代码如下：&lt;br /&gt;&lt;br /&gt;XmlTextReader Reader = new XmlTextReader(URL);&lt;br /&gt;XmlValidatingReader Valid = new XmlValidatingReader(Reader);&lt;br /&gt;Valid.ValidationType = ValidationType.None;&lt;br /&gt;XmlDocument xmlDoc= new XmlDocument();&lt;br /&gt;xmlDoc.Load(Reader); &lt;br /&gt;&lt;br /&gt;　　使用XmlDocument类将txtURL中输入的RSS链接加载后，首先通过FoundChildNode函数，找到Channel节点。&lt;br /&gt;&lt;br /&gt;private XmlNode FoundChildNode(XmlNode Node,string Name)&lt;br /&gt;{&lt;br /&gt;　XmlNode childlNode = null;&lt;br /&gt;　for (int i=0;i &lt; Node.ChildNodes.Count;i++)&lt;br /&gt;　{&lt;br /&gt;　　if ( Node.ChildNodes[i].Name == Name &amp;&amp; Node.ChildNodes[i].ChildNodes.Count &gt; 0 )&lt;br /&gt;　　{&lt;br /&gt;　　　childlNode = Node.ChildNodes[i];&lt;br /&gt;　　　return childlNode;&lt;br /&gt;　　}&lt;br /&gt;　}&lt;br /&gt;　return childlNode;&lt;br /&gt;}&lt;br /&gt;XmlNode rssNode = FoundChildNode(xmlDoc,"rss");&lt;br /&gt;XmlNode channelNode = FoundChildNode(rssNode,"channel"); &lt;br /&gt;&lt;br /&gt;　　然后我们就可以遍历它的子节点，根据子节点的Name属性，读取我们需要的信息。&lt;br /&gt;&lt;br /&gt;rss.Channel channel=new rss.Channel();&lt;br /&gt;channel.Items=new Hashtable();&lt;br /&gt;{&lt;br /&gt;　switch ( channelNode.ChildNodes[i].Name )&lt;br /&gt;　{&lt;br /&gt;　　case "title":&lt;br /&gt;　　　{&lt;br /&gt;　　　　channel.Title = channelNode.ChildNodes[i].InnerText;&lt;br /&gt;　　　　break;&lt;br /&gt;　　　}&lt;br /&gt;　　case "item":&lt;br /&gt;　　　{&lt;br /&gt;　　　　rss.Item item=this.getRssItem(channelNode.ChildNodes[i]);&lt;br /&gt;　　　　channel.Items.Add(channel.Items.Count,item );&lt;br /&gt;　　　　break;&lt;br /&gt;　　　}&lt;br /&gt;　}&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;　　如果发现是item子节点，就调用getRssItem函数，同样通过遍历子节点的方法，将其子节点内容填入Item结构中，然后再添加到Channel结构的Items集合中。因为本程序并不关心添加到集合的键值，只需要它是不重复的值，所以我传入了Count属性。&lt;br /&gt;&lt;br /&gt;　　3.将读出的信息显示在程序中&lt;br /&gt;&lt;br /&gt;　　将RSS内容读出后，就需要把信息展示给用户了。我们这里用的是基本的TreeView方法，通过遍历Channel结构的Items集合，将其标题添加到TreeView中。&lt;br /&gt;&lt;br /&gt;private void ViewRss(rss.Channel channel)&lt;br /&gt;{&lt;br /&gt;　treeRss.BeginUpdate();&lt;br /&gt;　treeRss.Nodes.Clear();&lt;br /&gt;　TreeNode channelNode=treeRss.Nodes.Add(channel.Title ); &lt;br /&gt;　channelNode.Tag="";&lt;br /&gt;　for (int i=0;i &lt;channel.Items.Count ;i++)&lt;br /&gt;　{&lt;br /&gt;　　rss.Item item=(rss.Item)channel.Items[i];&lt;br /&gt;　　TreeNode itemNode=channelNode.Nodes.Add(item.Title );&lt;br /&gt;　　itemNode.Tag=item.Link;&lt;br /&gt;　}&lt;br /&gt;　treeRss.ExpandAll();&lt;br /&gt;　treeRss.EndUpdate();&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;　　同时我们还可以设置TreeView的每个子节点的Tag属性为它对应的链接。以便当选中子节点时就可以通过读取Tag属性访问具体的信息。&lt;br /&gt;&lt;br /&gt;private void treeRss_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)&lt;br /&gt;{&lt;br /&gt;　TreeNode itemNode=e.Node ;&lt;br /&gt;　string URL=itemNode.Tag.ToString();&lt;br /&gt;　if (URL.Length!=0)&lt;br /&gt;　　System.Diagnostics.Process.Start( URL);&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;　　程序运行效果如图2。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LACRXgkTnEo/SOjQBh_zoOI/AAAAAAAAABo/JnIh9EyhdEs/s1600-h/10441.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LACRXgkTnEo/SOjQBh_zoOI/AAAAAAAAABo/JnIh9EyhdEs/s320/10441.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5253677690052124898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;　　三．小结&lt;br /&gt;&lt;br /&gt;　　怎么样，一个简单的RSS新闻阅读器就按前面所说轻松完成了，容易吧。虽然它还有很多不足，但如果大家通过这个例子学会了抽取RSS链接信息的基本方法，那就足够了！ &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-6192593470548847414?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/6192593470548847414/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=6192593470548847414' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/6192593470548847414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/6192593470548847414'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/visual-c_21.html' title='用Visual C#制作新闻阅读器'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LACRXgkTnEo/SOjQBroqFZI/AAAAAAAAABg/uR15slDMTm4/s72-c/10439.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-3199329146870609508</id><published>2008-10-21T05:07:00.004-07:00</published><updated>2008-10-21T05:08:17.119-07:00</updated><title type='text'>使用c#捕获windows的关机事件</title><content type='html'>在公司上班，下班时需要签退，而我呢隔三差五就会忘那么一次。怎么办呢，于是就想能不能捕获Windows的关机事件，做一个程序让它在关机的时候提醒我一下呢。&lt;br /&gt;&lt;br /&gt;　　非常幸运很容易就找到了Microsoft.Win32命名空间下面的SystemEvents类，他有一个静态的事件SessionEnding在系统注销或者关机时发生，此事件只有在winform的程序下有效，而在控制台程序下面无效，不能激发事件;还有一点我们必须在程序推出时将加上的事件移除掉，否则就容易造成内存溢出。&lt;br /&gt;&lt;br /&gt;　　关键代码如下：&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　using System; &lt;br /&gt;　　using System.Collections.Generic; &lt;br /&gt;　　using System.Windows.Forms; &lt;br /&gt;　　using Microsoft.Win32; &lt;br /&gt;　　namespace Shutdown &lt;br /&gt;　　{ &lt;br /&gt;　　static class Program &lt;br /&gt;　　{ &lt;br /&gt;　　/**//// &lt;br /&gt;　　/// 应用程序的主入口点。 &lt;br /&gt;　　/// &lt;br /&gt;　　[STAThread] &lt;br /&gt;　　static void Main() &lt;br /&gt;　　{ &lt;br /&gt;　　Application.EnableVisualStyles(); &lt;br /&gt;　　Application.SetCompatibleTextRenderingDefault(false); &lt;br /&gt;　　FormShutdown formShutdown = new FormShutdown(); &lt;br /&gt;　　SystemEvents.SessionEnding += new SessionEndingEventHandler(formShutdown.SystemEvents_SessionEnding); &lt;br /&gt;　　Application.Run(formShutdown); &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;　　}Form 的代码： &lt;br /&gt;　　using System; &lt;br /&gt;　　using System.Collections.Generic; &lt;br /&gt;　　using System.ComponentModel; &lt;br /&gt;　　using System.Data; &lt;br /&gt;　　using System.Drawing; &lt;br /&gt;　　using System.Text; &lt;br /&gt;　　using System.Windows.Forms; &lt;br /&gt;　　using Microsoft.Win32; &lt;br /&gt;　　namespace Shutdown &lt;br /&gt;　　{ &lt;br /&gt;　　public partial class FormShutdown : Form &lt;br /&gt;　　{ &lt;br /&gt;　　const string MESSAGE_TXT = "您签退了吗?"; &lt;br /&gt;　　const string MESSAGE_TITLE = "提示"; &lt;br /&gt;　　public FormShutdown() &lt;br /&gt;　　{ &lt;br /&gt;　　InitializeComponent(); &lt;br /&gt;　　} &lt;br /&gt;　　internal void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) &lt;br /&gt;　　{ &lt;br /&gt;　　DialogResult result = MessageBox.Show(MESSAGE_TXT, MESSAGE_TITLE, MessageBoxButtons.YesNo); &lt;br /&gt;　　e.Cancel = (result == DialogResult.No); &lt;br /&gt;　　} &lt;br /&gt;　　private void FormShutdown_Load(object sender, EventArgs e) &lt;br /&gt;　　{ &lt;br /&gt;　　this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - 200, 0); &lt;br /&gt;　　} &lt;br /&gt;　　protected override void OnClosed(EventArgs e) &lt;br /&gt;　　{ &lt;br /&gt;　　SystemEvents.SessionEnding -= new SessionEndingEventHandler(this.SystemEvents_SessionEnding); &lt;br /&gt;　　base.OnClosed(e); &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;　　}&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　此程序在使用C#2.0在Windows2003下测试通过。大家在使用SystemEvents.SessionEnding事件时切记要在程序退出时移除事件。&lt;br /&gt;&lt;br /&gt;　　不过有两点遗憾之处：&lt;br /&gt;&lt;br /&gt;　　1. 使用这种方式不能捕获休眠时的事件&lt;br /&gt;&lt;br /&gt;　　2. 这个程序占用的内存太多了，只有这么一个小功能居然占了12M的内存，这都是.net Framework惹的货;实在是不可思议。&lt;br /&gt;&lt;br /&gt;　　大家有没有什么好主意可以克服这两个缺点呢?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-3199329146870609508?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/3199329146870609508/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=3199329146870609508' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/3199329146870609508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/3199329146870609508'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/cwindows.html' title='使用c#捕获windows的关机事件'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-2080846340006671240</id><published>2008-10-21T05:07:00.003-07:00</published><updated>2008-10-21T05:07:47.703-07:00</updated><title type='text'>一个用C#过滤HTML代码的函数</title><content type='html'>public string checkStr(string html) &lt;br /&gt;      { &lt;br /&gt;          System.Text.RegularExpressions.Regex regex1 = new System.Text.RegularExpressions.Regex(@"&lt;script[\s\S]+&lt;/script *&gt;", System.Text.RegularExpressions.RegexOptions.IgnoreCase); &lt;br /&gt;          System.Text.RegularExpressions.Regex regex2 = new System.Text.RegularExpressions.Regex(@" href *= *[\s\S]*script *:", System.Text.RegularExpressions.RegexOptions.IgnoreCase); &lt;br /&gt;          System.Text.RegularExpressions.Regex regex3 = new System.Text.RegularExpressions.Regex(@" no[\s\S]*=", System.Text.RegularExpressions.RegexOptions.IgnoreCase); &lt;br /&gt;          System.Text.RegularExpressions.Regex regex4 = new System.Text.RegularExpressions.Regex(@"&lt;iframe[\s\S]+&lt;/iframe *&gt;", System.Text.RegularExpressions.RegexOptions.IgnoreCase); &lt;br /&gt;          System.Text.RegularExpressions.Regex regex5 = new System.Text.RegularExpressions.Regex(@"&lt;frameset[\s\S]+&lt;/frameset *&gt;", System.Text.RegularExpressions.RegexOptions.IgnoreCase); &lt;br /&gt;          System.Text.RegularExpressions.Regex regex6 = new System.Text.RegularExpressions.Regex(@"\&lt;img[^\&gt;]+\&gt;", System.Text.RegularExpressions.RegexOptions.IgnoreCase);  &lt;br /&gt;          System.Text.RegularExpressions.Regex regex7 = new System.Text.RegularExpressions.Regex(@"&lt;/p&gt;", System.Text.RegularExpressions.RegexOptions.IgnoreCase); &lt;br /&gt;          System.Text.RegularExpressions.Regex regex8 = new System.Text.RegularExpressions.Regex(@"&lt;p&gt;", System.Text.RegularExpressions.RegexOptions.IgnoreCase); &lt;br /&gt;          System.Text.RegularExpressions.Regex regex9 = new System.Text.RegularExpressions.Regex(@"&lt;[^&gt;]*&gt;", System.Text.RegularExpressions.RegexOptions.IgnoreCase); &lt;br /&gt;          html = regex1.Replace(html, ""); //过滤&lt;script&gt;&lt;/script&gt;标记 &lt;br /&gt;          html = regex2.Replace(html, ""); //过滤href=JavaScript: (&lt;A&gt;) 属性 &lt;br /&gt;          html = regex3.Replace(html, " _disibledevent="); //过滤其它控件的on...事件 &lt;br /&gt;          html = regex4.Replace(html, ""); //过滤iframe &lt;br /&gt;          html = regex5.Replace(html, ""); //过滤frameset &lt;br /&gt;          html = regex6.Replace(html, ""); //过滤frameset &lt;br /&gt;          html = regex7.Replace(html, ""); //过滤frameset &lt;br /&gt;          html = regex8.Replace(html, ""); //过滤frameset &lt;br /&gt;          html = regex9.Replace(html, ""); &lt;br /&gt;          html = html.Replace(" ", ""); &lt;br /&gt;          html = html.Replace("&lt;/strong&gt;", ""); &lt;br /&gt;          html = html.Replace("&lt;strong&gt;", ""); &lt;br /&gt;          return html; &lt;br /&gt;} &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-2080846340006671240?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/2080846340006671240/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=2080846340006671240' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2080846340006671240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2080846340006671240'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/chtml.html' title='一个用C#过滤HTML代码的函数'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-5646760509165912707</id><published>2008-10-21T05:07:00.001-07:00</published><updated>2008-10-21T05:07:25.060-07:00</updated><title type='text'>关于C#在lucene.net下的中文切词</title><content type='html'>经过一天的研究，终于完成了C#在lucene.net下可以使用的中文切词方法。感到有些复杂，不过我还是拿下了。颇有点成就感的，发上来跟大家分享一下!&lt;br /&gt;&lt;br /&gt;　　在实现了中文切词的基础方法上，我将其封装在继承lucene的Analyzer类下&lt;br /&gt;&lt;br /&gt;　　chineseAnalzer的方法就不用多说了。&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　using System; &lt;br /&gt;　　using System.Collections.Generic; &lt;br /&gt;　　using System.Text; &lt;br /&gt;　　 &lt;br /&gt;　　using Lucene.Net.Analysis; &lt;br /&gt;　　using Lucene.Net.Analysis.Standard; &lt;br /&gt;　　 &lt;br /&gt;　　namespace Lucene.Fanswo &lt;br /&gt;　　{ &lt;br /&gt;　　 /**////  &lt;br /&gt;　　 /// &lt;br /&gt;　　 ///  &lt;br /&gt;　　 public class ChineseAnalyzer:Analyzer &lt;br /&gt;　　 { &lt;br /&gt;　　 //private System.Collections.Hashtable stopSet; &lt;br /&gt;　　 public static readonly System.String[] CHINESE_ENGLISH_STOP_WORDS = new System.String[] { "a", "an", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "no", "not", "of", "on", "or", "s", "such", "t", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with", "我", "我们" }; &lt;br /&gt;　　 &lt;br /&gt;　　 &lt;br /&gt;　　 /**//// Constructs a {@link StandardTokenizer} filtered by a {@link &lt;br /&gt;　　 /// StandardFilter}, a {@link LowerCaseFilter} and a {@link StopFilter}. &lt;br /&gt;　　 ///  &lt;br /&gt;　　 public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader) &lt;br /&gt;　　 { &lt;br /&gt;　　 TokenStream result = new ChineseTokenizer(reader); &lt;br /&gt;　　 result = new StandardFilter(result); &lt;br /&gt;　　 result = new LowerCaseFilter(result); &lt;br /&gt;　　 result = new StopFilter(result, CHINESE_ENGLISH_STOP_WORDS); &lt;br /&gt;　　 return result; &lt;br /&gt;　　 } &lt;br /&gt;　　 &lt;br /&gt;　　 } &lt;br /&gt;　　} &lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　ChineseTokenizer类的实现：&lt;br /&gt;&lt;br /&gt;　　这里通过词典来正向匹配字符，返回lucene下定义的token流&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　using System; &lt;br /&gt;　　using System.Collections.Generic; &lt;br /&gt;　　using System.Text; &lt;br /&gt;　　using Lucene.Net.Analysis; &lt;br /&gt;　　using System.Collections; &lt;br /&gt;　　using System.Text.RegularExpressions; &lt;br /&gt;　　using System.IO; &lt;br /&gt;　　 &lt;br /&gt;　　namespace Lucene.Fanswo &lt;br /&gt;　　{ &lt;br /&gt;　　 class ChineseTokenizer : Tokenizer &lt;br /&gt;　　 { &lt;br /&gt;　　 &lt;br /&gt;　　 private int offset = 0, bufferIndex = 0, dataLen = 0;//偏移量，当前字符的位置，字符长度 &lt;br /&gt;　　 &lt;br /&gt;　　 private int start;//开始位置 &lt;br /&gt;　　 /**////  &lt;br /&gt;　　 /// 存在字符内容 &lt;br /&gt;　　 ///  &lt;br /&gt;　　 private string text; &lt;br /&gt;　　 &lt;br /&gt;　　 /**////  &lt;br /&gt;　　 /// 切词所花费的时间 &lt;br /&gt;　　 ///  &lt;br /&gt;　　 public double TextSeg_Span = 0; &lt;br /&gt;　　 &lt;br /&gt;　　 /**//// Constructs a tokenizer for this Reader.  &lt;br /&gt;　　 public ChineseTokenizer(System.IO.TextReader reader) &lt;br /&gt;　　 { &lt;br /&gt;　　 this.input = reader; &lt;br /&gt;　　 text = input.ReadToEnd(); &lt;br /&gt;　　 dataLen = text.Length; &lt;br /&gt;　　 } &lt;br /&gt;　　 &lt;br /&gt;　　 /**//// 进行切词，返回数据流中下一个token或者数据流为空时返回null &lt;br /&gt;　　 ///  &lt;br /&gt;　　 /// &lt;br /&gt;　　 public override Token Next() &lt;br /&gt;　　 { &lt;br /&gt;　　 Token token = null; &lt;br /&gt;　　 WordTree tree = new WordTree(); &lt;br /&gt;　　 //读取词库 &lt;br /&gt;　　 tree.LoadDict(); &lt;br /&gt;　　 //初始化词库，为树形 &lt;br /&gt;　　 Hashtable t_chartable = WordTree.chartable; &lt;br /&gt;　　 string ReWord = ""; &lt;br /&gt;　　 string char_s; &lt;br /&gt;　　 start = offset; &lt;br /&gt;　　 bufferIndex = start; &lt;br /&gt;　　 &lt;br /&gt;　　 while (true) &lt;br /&gt;　　 { &lt;br /&gt;　　 //开始位置超过字符长度退出循环 &lt;br /&gt;　　 if (start &gt;= dataLen) &lt;br /&gt;　　 { &lt;br /&gt;　　 break; &lt;br /&gt;　　 } &lt;br /&gt;　　 //获取一个词 &lt;br /&gt;　　 char_s = text.Substring(start, 1); &lt;br /&gt;　　 if (string.IsNullOrEmpty(char_s.Trim())) &lt;br /&gt;　　 { &lt;br /&gt;　　 start++; &lt;br /&gt;　　 continue; &lt;br /&gt;　　 } &lt;br /&gt;　　 //字符不在字典中 &lt;br /&gt;　　 if (!t_chartable.Contains(char_s)) &lt;br /&gt;　　 { &lt;br /&gt;　　 if (ReWord == "") &lt;br /&gt;　　 { &lt;br /&gt;　　 int j = start + 1; &lt;br /&gt;　　 switch (tree.GetCharType(char_s)) &lt;br /&gt;　　 { &lt;br /&gt;　　 case 0://中文单词 &lt;br /&gt;　　 ReWord += char_s; &lt;br /&gt;　　 break; &lt;br /&gt;　　 case 1://英文单词 &lt;br /&gt;　　 j = start + 1; &lt;br /&gt;　　 while (j &lt; dataLen) &lt;br /&gt;　　 { &lt;br /&gt;　　 if (tree.GetCharType(text.Substring(j, 1)) != 1) &lt;br /&gt;　　 break; &lt;br /&gt;　　 &lt;br /&gt;　　 j++; &lt;br /&gt;　　 } &lt;br /&gt;　　 ReWord += text.Substring(start, j - offset); &lt;br /&gt;　　 &lt;br /&gt;　　 break; &lt;br /&gt;　　 case 2://数字 &lt;br /&gt;　　 j = start + 1; &lt;br /&gt;　　 while (j &lt; dataLen) &lt;br /&gt;　　 { &lt;br /&gt;　　 if (tree.GetCharType(text.Substring(j, 1)) != 2) &lt;br /&gt;　　 break; &lt;br /&gt;　　 &lt;br /&gt;　　 j++; &lt;br /&gt;　　 } &lt;br /&gt;　　 ReWord += text.Substring(start, j - offset); &lt;br /&gt;　　 &lt;br /&gt;　　 break; &lt;br /&gt;　　 &lt;br /&gt;　　 default: &lt;br /&gt;　　 ReWord += char_s;//其他字符单词 &lt;br /&gt;　　 break; &lt;br /&gt;　　 } &lt;br /&gt;　　 &lt;br /&gt;　　 offset = j;//设置取下一个词的开始位置 &lt;br /&gt;　　 } &lt;br /&gt;　　 else &lt;br /&gt;　　 { &lt;br /&gt;　　 offset = start;//设置取下一个词的开始位置 &lt;br /&gt;　　 } &lt;br /&gt;　　 &lt;br /&gt;　　 //返回token对象 &lt;br /&gt;　　 return new Token(ReWord, bufferIndex, bufferIndex + ReWord.Length - 1); &lt;br /&gt;　　 } &lt;br /&gt;　　 //字符在字典中 &lt;br /&gt;　　 ReWord += char_s; &lt;br /&gt;　　 //取得属于当前字符的词典树 &lt;br /&gt;　　 t_chartable = (Hashtable)t_chartable[char_s]; &lt;br /&gt;　　 //设置下一循环取下一个词的开始位置 &lt;br /&gt;　　 start++; &lt;br /&gt;　　 if (start == dataLen) &lt;br /&gt;　　 { &lt;br /&gt;　　 offset = dataLen; &lt;br /&gt;　　 return new Token(ReWord, bufferIndex, bufferIndex + ReWord.Length - 1); &lt;br /&gt;　　 } &lt;br /&gt;　　 } &lt;br /&gt;　　 return token; &lt;br /&gt;　　 } &lt;br /&gt;　　 &lt;br /&gt;　　 } &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　测试的代码： &lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　using System; &lt;br /&gt;　　using System.Collections.Generic; &lt;br /&gt;　　using System.Text; &lt;br /&gt;　　 &lt;br /&gt;　　using Analyzer = Lucene.net.Analysis.Analyzer; &lt;br /&gt;　　using SimpleAnalyzer = Lucene.Net.Analysis.SimpleAnalyzer; &lt;br /&gt;　　using StandardAnalyzer = Lucene.Net.Analysis.Standard.StandardAnalyzer; &lt;br /&gt;　　using Token = Lucene.Net.Analysis.Token; &lt;br /&gt;　　using TokenStream = Lucene.Net.Analysis.TokenStream; &lt;br /&gt;　　 &lt;br /&gt;　　namespace MyLuceneTest &lt;br /&gt;　　{ &lt;br /&gt;　　 class Program &lt;br /&gt;　　 { &lt;br /&gt;　　 [STAThread] &lt;br /&gt;　　 public static void Main(System.String[] args) &lt;br /&gt;　　 { &lt;br /&gt;　　 try &lt;br /&gt;　　 { &lt;br /&gt;　　 Test("中华人民共和国在1949年建立，从此开始了新中国的伟大篇章。长春市长春节致词", true); &lt;br /&gt;　　 } &lt;br /&gt;　　 catch (System.Exception e) &lt;br /&gt;　　 { &lt;br /&gt;　　 System.Console.Out.WriteLine(" caught a " + e.GetType() + "\n with message: " + e.Message + e.ToString()); &lt;br /&gt;　　 } &lt;br /&gt;　　 } &lt;br /&gt;　　 &lt;br /&gt;　　 internal static void Test(System.String text, bool verbose) &lt;br /&gt;　　 { &lt;br /&gt;　　 System.Console.Out.WriteLine(" Tokenizing string: " + text); &lt;br /&gt;　　 Test(new System.IO.StringReader(text), verbose, text.Length); &lt;br /&gt;　　 } &lt;br /&gt;　　 &lt;br /&gt;　　 internal static void Test(System.IO.TextReader reader, bool verbose, long bytes) &lt;br /&gt;　　 { &lt;br /&gt;　　 //Analyzer analyzer = new StandardAnalyzer(); &lt;br /&gt;　　 Analyzer analyzer = new Lucene.Fanswo.ChineseAnalyzer(); &lt;br /&gt;　　 TokenStream stream = analyzer.TokenStream(null, reader); &lt;br /&gt;　　 &lt;br /&gt;　　 System.DateTime start = System.DateTime.Now; &lt;br /&gt;　　 &lt;br /&gt;　　 int count = 0; &lt;br /&gt;　　 for (Token t = stream.Next(); t != null; t = stream.Next()) &lt;br /&gt;　　 { &lt;br /&gt;　　 if (verbose) &lt;br /&gt;　　 { &lt;br /&gt;　　 System.Console.Out.WriteLine("Token=" + t.ToString()); &lt;br /&gt;　　 } &lt;br /&gt;　　 count++; &lt;br /&gt;　　 } &lt;br /&gt;　　 &lt;br /&gt;　　 System.DateTime end = System.DateTime.Now; &lt;br /&gt;　　 &lt;br /&gt;　　 long time = end.Ticks - start.Ticks; &lt;br /&gt;　　 System.Console.Out.WriteLine(time + " milliseconds to extract " + count + " tokens"); &lt;br /&gt;　　 System.Console.Out.WriteLine((time * 1000.0) / count + " microseconds/token"); &lt;br /&gt;　　 System.Console.Out.WriteLine((bytes * 1000.0 * 60.0 * 60.0) / (time * 1000000.0) + " megabytes/hour"); &lt;br /&gt;　　 } &lt;br /&gt;　　 } &lt;br /&gt;　　} &lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　测试结果：&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LACRXgkTnEo/SOjTKi6zcYI/AAAAAAAAABw/b6Qc6fIXeXw/s1600-h/18363.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LACRXgkTnEo/SOjTKi6zcYI/AAAAAAAAABw/b6Qc6fIXeXw/s320/18363.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5253681143453282690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　完毕!&lt;br /&gt;&lt;br /&gt;　　分词的郊率上还有待在算法上提高。还有中文的标点符号没有处理，我将进一步完善。&lt;br /&gt;&lt;br /&gt;　　&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-5646760509165912707?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/5646760509165912707/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=5646760509165912707' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/5646760509165912707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/5646760509165912707'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/clucenenet.html' title='关于C#在lucene.net下的中文切词'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_LACRXgkTnEo/SOjTKi6zcYI/AAAAAAAAABw/b6Qc6fIXeXw/s72-c/18363.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-5972666441427090990</id><published>2008-10-21T05:06:00.002-07:00</published><updated>2008-10-21T05:07:03.198-07:00</updated><title type='text'>详解Visual C＃数据库编程</title><content type='html'>本文就来着重探讨一下Visual C#数据库基本编程，即：如何浏览记录、修改记录、删除记录和插入记录。针对数据库编程始终是程序设计语言的一个重要方面的内容，也是一个难点。数据库编程的内容十分丰富，但最为基本编程的也就是那么几点，譬如：连接数据库、得到需要的数据和针对数据记录的浏览、删除、修改、插入等操作。其中又以后面针对数据记录的数据操作为重点。&lt;br /&gt;&lt;br /&gt;　　一.程序设计和运行的环境设置：&lt;br /&gt;&lt;br /&gt;　　(1).视窗2000服务器版&lt;br /&gt;&lt;br /&gt;　　(2).Microsoft Data Acess Component 2.6 以上版本 ( MDAC 2.6 )&lt;br /&gt;&lt;br /&gt;　　(3)..net Framework SDK Beta 2&lt;br /&gt;&lt;br /&gt;　　为了更清楚的说明问题，在数据库的选用上，采用了当前比较典型的数据库，一个是本地数据库Access 2000，另外一个是远程数据库SQL Server 2000。其中本地数据库名称为"db.mdb"，在其中定义了一张数据表"person"，"person"表的数据结构如下表：&lt;br /&gt;&lt;br /&gt;　　字段名称 字段类型 字段意思&lt;br /&gt;&lt;br /&gt;　　id           数字          序号&lt;br /&gt;&lt;br /&gt;　　xm         文本          姓名&lt;br /&gt;&lt;br /&gt;　　xb         文本           性别&lt;br /&gt;&lt;br /&gt;　　nl          文本            年龄&lt;br /&gt;&lt;br /&gt;　　zip        文本         邮政编码&lt;br /&gt;&lt;br /&gt;　　远程数据库Sql Server 2000的数据库服务器名称为"Server1",数据库名称为"Data1"，登陆的ID为"sa"，口令为空，在数据库也定义了一张"person"表，数据结构如上表。&lt;br /&gt;&lt;br /&gt;　　二.如何浏览数据：&lt;br /&gt;&lt;br /&gt;　　在《Visual C#的数据绑定》中，已经了解了如何把数据集中的某些字段绑定到WinForm组件的某个属性上，这样程序员就可以根据以WinForm组件的来定制数据显示的形式，并且此时的WinForm组件显示内容就可以随着记录指针的变化而改变。至此可见，浏览数据记录的关键就是如何改变记录指针。要实现这种操作，就要使用到BindingManagerBase类，此类的主要作用是管理对于那些实现了对同一个数据源进行绑定的对象。说的具体些，就是能够使得Windows窗体上的已经对同一数据源进行数据绑定的组件保持同步。在BindingManagerBase类中定义了一个属性"Position"，通过这个属性就可以改变BindingManagerBase对象中的数据指针。创建BindingManagerBase对象必须要使用到BindingContext类，其实每一个由Control类中继承而得到的对象，都有单一的BindingContext对象，在大多数创建窗体中实现数据绑定组件的BindingManagerBase对象是使用Form类的BindingContext来得到。下列代码是以Access 2000数据库为模型，创建的一个名称为"myBind"的BindingManagerBase对象。&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　//创建一个 OleDbConnection &lt;br /&gt;　　string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ; &lt;br /&gt;　　OleDbConnection myConn = new OleDbConnection ( strCon ) ; &lt;br /&gt;　　string strCom = " SELECT * FROM person " ; &lt;br /&gt;　　file://创建一个 DataSet &lt;br /&gt;　　myDataSet = new DataSet ( ) ; &lt;br /&gt;　　myConn.Open ( ) ; &lt;br /&gt;　　file://用 OleDbDataAdapter 得到一个数据集 &lt;br /&gt;　　OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; &lt;br /&gt;　　file://把Dataset绑定books数据表 &lt;br /&gt;　　myCommand.Fill ( myDataSet , "person" ) ; &lt;br /&gt;　　file://关闭此OleDbConnection &lt;br /&gt;　　myConn.Close ( ) ; &lt;br /&gt;　　myBind = this.BindingContext [ myDataSet , "person" ] ; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　下列代码是以Sql Server 2000数据库为模型，创建一个名称为"myBind"的BindingManagerBase对象。&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1 &lt;br /&gt;　　string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ; &lt;br /&gt;　　OleDbConnection myConn = new OleDbConnection ( strCon ) ; &lt;br /&gt;　　myConn.Open ( ) ; &lt;br /&gt;　　string strCom = " SELECT * FROM person " ; &lt;br /&gt;　　file://创建一个 DataSet &lt;br /&gt;　　myDataSet = new DataSet ( ) ; &lt;br /&gt;　　file://用 OleDbDataAdapter 得到一个数据集 &lt;br /&gt;　　OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; &lt;br /&gt;　　file://把Dataset绑定person数据表 &lt;br /&gt;　　myCommand.Fill ( myDataSet , " person " ) ; &lt;br /&gt;　　file://关闭此OleDbConnection &lt;br /&gt;　　myConn.Close ( ) ; &lt;br /&gt;　　myBind = this.BindingContext [ myDataSet , "person" ] ; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　得到了是同一数据源的BindingManagerBase对象，通过改变此对象的"Position"属性值，这样绑定数据的组件显示的数据就随之变化，从而实现导航数据记录。&lt;br /&gt;&lt;br /&gt;　　&lt; I &gt; .导航按钮"上一条"实现方法：&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　protected void GoPrevious ( object sender , System.EventArgs e ) &lt;br /&gt;　　{ &lt;br /&gt;　　if ( myBind.Position == 0 ) &lt;br /&gt;　　MessageBox.Show ( "已经到了第一条记录!" , "信息提示!" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ; &lt;br /&gt;　　else &lt;br /&gt;　　myBind.Position -= 1 ; &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt; II &gt; . 导航按钮"下一条"实现方法： &lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　protected void GoNext ( object sender , System.EventArgs e ) &lt;br /&gt;　　{ &lt;br /&gt;　　if ( myBind.Position == myBind.Count -1 ) &lt;br /&gt;　　MessageBox.Show ( "已经到了最后一条记录!", "信息提示!" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ; &lt;br /&gt;　　else &lt;br /&gt;　　myBind.Position += 1 ; &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt; III &gt; . 导航按钮"至尾"实现方法：&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　protected void GoLast ( object sender , System.EventArgs e ) &lt;br /&gt;　　{ &lt;br /&gt;　　myBind.Position = myBind.Count - 1 ; &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt; IV &gt; . 导航按钮"至首"实现方法：&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　protected void GoFirst ( object sender , System.EventArgs e ) &lt;br /&gt;　　{ &lt;br /&gt;　　myBind.Position = 0 ; &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　注释："Count"是BindingManagerBase对象的另外一个重要的属性，是数据集记录的总数。&lt;br /&gt;&lt;br /&gt;　　三.实现删除记录：&lt;br /&gt;&lt;br /&gt;　　在对数据记录进行操作的时候，有二点必须十分清晰：&lt;br /&gt;&lt;br /&gt;　　其一：在对数据记录进行操作的时候，我想有一些程序员一定有这样一个疑惑，当对数据库服务器请求数据集的时候，就会产生"DataSet"对象，用以管理数据集，这样如果这些对数据库服务器的请求非常多，同样也就会产生很多的"DataSet"对象，达到一定时候必然会使得数据库服务器崩溃。这种想法是自然的，但和实际并不相符，因为"DataSet"对象并不是在服务器端产生的，而是在客户端产生的。所以面对众多的数据请求的时候对数据库服务器的影响并不十分太大。&lt;br /&gt;&lt;br /&gt;　　其二：记得在用Delphi编写三层数据模型的时候的，每一次对数据库的修改其实只是对第二层产生的数据集的修改，要真正修改数据库，还必须调用一个另外的方法。在用ADO.NET处理数据库的时候，虽然处理的直接对象是数据库，但此时"DataSet"对象中的内容并没有随之改变，而绑定的数据组件显示的数据又来源于"DataSet"对象，这样就会产生一个错觉，就是修改了的记录并没有修改掉，删除的记录并没有删除掉。所以对数据记录进行操作的时候，在修改数据库后，还要对"DataSet"对象进行必要的修改，这样才能保证"DataSet"对象和数据库内容一致、同步。下面代码是删除当前绑定组件显示的记录的程序代码，此代码是以Access 2000数据库为模板的：&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　protected void Delete_record ( object sender , System.EventArgs e ) &lt;br /&gt;　　{ &lt;br /&gt;　　DialogResult r = MessageBox.Show ( "是否删除当前记录!" , "删除当前记录!" , MessageBoxButtons.YesNo , MessageBoxIcon.Question ) ; &lt;br /&gt;　　int ss = ( int ) r ; &lt;br /&gt;　　if ( ss == 6 ) // 按动"确定"按钮 &lt;br /&gt;　　{ &lt;br /&gt;　　try{ &lt;br /&gt;　　file://连接到一个数据库 &lt;br /&gt;　　string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb " ; &lt;br /&gt;　　OleDbConnection myConn = new OleDbConnection ( strCon ) ; &lt;br /&gt;　　myConn.Open ( ) ; &lt;br /&gt;　　string strDele = "DELETE FROM person WHERE id= " + t_id.Text ; &lt;br /&gt;　　OleDbCommand myCommand = new OleDbCommand ( strDele , myConn ) ; &lt;br /&gt;　　file://从数据库中删除指定记录 &lt;br /&gt;　　myCommand.ExecuteNonQuery ( ) ; &lt;br /&gt;　　file://从DataSet中删除指定记录 &lt;br /&gt;　　myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . Delete ( ) ; &lt;br /&gt;　　myDataSet.Tables [ "person" ] . AcceptChanges ( ) ; &lt;br /&gt;　　myConn.Close ( ) ; &lt;br /&gt;　　} &lt;br /&gt;　　catch ( Exception ed ) &lt;br /&gt;　　{ &lt;br /&gt;　　MessageBox.Show ( "删除记录错误信息： " + ed.ToString ( ) , "错误!" ) ; &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;　　}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-5972666441427090990?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/5972666441427090990/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=5972666441427090990' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/5972666441427090990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/5972666441427090990'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/visual-c.html' title='详解Visual C＃数据库编程'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-6567031669635909630</id><published>2008-10-21T05:06:00.001-07:00</published><updated>2008-10-21T05:06:39.839-07:00</updated><title type='text'>使用C#编写查询IP段功能的程序</title><content type='html'>本文将通过一个实例来向大家讲解如何使用C#来编写一个具备查询IP段功能的小程序。&lt;br /&gt;&lt;br /&gt;　　主要功能：查询一个IP所有的IP段.&lt;br /&gt;&lt;br /&gt;　　关键:从Byte数组到ulong的转换出来的数字和 IPAddress.Address 返回值的是不一样的.&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　using System; &lt;br /&gt;　　using System.Collections.Generic; &lt;br /&gt;　　using System.Text; &lt;br /&gt;　　using System.net; &lt;br /&gt;　　namespace IPUtility &lt;br /&gt;　　{ &lt;br /&gt;　　class Program &lt;br /&gt;　　{ &lt;br /&gt;　　static void Main(string[] args) &lt;br /&gt;　　{ &lt;br /&gt;　　IPRangeManage irm = new IPRangeManage(); &lt;br /&gt;　　irm.Add(new IPRange("石家庄", "219.148.24.0", "219.148.63.255")); &lt;br /&gt;　　irm.Add(new IPRange("石家庄", "222.222.0.0", "222.222.63.255")); &lt;br /&gt;　　irm.Add(new IPRange("唐山", "219.148.64.0", "219.148.79.255")); &lt;br /&gt;　　irm.Add(new IPRange("保定", "219.148.20.0", "219.148.23.255")); &lt;br /&gt;　　Console.WriteLine(irm.Search("219.148.56.3").Name); &lt;br /&gt;　　Console.ReadLine(); &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;　　public class IPRange &lt;br /&gt;　　{ &lt;br /&gt;　　private string _Name = string.Empty; &lt;br /&gt;　　private ulong _BeginIP = 0; &lt;br /&gt;　　private ulong _EndIP = Int32.MaxValue; &lt;br /&gt;　　/**////  &lt;br /&gt;　　/// IP段名称 &lt;br /&gt;　　///  &lt;br /&gt;　　public string Name &lt;br /&gt;　　{ &lt;br /&gt;　　get { return _Name; } &lt;br /&gt;　　set { _Name = value; } &lt;br /&gt;　　} &lt;br /&gt;　　/**////  &lt;br /&gt;　　/// ?始IP &lt;br /&gt;　　///  &lt;br /&gt;　　public ulong BeginIP &lt;br /&gt;　　{ &lt;br /&gt;　　get { return _BeginIP; } &lt;br /&gt;　　set { _BeginIP = value; } &lt;br /&gt;　　} &lt;br /&gt;　　/**////  &lt;br /&gt;　　/// ?束IP &lt;br /&gt;　　///  &lt;br /&gt;　　public ulong EndIP &lt;br /&gt;　　{ &lt;br /&gt;　　get { return _EndIP; } &lt;br /&gt;　　set { _EndIP = value; } &lt;br /&gt;　　} &lt;br /&gt;　　/**////  &lt;br /&gt;　　/// 此IP段的范? &lt;br /&gt;　　///  &lt;br /&gt;　　public ulong Range &lt;br /&gt;　　{ &lt;br /&gt;　　get &lt;br /&gt;　　{ &lt;br /&gt;　　return EndIP - BeginIP; &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;　　public IPRange(string name, string iPBegin, string ipEnd) &lt;br /&gt;　　{ &lt;br /&gt;　　this.Name = name; &lt;br /&gt;　　this.BeginIP = IP2A(ipBegin); &lt;br /&gt;　　this.EndIP = IP2A(ipEnd); &lt;br /&gt;　　} &lt;br /&gt;　　public static ulong IP2A(string ip) &lt;br /&gt;　　{ &lt;br /&gt;　　byte[] bytes = IPAddress.Parse(ip).GetAddressBytes(); &lt;br /&gt;　　ulong ret = 0; &lt;br /&gt;　　foreach (byte b in bytes) &lt;br /&gt;　　{ &lt;br /&gt;　　ret &lt;&lt;= 8; &lt;br /&gt;　　ret |= b; &lt;br /&gt;　　} &lt;br /&gt;　　return ret; &lt;br /&gt;　　} &lt;br /&gt;　　public static int Compare(IPRange x, IPRange y) &lt;br /&gt;　　{ &lt;br /&gt;　　if(x.Range == y.Range) &lt;br /&gt;　　return 0; &lt;br /&gt;　　else if(x.Range &gt; y.Range) &lt;br /&gt;　　return 1; &lt;br /&gt;　　else return -1; &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;　　public class IPRangeManage &lt;br /&gt;　　{ &lt;br /&gt;　　public IPRangeManage() &lt;br /&gt;　　{ } &lt;br /&gt;　　private List&lt; IPRange&gt; _IPRangeList = new List&lt; IPRange&gt;(); &lt;br /&gt;　　private bool _NeedSort = true; &lt;br /&gt;　　public void Add(IPRange ipRange) &lt;br /&gt;　　{ &lt;br /&gt;　　_IPRangeList.Add(ipRange); &lt;br /&gt;　　_NeedSort = true; &lt;br /&gt;　　} &lt;br /&gt;　　private void Sort() &lt;br /&gt;　　{ &lt;br /&gt;　　if (_NeedSort) &lt;br /&gt;　　{ &lt;br /&gt;　　_IPRangeList.Sort(new Comparison(IPRange.Compare)); &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;　　public IPRange Search(string ipString) &lt;br /&gt;　　{ &lt;br /&gt;　　ulong ip = IPRange.IP2A(ipString); &lt;br /&gt;　　this.Sort(); &lt;br /&gt;　　foreach (IPRange ir in _IPRangeList) &lt;br /&gt;　　{ &lt;br /&gt;　　if (ir.BeginIP &lt;= ip &amp;&amp; ir.EndIP &gt;= ip) &lt;br /&gt;　　{ &lt;br /&gt;　　return ir; &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;　　return null; &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　完毕。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-6567031669635909630?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/6567031669635909630/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=6567031669635909630' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/6567031669635909630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/6567031669635909630'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/cip.html' title='使用C#编写查询IP段功能的程序'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-1081758250510954723</id><published>2008-10-21T05:05:00.004-07:00</published><updated>2008-10-21T05:06:16.866-07:00</updated><title type='text'>C# 中的常用正则表达式总结</title><content type='html'>这是我发了不少时间整理的C#的正则表达式，新手朋友注意一定要手册一下哦，这样可以节省很多写代码的时间，中国自学编程网为新手朋友整理发布。&lt;br /&gt;&lt;br /&gt;　　只能输入数字："^[0-9]*$"。&lt;br /&gt;&lt;br /&gt;　　只能输入n位的数字："^\d{n}$"。&lt;br /&gt;&lt;br /&gt;　　只能输入至少n位的数字："^\d{n,}$"。&lt;br /&gt;&lt;br /&gt;　　只能输入m~n位的数字：。"^\d{m,n}$"&lt;br /&gt;&lt;br /&gt;　　只能输入零和非零开头的数字："^(0|[1-9][0-9]*)$"。&lt;br /&gt;&lt;br /&gt;　　只能输入有两位小数的正实数："^[0-9]+(.[0-9]{2})?$"。&lt;br /&gt;&lt;br /&gt;　　只能输入有1~3位小数的正实数："^[0-9]+(.[0-9]{1,3})?$"。&lt;br /&gt;&lt;br /&gt;　　只能输入非零的正整数："^\+?[1-9][0-9]*$"。&lt;br /&gt;&lt;br /&gt;　　只能输入非零的负整数："^\-[1-9][]0-9"*$。&lt;br /&gt;&lt;br /&gt;　　只能输入长度为3的字符："^.{3}$"。&lt;br /&gt;&lt;br /&gt;　　只能输入由26个英文字母组成的字符串："^[A-Za-z]+$"。&lt;br /&gt;&lt;br /&gt;　　只能输入由26个大写英文字母组成的字符串："^[A-Z]+$"。&lt;br /&gt;&lt;br /&gt;　　只能输入由26个小写英文字母组成的字符串："^[a-z]+$"。&lt;br /&gt;&lt;br /&gt;　　只能输入由数字和26个英文字母组成的字符串："^[A-Za-z0-9]+$"。&lt;br /&gt;&lt;br /&gt;　　只能输入由数字、26个英文字母或者下划线组成的字符串："^\w+$"。&lt;br /&gt;&lt;br /&gt;　　验证用户密码："^[a-zA-Z]\w{5,17}$"正确格式为：以字母开头，长度在6~18之间，只能包含字符、数字和下划线。&lt;br /&gt;&lt;br /&gt;　　验证是否含有^%&amp;’,;=?$\"等字符："[^%&amp;’,;=?$\x22]+"。&lt;br /&gt;&lt;br /&gt;　　只能输入汉字："^[\u4e00-\u9fa5]{0,}$"&lt;br /&gt;&lt;br /&gt;　　验证Email地址："^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。&lt;br /&gt;&lt;br /&gt;　　验证InternetURL："^http://([\w-]+\.)+[\w-]+(/[\w-./?%&amp;=]*)?$"。&lt;br /&gt;&lt;br /&gt;　　验证电话号码："^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为："XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。&lt;br /&gt;&lt;br /&gt;　　验证身份证号(15位或18位数字)："^\d{15}|\d{18}$"。&lt;br /&gt;&lt;br /&gt;　　验证一年的12个月："^(0?[1-9]|1[0-2])$"正确格式为："01"～"09"和"1"～"12"。&lt;br /&gt;&lt;br /&gt;　　验证一个月的31天："^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"～"09"和"1"～"31"。&lt;br /&gt;&lt;br /&gt;　　利用正则表达式限制网页表单里的文本框输入内容：&lt;br /&gt;&lt;br /&gt;　　用正则表达式限制只能输入中文：onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,’’)" onbeforepaste="cliPBoardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\u4E00-\u9FA5]/g,’’))"&lt;br /&gt;&lt;br /&gt;　　用正则表达式限制只能输入全角字符： onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,’’)" onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\uFF00-\uFFFF]/g,’’))"&lt;br /&gt;&lt;br /&gt;　　用正则表达式限制只能输入数字：onkeyup="value=value.replace(/[^\d]/g,’’) "onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,’’))"&lt;br /&gt;&lt;br /&gt;　　用正则表达式限制只能输入数字和英文：onkeyup="value=value.replace(/[\W]/g,’’) "onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,’’))"&lt;br /&gt;&lt;br /&gt;　　得用正则表达式从URL地址中提取文件名的JavaScript程序，如下结果为page1&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　s="http://www.9499.net/page1.htm" &lt;br /&gt;　　s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2") &lt;br /&gt;　　alert(s) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　匹配双字节字符(包括汉字在内)：[^\x00-\xff]&lt;br /&gt;&lt;br /&gt;　　应用：计算字符串的长度(一个双字节字符长度计2，ASCII字符计1)&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　匹配空行的正则表达式：\n[\s| ]*\r&lt;br /&gt;&lt;br /&gt;　　匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/&lt;br /&gt;&lt;br /&gt;　　匹配首尾空格的正则表达式：(^\s*)|(\s*$)&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　String.prototype.trim = function() &lt;br /&gt;　　{ &lt;br /&gt;　　return this.replace(/(^\s*)|(\s*$)/g, ""); &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　利用正则表达式分解和转换IP地址：&lt;br /&gt;&lt;br /&gt;　　下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序：&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　function IP2V(ip) &lt;br /&gt;　　{ &lt;br /&gt;　　re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式 &lt;br /&gt;　　if(re.test(ip)) &lt;br /&gt;　　{ &lt;br /&gt;　　return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 &lt;br /&gt;　　} &lt;br /&gt;　　else &lt;br /&gt;　　{ &lt;br /&gt;　　throw new Error("Not a valid IP address!") &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下：&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　var ip="10.100.20.168" &lt;br /&gt;　　ip=ip.split(".") &lt;br /&gt;　　alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1)) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　符号解释：&lt;br /&gt;&lt;br /&gt;　　\&lt;br /&gt;&lt;br /&gt;　　将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如，’n’ 匹配字符 "n"。’\n’ 匹配一个换行符。序列 ’\\’ 匹配 "\" 而 "\(" 则匹配 "("。&lt;br /&gt;&lt;br /&gt;　　^&lt;br /&gt;&lt;br /&gt;　　匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。&lt;br /&gt;&lt;br /&gt;　　$&lt;br /&gt;&lt;br /&gt;　　匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。&lt;br /&gt;&lt;br /&gt;　　*&lt;br /&gt;&lt;br /&gt;　　匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。&lt;br /&gt;&lt;br /&gt;　　+&lt;br /&gt;&lt;br /&gt;　　匹配前面的子表达式一次或多次。例如，’zo+’ 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。&lt;br /&gt;&lt;br /&gt;　　?&lt;br /&gt;&lt;br /&gt;　　匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。&lt;br /&gt;&lt;br /&gt;　　{n}&lt;br /&gt;&lt;br /&gt;　　n 是一个非负整数。匹配确定的 n 次。例如，’o{2}’ 不能匹配 "Bob" 中的 ’o’，但是能匹配 "food" 中的两个 o。&lt;br /&gt;&lt;br /&gt;　　{n,}&lt;br /&gt;&lt;br /&gt;　　n 是一个非负整数。至少匹配n 次。例如，’o{2,}’ 不能匹配 "Bob" 中的 ’o’，但能匹配 "foooood" 中的所有 o。’o{1,}’ 等价于 ’o+’。’o{0,}’ 则等价于 ’o*’。&lt;br /&gt;&lt;br /&gt;　　{n,m}&lt;br /&gt;&lt;br /&gt;　　m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。’o{0,1}’ 等价于 ’o?’。请注意在逗号和两个数之间不能有空格。&lt;br /&gt;&lt;br /&gt;　　?&lt;br /&gt;&lt;br /&gt;　　当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，’o+?’ 将匹配单个 "o"，而 ’o+’ 将匹配所有 ’o’。&lt;br /&gt;&lt;br /&gt;　　.&lt;br /&gt;&lt;br /&gt;　　匹配除 "\n" 之外的任何单个字符。要匹配包括 ’\n’ 在内的任何字符，请使用象 ’[.\n]’ 的模式。&lt;br /&gt;&lt;br /&gt;　　(pattern)&lt;br /&gt;&lt;br /&gt;　　匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在JScript 中则使用 $0…$9 属性。要匹配圆括号字符，请使用 ’\(’ 或 ’\)’。&lt;br /&gt;&lt;br /&gt;　　(?:pattern)&lt;br /&gt;&lt;br /&gt;　　匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， ’industr(?:y|ies) 就是一个比 ’industry|industries’ 更简略的表达式。&lt;br /&gt;&lt;br /&gt;　　(?=pattern)&lt;br /&gt;&lt;br /&gt;　　正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，’Windows (?=95|98|NT|2000)’ 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。&lt;br /&gt;&lt;br /&gt;　　(?!pattern)&lt;br /&gt;&lt;br /&gt;　　负向预查，在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如’Windows (?!95|98|NT|2000)’ 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始&lt;br /&gt;&lt;br /&gt;　　x|y&lt;br /&gt;&lt;br /&gt;　　匹配 x 或 y。例如，’z|food’ 能匹配 "z" 或 "food"。’(z|f)ood’ 则匹配 "zood" 或 "food"。&lt;br /&gt;&lt;br /&gt;　　[xyz]&lt;br /&gt;&lt;br /&gt;　　字符集合。匹配所包含的任意一个字符。例如， ’[abc]’ 可以匹配 "plain" 中的 ’a’。&lt;br /&gt;&lt;br /&gt;　　[^xyz]&lt;br /&gt;&lt;br /&gt;　　负值字符集合。匹配未包含的任意字符。例如， ’[^abc]’ 可以匹配 "plain" 中的’p’。&lt;br /&gt;&lt;br /&gt;　　[a-z]&lt;br /&gt;&lt;br /&gt;　　字符范围。匹配指定范围内的任意字符。例如，’[a-z]’ 可以匹配 ’a’ 到 ’z’ 范围内的任意小写字母字符。&lt;br /&gt;&lt;br /&gt;　　[^a-z]&lt;br /&gt;&lt;br /&gt;　　负值字符范围。匹配任何不在指定范围内的任意字符。例如，’[^a-z]’ 可以匹配任何不在 ’a’ 到 ’z’ 范围内的任意字符。&lt;br /&gt;&lt;br /&gt;　　\b&lt;br /&gt;&lt;br /&gt;　　匹配一个单词边界，也就是指单词和空格间的位置。例如， ’er\b’ 可以匹配"never" 中的 ’er’，但不能匹配 "verb" 中的 ’er’。&lt;br /&gt;&lt;br /&gt;　　\B&lt;br /&gt;&lt;br /&gt;　　匹配非单词边界。’er\B’ 能匹配 "verb" 中的 ’er’，但不能匹配 "never" 中的 ’er’。 &lt;br /&gt;&lt;br /&gt;\cx&lt;br /&gt;&lt;br /&gt;　　匹配由 x 指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 ’c’ 字符。&lt;br /&gt;&lt;br /&gt;　　\d&lt;br /&gt;&lt;br /&gt;　　匹配一个数字字符。等价于 [0-9]。&lt;br /&gt;&lt;br /&gt;　　\D&lt;br /&gt;&lt;br /&gt;　　匹配一个非数字字符。等价于 [^0-9]。&lt;br /&gt;&lt;br /&gt;　　\f&lt;br /&gt;&lt;br /&gt;　　匹配一个换页符。等价于 \x0c 和 \cL。&lt;br /&gt;&lt;br /&gt;　　\n&lt;br /&gt;&lt;br /&gt;　　匹配一个换行符。等价于 \x0a 和 \cJ。&lt;br /&gt;&lt;br /&gt;　　\r&lt;br /&gt;&lt;br /&gt;　　匹配一个回车符。等价于 \x0d 和 \cM。&lt;br /&gt;&lt;br /&gt;　　\s&lt;br /&gt;&lt;br /&gt;　　匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。&lt;br /&gt;&lt;br /&gt;　　\S&lt;br /&gt;&lt;br /&gt;　　匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。&lt;br /&gt;&lt;br /&gt;　　\t&lt;br /&gt;&lt;br /&gt;　　匹配一个制表符。等价于 \x09 和 \cI。&lt;br /&gt;&lt;br /&gt;　　\v&lt;br /&gt;&lt;br /&gt;　　匹配一个垂直制表符。等价于 \x0b 和 \cK。&lt;br /&gt;&lt;br /&gt;　　\w&lt;br /&gt;&lt;br /&gt;　　匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。&lt;br /&gt;&lt;br /&gt;　　\W&lt;br /&gt;&lt;br /&gt;　　匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。&lt;br /&gt;&lt;br /&gt;　　\xn&lt;br /&gt;&lt;br /&gt;　　匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，’\x41’ 匹配 "A"。’\x041’ 则等价于 ’\x04’ &amp; "1"。正则表达式中可以使用 ASCII 编码。.&lt;br /&gt;&lt;br /&gt;　　\num&lt;br /&gt;&lt;br /&gt;　　匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，’(.)\1’ 匹配两个连续的相同字符。&lt;br /&gt;&lt;br /&gt;　　\n&lt;br /&gt;&lt;br /&gt;　　标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为向后引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。&lt;br /&gt;&lt;br /&gt;　　\nm&lt;br /&gt;&lt;br /&gt;　　标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式，则 nm 为向后引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。&lt;br /&gt;&lt;br /&gt;　　\nml&lt;br /&gt;&lt;br /&gt;　　如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。&lt;br /&gt;&lt;br /&gt;　　\un&lt;br /&gt;&lt;br /&gt;　　匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-1081758250510954723?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/1081758250510954723/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=1081758250510954723' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1081758250510954723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1081758250510954723'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_669.html' title='C# 中的常用正则表达式总结'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-8480166751875364214</id><published>2008-10-21T05:05:00.003-07:00</published><updated>2008-10-21T05:05:56.920-07:00</updated><title type='text'>C#也能动态生成Word文档并填充数据</title><content type='html'>要使用C#操作word，首先要添加引用： &lt;br /&gt;       1、添加引用-&gt;COM-&gt;Microsoft Word 11.0 Object Library&lt;br /&gt;&lt;br /&gt;       2、在.cs文件中添加&lt;br /&gt;&lt;br /&gt;using Word;&lt;br /&gt;下面的例子中包括C#对Word文档的创建、插入表格、设置样式等操作：&lt;br /&gt;&lt;br /&gt;（例子中代码有些涉及数据信息部分被省略，重要是介绍一些C#操作word文档的方法）&lt;br /&gt;&lt;br /&gt;        public string CreateWordFile(string CheckedInfo)&lt;br /&gt;        ...{&lt;br /&gt;            string message = "";&lt;br /&gt;            try&lt;br /&gt;            ...{&lt;br /&gt;                Object Nothing = System.Reflection.Missing.Value;&lt;br /&gt;                Directory.CreateDirectory("C:/CNSI");  //创建文件所在目录&lt;br /&gt;                string name = "CNSI_" + DateTime.Now.ToShortString()+".doc";&lt;br /&gt;                object filename = "C://CNSI//" + name;  //文件保存路径&lt;br /&gt;                //创建Word文档&lt;br /&gt;                Word.Application WordApp = new Word.ApplicationClass();&lt;br /&gt;                Word.Document WordDoc = WordApp.Documents.Add(ref Nothing, ref Nothing, ref Nothing, ref Nothing);&lt;br /&gt;&lt;br /&gt;                //添加页眉&lt;br /&gt;                WordApp.ActiveWindow.View.Type = WdViewType.wdOutlineView;&lt;br /&gt;                WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekPrimaryHeader;&lt;br /&gt;                WordApp.ActiveWindow.ActivePane.Selection.InsertAfter("[页眉内容]");&lt;br /&gt;                WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;//设置右对齐&lt;br /&gt;                WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekMainDocument;//跳出页眉设置&lt;br /&gt;&lt;br /&gt;                WordApp.Selection.ParagraphFormat.LineSpacing = 15f;//设置文档的行间距&lt;br /&gt;&lt;br /&gt;                //移动焦点并换行&lt;br /&gt;                object count = 14;&lt;br /&gt;                object WdLine = Word.WdUnits.wdLine;//换一行;&lt;br /&gt;                 WordApp.Selection.MoveDown(ref WdLine, ref count, ref Nothing);//移动焦点&lt;br /&gt;                 WordApp.Selection.TypeParagraph();//插入段落&lt;br /&gt;&lt;br /&gt;                 //文档中创建表格&lt;br /&gt;                 Word.Table newTable = WordDoc.Tables.Add(WordApp.Selection.Range, 12, 3, ref Nothing, ref Nothing);&lt;br /&gt;                 //设置表格样式&lt;br /&gt;                 newTable.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleThickThinLargeGap;&lt;br /&gt;                 newTable.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;&lt;br /&gt;                 newTable.Columns[1].Width = 100f;&lt;br /&gt;                 newTable.Columns[2].Width = 220f;&lt;br /&gt;                 newTable.Columns[3].Width = 105f;&lt;br /&gt;&lt;br /&gt;                 //填充表格内容&lt;br /&gt;                 newTable.Cell(1, 1).Range.Text = "产品详细信息表";&lt;br /&gt;                 newTable.Cell(1, 1).Range.Bold = 2;//设置单元格中字体为粗体&lt;br /&gt;                 //合并单元格&lt;br /&gt;                 newTable.Cell(1, 1).Merge(newTable.Cell(1, 3));&lt;br /&gt;                 WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;//垂直居中&lt;br /&gt;                 WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;//水平居中&lt;br /&gt;                        &lt;br /&gt;                 //填充表格内容&lt;br /&gt;                 newTable.Cell(2, 1).Range.Text = "产品基本信息";&lt;br /&gt;                 newTable.Cell(2, 1).Range.Font.Color = Word.WdColor.wdColorDarkBlue;//设置单元格内字体颜色&lt;br /&gt;                 //合并单元格&lt;br /&gt;                 newTable.Cell(2, 1).Merge(newTable.Cell(2, 3));&lt;br /&gt;                 WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;&lt;br /&gt;&lt;br /&gt;                  //填充表格内容&lt;br /&gt;                  newTable.Cell(3, 1).Range.Text = "品牌名称：";&lt;br /&gt;                  newTable.Cell(3, 2).Range.Text = BrandName;&lt;br /&gt;                  //纵向合并单元格&lt;br /&gt;                  newTable.Cell(3, 3).Select();//选中一行&lt;br /&gt;                  object moveUnit = Word.WdUnits.wdLine;&lt;br /&gt;                  object moveCount = 5;&lt;br /&gt;                  object moveExtend = Word.WdMovementType.wdExtend;&lt;br /&gt;                   WordApp.Selection.MoveDown(ref moveUnit, ref moveCount, ref moveExtend);&lt;br /&gt;                   WordApp.Selection.Cells.Merge();&lt;br /&gt;                   //插入图片&lt;br /&gt;                   string FileName = Picture;//图片所在路径&lt;br /&gt;                   object LinkToFile = false;&lt;br /&gt;                   object SaveWithDocument = true;&lt;br /&gt;                   object Anchor = WordDoc.Application.Selection.Range;&lt;br /&gt;                   WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Anchor);&lt;br /&gt;                    WordDoc.Application.ActiveDocument.InlineShapes[1].Width = 100f;//图片宽度&lt;br /&gt;                    WordDoc.Application.ActiveDocument.InlineShapes[1].Height = 100f;//图片高度&lt;br /&gt;                    //将图片设置为四周环绕型&lt;br /&gt;                    Word.Shape s = WordDoc.Application.ActiveDocument.InlineShapes[1].ConvertToShape();&lt;br /&gt;                    s.WrapFormat.Type = Word.WdWrapType.wdWrapSquare;&lt;br /&gt;                        &lt;br /&gt;                    newTable.Cell(12, 1).Range.Text = "产品特殊属性";&lt;br /&gt;                    newTable.Cell(12, 1).Merge(newTable.Cell(12, 3));&lt;br /&gt;                     //在表格中增加行&lt;br /&gt;                     WordDoc.Content.Tables[1].Rows.Add(ref Nothing);&lt;br /&gt;                      &lt;br /&gt;                     WordDoc.Paragraphs.Last.Range.Text = "文档创建时间：" + DateTime.Now.ToString();//“落款”&lt;br /&gt;                     WordDoc.Paragraphs.Last.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;&lt;br /&gt;&lt;br /&gt;                    //文件保存&lt;br /&gt;                    WordDoc.SaveAs(ref filename, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing);&lt;br /&gt;                    WordDoc.Close(ref Nothing, ref Nothing, ref Nothing);&lt;br /&gt;                    WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);&lt;br /&gt;                    message=name+"文档生成成功，以保存到C:CNSI下";&lt;br /&gt;            }&lt;br /&gt;            catch&lt;br /&gt;            ...{&lt;br /&gt;                message = "文件导出异常！";&lt;br /&gt;            }&lt;br /&gt;            return message;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;　　查阅关于C#的全部文档&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-8480166751875364214?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/8480166751875364214/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=8480166751875364214' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8480166751875364214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8480166751875364214'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/cword_21.html' title='C#也能动态生成Word文档并填充数据'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-8527471273693405729</id><published>2008-10-21T05:05:00.001-07:00</published><updated>2008-10-21T05:05:36.739-07:00</updated><title type='text'>C#和ASP.NET开发的一些小技巧及注意事项</title><content type='html'>　　1、构造函数不能带返回值类型，因为构造函数返回就是对象本身。 &lt;br /&gt;&lt;br /&gt;　　2、将字符串转换成日期类型，用DateTime.Parese()或DateTime.ParseExact()函数。&lt;br /&gt;&lt;br /&gt;　　3、if(!Page.IsPostback){}&lt;br /&gt;&lt;br /&gt;　　使用该函数，使网页仅在第一次加载时运行函数体的内容，在Page_Load()事件中，通常可用于初始化。如果不使用该函数，则可能会在一些控件回传时再次运行if（）函数体内的内容，导致相关控件修改后的值没有正确应用。&lt;br /&gt;&lt;br /&gt;　　4、GridView的字段（BoundField）有一个属性HtmlEncode。这个属性用于将HTML进行包装，如果为true(默认值)，则原样显示字段内的内容。如果为false，则将字段内相应的HTML标签进行渲染。因此，要使字段内的图片链接显示出来，应设置HtmlEncode=“true”。&lt;br /&gt;&lt;br /&gt;　　5、网页中获取日期后进行格式化的方法：Eval("wtDate", "{0:yyyy-MM-dd}")但在DateTime.Now.Date.ToString("yyyy-MM-dd") 中的字符串格式化却有所不同。&lt;br /&gt;&lt;br /&gt;　　6、NVarChar数据类型，在SQL SERVER 2005中具有NVarChar(max)类型来代表最大为2^32 的数字，但是在.net2.0中并不支持这个类型，NVarChar最大能表示的数仍为4000字节。&lt;br /&gt;&lt;br /&gt;　　7、将字符串类型转换为Guid类型，可将字符串作为Guid构造函数的参数进行传递。&lt;br /&gt;&lt;br /&gt;如： Guid gd = New Guid(string);&lt;br /&gt;Guid类型的空值为Guid.Empty ,而非null。&lt;br /&gt;&lt;br /&gt;　　8、最好对各字段都存储值，即便不使用，也就进行初始设置，以避免为空值时，出现数据类型不匹配现象，如DateTime，uniqueIdentifier字段，取出空值进行处理时会带来麻烦。&lt;br /&gt;&lt;br /&gt;　　9、对记录数进行统计,使用类似下面的语句:&lt;br /&gt;&lt;br /&gt;int cout =(int)cmd.ExecuteScalar();&lt;br /&gt;&lt;br /&gt;　　10、存储过程中，通配符与参数结合使用，要采用字符串加法，而不能直接放在参数两侧，如下：&lt;br /&gt;&lt;br /&gt;WHERE RTRIM(f.ftTitle) LIKE '%'+RTRIM(@searchkey)+'%'&lt;br /&gt;&lt;br /&gt;　　11、要获取list&lt;T&gt;对象中某个项的值，可采用如下方法：&lt;br /&gt;&lt;br /&gt;　　如List&lt;ftInfo&gt; CurrentFault = new List&lt;ftInfo&gt;();//创建一个对象&lt;br /&gt;&lt;br /&gt;　　 假设ftInfo类中定义了ftIsResovled属性，那么，要获取CurrentFault的第0项的ftIsResolved值，可通过语名： CurrentFault[0].ftIsResolved 来获得。&lt;br /&gt;&lt;br /&gt;　　12、Input控件中包含有标签的内容（如）时，可能会有如下因为安全问题引起的错误：说明: 请求验证过程检测到有潜在危险的客户端输入值，对请求的处理已经中止。该值可能指示危及应用程序安全的尝试，如跨站点的脚本攻击。通过在 Page 指令或 配置节中设置 validateRequest=false 可以禁用请求验证。但是，在这种情况下，强烈建议应用程序显式检查所有输入。&lt;br /&gt;&lt;br /&gt;　　13、显示带有HTML标记的字段内容，如果需要渲染HTML标签，可以设置htmlencode属性为true。设置为false时，字段内的HTML标签将按普通字符显示。也可以使用HtmlEncode()方法来渲染字段内容的HTML标签。&lt;br /&gt;&lt;br /&gt;　　14、LoginStatus控件可以方便地显示登录状态，并且提供登录和注销的快捷链接。但有时并不方便，特别是注销的同时要退出框架网页时，使用该控件就显得力不从心。可以直接使用LinkButton控件，在点击事件中，添加如下两句，就可以实现注销的同时跳转到框架网页的父窗口：&lt;br /&gt;&lt;br /&gt;FormsAuthentication.SignOut();&lt;br /&gt;Response.Write("&lt;script language=javascript&gt; window.open('../Default.aspx',target='_top')&lt;/script&gt;");&lt;br /&gt;&lt;br /&gt;　　15、C#中关闭窗口：&lt;br /&gt;&lt;br /&gt;Response.Write("&lt;script language:javascript&gt;javascript：window.close();&lt;/script&gt;");&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-8527471273693405729?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/8527471273693405729/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=8527471273693405729' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8527471273693405729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8527471273693405729'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/caspnet.html' title='C#和ASP.NET开发的一些小技巧及注意事项'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-8285432404049997189</id><published>2008-10-21T05:04:00.004-07:00</published><updated>2008-10-21T05:05:16.875-07:00</updated><title type='text'>如何才能学好C＃</title><content type='html'>　　1.微软支持&lt;br /&gt;　　在你学习VS.NET的过程中，有疑问首先要向MicroSoft求助。如果你不懂得利用MicroSoft提供的庞大的学习资源，我要告诉你，你很不幸，你舍近求远了。&lt;br /&gt;　　（1）首先，你要安装MSDN,他比所有VS.NET书籍详细。我为了装MSDN，可是牺牺了我的98和XP双启动，改成WindowsXP单系统。装了MSDN后，你要学习正则表达式，VS.NET 2003中点击“帮助”，再点击“搜索”，然后输入“正则”，一回车，哇，找到470个主题，这下你慢慢研究吧。实在研究不透，也不用急，还有Google和CSDN呢。　　　 &lt;br /&gt;　　（2）在线Microsoft .NET 框架 SDK 快速入门教程（http://chs.gotdotnet.com/QuickStart），可配合MSDN使用。分三块内容， ASP.NET | Windows 窗体 | 如何...?常见任务 。 “常见任务快速入门”旨在帮助您快速找到常见编程问题的答案。&lt;br /&gt;　　（3）微软中国社区（http://www.mscommunity.com/Profile/）。在社区注册，有问题就到社区去提问吧。&lt;br /&gt;　 （4）在线中文MSDN（http://www.microsoft.com/china/MSDN/default.asp）；在线英文MSDN（http://msdn.microsoft.com/）,考考你的E文，不过有金山词霸在，我都不怕，你还用怕什么呢！&lt;br /&gt;　　（5）.NET主页（http://www.microsoft.com/china/net）&lt;br /&gt;　 （6）Visual Studio .NET主页（http://www.microsoft.com/china/msdn/vstudio/prodinfo/overview.asp)。&lt;br /&gt;　　 为什么选择VS.NET，为什么看好VS.NET,看看MicroSoft的Help文档有多详尽就知道了。如果你不去利用MicroSoft提供的庞大的Help资源，是不是有点对不起盖茨呢！　　 &lt;br /&gt;　　2.CSDN　http://www.csdn.net/&lt;br /&gt;　　CSDN号称最大的开发者网络，确实不假。我最常去的是CSDN的&lt;br /&gt;　　文档（http://www.csdn.net/develop/）&lt;br /&gt;　　论坛（http://expert.csdn.net/expert/forum.asp)&lt;br /&gt;　　只要你善于利用搜索功能，你在开发中遇到的多数问题可在文档和论坛中找到答案。如果你在开发过程中遇到疑难，而你又认为 BillGates帮不上你的忙，那么，你就上CSDN吧，一定会让你满意的。&lt;br /&gt;　　 教你两个绝招，第一招，是“搜索大法”。遇到问题，首先是在CSDN的文档和论坛进行搜索，看有无类似答案。如不行，再下一招。&lt;br /&gt;　　 第二招，“提问大法”，只要有礼貌有诚意地在论坛提问，一定有许多人乐于回答你的问题。&lt;br /&gt;　　3.其他相关网站&lt;br /&gt;　　 有不少网站开辟VS.NET专栏，常去看看，必有收获。&lt;br /&gt;　　pconline跟我学NET专栏（http://www.pconline.com.cn/pcedu/empolder/net/）&lt;br /&gt;　 yesky的Visual Studio.NET专栏（http://www.yesky.com/SoftChannel/72342380467978240/index.shtml） &lt;br /&gt;　 ccidnet的NET专区（http://tech.ccidnet.com/pub/column/c340.html）&lt;br /&gt;　　4.资料下载&lt;br /&gt;　　如果不是包月上网，那么下载大量资源，再断线慢慢研究就很有必要了。&lt;br /&gt;　　91asp提供电子书下载（http://www.91asp.cn/）&lt;br /&gt;　 网友提供的大量VS.NET资源下载（ftp://qydn.vicp.net）　&lt;br /&gt;北京希望电子出版社图书素材资料下载(http://www.b-xr.com/bbs.htm)&lt;br /&gt;　&lt;br /&gt;　　清华大学出版社VS.NET源码下载(http://www.wenyuan.com.cn/xiazai.htm)&lt;br /&gt;　　5.国外资源&lt;br /&gt;　　 如果你的E文不错，不妨上E文网站去取经。&lt;br /&gt;　　http://www.codestudy.com &lt;br /&gt;　　http://www.codeproject.com &lt;br /&gt;　　http://www.only4gurus.com/v2&lt;br /&gt;　　http://www.gotdotnet.com &lt;br /&gt;　　http://www.aspnetpro.com&lt;br /&gt;　　6.其他特色网站、专栏&lt;br /&gt;　　CSDN上Latitude的VS.NET专栏（http://www.csdn.net/develop/author/netauthor/Latitude/）&lt;br /&gt;　 【孟宪会之精彩世界】（http://xml.sz.luohuedu.net/xml/）　&lt;br /&gt;　　DotNet中华网（http://www.aspxcn.com/）&lt;br /&gt;　　 ASP酷（http://www.aspcool.com/） &lt;br /&gt;　　http://www.chinaaspx.com &lt;br /&gt;　　 当然，还有一个地球人都知道的，全球最大的知识仓库，我不说，你也早就应该知道的，那不是http://www.google.com又是什么！ &lt;br /&gt;&lt;br /&gt;　　个人体会：掌握并利用大量网络资源来辅助VS.NET的学习，你将事半功倍。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-8285432404049997189?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/8285432404049997189/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=8285432404049997189' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8285432404049997189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8285432404049997189'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_2331.html' title='如何才能学好C＃'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-1697901335355560280</id><published>2008-10-21T05:04:00.003-07:00</published><updated>2008-10-21T05:04:55.799-07:00</updated><title type='text'>C#语言基础常见问题汇总</title><content type='html'>概述&lt;br /&gt;&lt;br /&gt;1、什么是C#?&lt;br /&gt;&lt;br /&gt;C#是Microsoft公司设计的一种编程语言。它松散地基于C/C++，并且有很多方面和Java类似。&lt;br /&gt;&lt;br /&gt;Microsoft是这样描述C#的：“C#是从C和C++派生来的一种简单、现代、面向对象和类型安全的编程语言。C#(读做‘Csharp’)主要是从C/C++编程语言家族移植过来的，C和C++的程序员会马上熟悉它。C#试图结合Visual Basic的快速开发能力和C++的强大灵活的能力。”&lt;br /&gt;&lt;br /&gt;2、如何开发C#应用程序?&lt;br /&gt;&lt;br /&gt;.NET SDK包括了C#命令行编译器(csc.exe)，下一个版本的Visual Studio (Visual Studio 7 or Visual Studio.NET)会包含对C#开发的完整支持。&lt;br /&gt;&lt;br /&gt;3、C#可以取代Java?&lt;br /&gt;&lt;br /&gt;C#非常像Java语言——这两种语言的核心和C++相比都有相似的优缺点。例如，两个语言都有垃圾回收，但是两个语言都没有模板（template）。Microsoft已经中止了Visual J++产品，因此很难不认为Microsoft在使用C#来替代Java。&lt;br /&gt;&lt;br /&gt;4、C#可以取代C++?&lt;br /&gt;&lt;br /&gt;显然是不，但是我们又很难说C++是新的.NET平台上编写代码的最佳选择。为了使.NET的运行层能完全发挥作用，它要求编程语言遵循某些特定的规则——其中之一就是所有的语言类型必须遵守通用类型系统(Common Type System，CTS）。不幸的是，许多C++特性不能被CTS支持。例如，模板和类的多重继承。&lt;br /&gt;&lt;br /&gt;Microsoft对这个问题的答案是给C++提供可管理的扩展（Managed Extensions，ME）， 这可以使C++遵守CTS。通过添加新的关键字来标记C++类有CTS的属性(例如.-gc表示垃圾回收)。但是在创建新的工程时很难讲为什么ME C++会比C#更合适。就特征（feature）而言它们很相似，但与C++不同的是C#从一开始就以.NET为环境设计的。ME C++存在的理由好像是将C++代码移植（port）为.NET环境下的代码。&lt;br /&gt;&lt;br /&gt;因此，这个问题的答案，很可能是C++作为一个.NET环境之外的语言将依然保留它的重要性；而通过ME将现存的C++代码移植为适合.NET环境；但是很可能C#将是C++开发者开发新的.NET应用程序的最好选择。&lt;br /&gt;&lt;br /&gt;8、C#是面向对象的吗?&lt;br /&gt;&lt;br /&gt;是的，C#像Java和C++一样，是一个面向对象的语言。&lt;br /&gt;&lt;br /&gt;9、C#有自己的类库吗?&lt;br /&gt;&lt;br /&gt;不，就像所有的.NET语言（VB.Net，JScript .Net...）一样，C#访问.NET类库，C#没有自己的类库。&lt;br /&gt;&lt;br /&gt;基本类型&lt;br /&gt;&lt;br /&gt;1、C#提供什么标准类型?&lt;br /&gt;&lt;br /&gt;C# 支持的基本类型和C++很相似，包括int, long, float, double, char, string, arrays, structs 和 classes。然而，不要假设太多，名字可能很形似，但是一些细节不相同。例如C#中的long是64位的，而C++的long取决于平台，32位的平台上是32位的，64位的平台上是64位的。class和struct在C++中几乎完全一样，但在C#中并不是这样的。&lt;br /&gt;&lt;br /&gt;2、是否所有的C#类型都派生于一个公共的基类?&lt;br /&gt;&lt;br /&gt;是，也不是，所有的对象都可以看作从Object (System.Object)派生而来。但是为了把像int，float这样的值类型实例看作是从Object对象派生的，这个实例必须通过一个装箱的操作(boxing)转化为引用类型。理论上，开发者可以忽略这些底层的转化，但是认识到这点对于系统性能影响很重要。&lt;br /&gt;&lt;br /&gt;3、是否可以这样认为，可以将一个值类型的实例作为参数传给以对象为参数的方法？&lt;br /&gt;&lt;br /&gt;是的，例如：&lt;br /&gt;&lt;br /&gt;class CApplication {    &lt;br /&gt;public static void Main() {    &lt;br /&gt;int x = 25;    &lt;br /&gt;string s = “fred”;    &lt;br /&gt;DisplayMe( x );    &lt;br /&gt;DisplayMe( s ); }    &lt;br /&gt;static void DisplayMe( object o ) {    &lt;br /&gt;System.Console.WriteLine( “You are {0}”， o ); }} &lt;br /&gt;&lt;br /&gt;将显示：&lt;br /&gt;&lt;br /&gt;You are 25    &lt;br /&gt;You are fred&lt;br /&gt;&lt;br /&gt;4、值类型和引用类型的最基本的区别是什么？&lt;br /&gt;&lt;br /&gt;C#将类型分为两类，一类是值类型，另一类是引用类型。大部分固有的基本类型（如int, char）是值类型，structs 也是值类型。引用类型包括类、接口、数组和字符串。基本的概念非常简单，那就是一个值类型的实例代表了实际的数据（存在栈中），而一个引用类型的实例代表指向数据的指针或者引用（存在堆中）。&lt;br /&gt;&lt;br /&gt;C++开发者最容易混淆的地方是：C#已经自己预定义了一些类型作为值类型，一些作为引用类型，而一个C++的开发者希望能够自己控制。&lt;br /&gt;&lt;br /&gt;例如，在C++中，我们可以这样做：&lt;br /&gt;&lt;br /&gt;int x1 = 3; // x1 是堆栈上的值    &lt;br /&gt;int *x2 = new int(3) // x2 是堆的一个值的引用&lt;br /&gt;&lt;br /&gt;但是在C#中没有这样的控制：&lt;br /&gt;&lt;br /&gt;int x1 = 3; // x1是堆栈上的值    &lt;br /&gt;int x2 = new int();    &lt;br /&gt;x2 = 3; // x2还是堆栈上的值! &lt;br /&gt;&lt;br /&gt;5、既然 int是值类型，而 class是引用类型，那么int是怎样从Object派生的呢？&lt;br /&gt;&lt;br /&gt;是这样的，当int用作int时候，这是一个值类型（在栈上），然而，当它用作是Object时，这是一个引用堆上的整数值的引用类型。换而言之，当你将int看作对象时，运行层将它自动转化为对象引用，这个转化过程称作装箱(boxing)。这个转换包括将栈里的值拷贝到了堆里，并且新建了一个对象的实例来引用该值。拆箱操作（unboxing）是个反过程——将对象转化为基于栈的值类型。&lt;br /&gt;&lt;br /&gt;int x = 3;    &lt;br /&gt;// 堆栈上新的int类型，值为3    &lt;br /&gt;object objx = x;    &lt;br /&gt;// 堆上新的int, 设定值为3，x=3仍然在堆栈上    &lt;br /&gt;int y = (int)objx;    &lt;br /&gt;//新的int类型的值3在堆栈上，x=3在堆栈上，objx＝3在堆上&lt;br /&gt;&lt;br /&gt;6、C#使用引用替代指针，那么C#的引用和C++的引用一样吗?&lt;br /&gt;&lt;br /&gt;不完全，基本的思想是一样的，但是一个重要的区别是C#的引用可以是null。因此你不能确认C#的引用一定会是一个有效的对象。如果试图使用一个值为null的引用，一个NullReferenceException 异常将被抛出。&lt;br /&gt;&lt;br /&gt;例如，看一看以下的方法：&lt;br /&gt;&lt;br /&gt;void displayStringLength( string s ) {    &lt;br /&gt;Console.WriteLine( “String is length {0}”， s.Length ); } &lt;br /&gt;&lt;br /&gt;如果这样调用它，这种方法将产生一个NullReferenceException 异常：&lt;br /&gt;&lt;br /&gt;string s = null;    &lt;br /&gt;displayStringLength( s ); &lt;br /&gt;&lt;br /&gt;当然有些情况你认为产生这样一个异常是完全可以接受的结果，但是在这个例子里最好按下面的代码改写一下：&lt;br /&gt;&lt;br /&gt;void displayStringLength( string s ) {    &lt;br /&gt;if( s == null )    &lt;br /&gt;Console.WriteLine(“String is null”);    &lt;br /&gt;else    &lt;br /&gt;Console.WriteLine(“String is length {0}”， s.Length );    &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;class和struct&lt;br /&gt;&lt;br /&gt;1、struct在C++中是多余的，为什么C#还要使用它们呢?&lt;br /&gt;&lt;br /&gt;在C++中，一个结构和一个类几乎就是一个同样的东西。唯一的区别是缺省的成员的访问级别不一样(struct的缺省级别是public，class的缺省级别是private)。然而，在C#中struct和class完全不一样。在C#中，struct 是值类型，而class是引用类型。另外struct不能从其他struct或者class继承，尽管struct可以实现接口。struct没有析构器。&lt;br /&gt;&lt;br /&gt;2、C#支持多重继承吗?&lt;br /&gt;&lt;br /&gt;C#支持接口的多重继承，但是不支持类的多重继承。&lt;br /&gt;&lt;br /&gt;3、C#接口和C++抽象类一样吗?&lt;br /&gt;&lt;br /&gt;不，不完全。C++的抽象类不能被实例化。但是它可以(而且经常是)包含执行代码和数据成员。一个C#接口不能包含任何执行代码或数据成员，它只是一组方法名称和签名（signature）。一个C#的接口更像是一个COM接口而不是抽象类。&lt;br /&gt;&lt;br /&gt;另一个主要的不同点是：C#类只能从一个类(不管是否抽象)继承，但可以实现多重接口。&lt;br /&gt;&lt;br /&gt;4、C#构造器和C++ 构造器是否相同?&lt;br /&gt;&lt;br /&gt;非常相似，但是它们绝对不同。第一，C#析构器不保证在某个特定的时间被调用。实际上它根本不保证被调用。真实的情况是，C#析构器只是一个伪装了的Finalize方法。具体点讲，它是一个插入调用基类Finalize方法的Finalize方法。因此，这段代码：&lt;br /&gt;&lt;br /&gt;class CTest {   &lt;br /&gt;～CTest() {    &lt;br /&gt;System.Console.WriteLine(“Bye bye” );    &lt;br /&gt;}    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;实际上就是：&lt;br /&gt;&lt;br /&gt;class CTest {    &lt;br /&gt;protected override void Finalize() {    &lt;br /&gt;System.Console.WriteLine(“Bye bye” );    &lt;br /&gt;base.Finalize();    &lt;br /&gt;}   &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;如果你不相信，可以将一个 Finalize方法和一个析构器加入C#类中，然后就可以知道是如何编译的了。&lt;br /&gt;&lt;br /&gt;5、什么是静态构造器?&lt;br /&gt;&lt;br /&gt;它是整个类的一个构造器，而不是类的一个实例的构造器，它在类装载的时候被调用。&lt;br /&gt;&lt;br /&gt;6、C#中所有的方法都是虚方法吗?&lt;br /&gt;&lt;br /&gt;不，像C++一样，缺省的时候，方法不是虚拟的，但都可以改为虚拟的。&lt;br /&gt;&lt;br /&gt;7、怎样在C#中声明一个纯虚函数？&lt;br /&gt;&lt;br /&gt;在方法前使用abstract修饰符，类也可以标记为abstract(这是自然的)。注意，abstract方法不能有执行代码(不同于C++中纯虚方法)。&lt;br /&gt;&lt;br /&gt;和C++处理的不同&lt;br /&gt;&lt;br /&gt;1. 我“new”了一个对象，但是我怎样删除它？&lt;br /&gt;&lt;br /&gt;你不能，不允许你显式地调用析构器，也没有delete操作符。但是不必担心，垃圾回收（garbage collection）会释放你的对象，最终会的(也许会的)。&lt;br /&gt;&lt;br /&gt;2. 我试图在栈上建立一个对象，但是C#编译器不通过，这是怎么回事？&lt;br /&gt;&lt;br /&gt;和C++不同，你不能在栈上建立一个对象的实例。类的实例总是被建立在堆上并且接受垃圾回收器(garbage collection)的管理。&lt;br /&gt;&lt;br /&gt;3. 我定义了一个析构器，但是它从来不能被调用，为什么?&lt;br /&gt;&lt;br /&gt;一个C#析构器实际上是Finalize方法的实现，但是运行环境不保证调用Finalize方法。你可以考虑通过调用GC.RequestFinalizeOnShutdown()方法试一下。&lt;br /&gt;&lt;br /&gt;4. 大多数的C#基本类型和C++的基本类型有相同的名字，它们一样吗?&lt;br /&gt;&lt;br /&gt;不，C#中char和C++中的wchar是相同的。C#中所有的字符包括字符串都是Unicode的，C#中整型值是固定大小的，而在C++中其大小取决于处理器。例如，一个C#的int是32位的，而C++ 中int在32-bit处理器上是32位的，在64-bit处理器上是64位的，一个C#的long是64位的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-1697901335355560280?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/1697901335355560280/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=1697901335355560280' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1697901335355560280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1697901335355560280'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_473.html' title='C#语言基础常见问题汇总'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-2977399409074161212</id><published>2008-10-21T05:04:00.001-07:00</published><updated>2008-10-21T05:04:33.033-07:00</updated><title type='text'>C#的四个基本技巧</title><content type='html'>1．如果可能尽量使用接口来编程 &lt;br /&gt;&lt;br /&gt;.NET框架包括类和接口，在编写程序的时候，你可能知道正在用.NET的哪个类。然而，在这种情况下如果你用.NET支持的接口而不是它的类来编程时，代码会变得更加稳定、可用性会更高。请分析下面的代码：&lt;br /&gt;&lt;br /&gt;private void LoadList (object [] items, ListBox l) &lt;br /&gt;{ &lt;br /&gt;　for (int i = 0; i &lt; items.Length;i++) &lt;br /&gt;l.Items.Add (items[i].ToString ()); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;这个函数从一个可为任何对象的数组中加载ListBox，这段代码被限定为只能使用数组。假想过些时候你发现那些对象存在数据库中，或别的集合中。那么你需要修改程序来使用不同的集合类型。如果你用ICollection接口来写那段程序，你就不用修改那段程序了，对于任何实现ICollection接口的类型它都能很好的工作: &lt;br /&gt;&lt;br /&gt;private void LoadList (ICollection items,ListBox l) &lt;br /&gt;{ &lt;br /&gt;foreach (object o in items) &lt;br /&gt;l.Items.Add (o.ToString ()); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;ICollection被数组和所有System.Collection中的集合实现。此外，多维数组也支持ICollection接口。如果那还不够的话，数据库.NET类同样支持ICollection接口。用接口写的这个函数不用需改就可以才许多中情况下使用。 &lt;br /&gt;&lt;br /&gt;2. 使用属性代替原始数据&lt;br /&gt;&lt;br /&gt;因为属性已经成为语言本身的元素，所以声明数据元素时它的作用域等级没有必要大于private。因为代码本身会把属性看成数据元素，你并没有失去使用简单数据类型的便利性 。相反它会使你的代码更加灵活功能更加强大。属性使你的数据元素封装性更好。属性可以让你使用lazy evaluation来返回数据。lazy evaluation的意思是当用户请求时才计算它的值，而不是一直保留着它。 &lt;br /&gt;&lt;br /&gt;最后，属性可以是virtual也可以是abstract。你也可以在接口中定义属性。 &lt;br /&gt;&lt;br /&gt;这里还有维护方面的因素应当注意：尽管操作两者的方法是一样的，但是你把一个数据元素变成属性，那么原先客户端的程序便不能访问服务端的新版本程序了。实际上对于在Web service中你想实现序列化的值你可以把它们变成属性来使用： &lt;br /&gt;&lt;br /&gt;private int TheMonth = 0; &lt;br /&gt;&lt;br /&gt;[XmlAttribute ("Month")] &lt;br /&gt;public int Month &lt;br /&gt;{ &lt;br /&gt;　get { &lt;br /&gt;return TheMonth; &lt;br /&gt;　} &lt;br /&gt;　set { &lt;br /&gt;TheMonth = value; &lt;br /&gt;　} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;简单通过属性就可以使你的所有数据元素私有化。 &lt;br /&gt;&lt;br /&gt;3. 在Producer/Consumer 的Idiom中使用Delegate &lt;br /&gt;&lt;br /&gt;当你生成一个实现producer idiom类的时候，使用deletate来通知consumer。这种方法相对于用接口更加灵活。Delegate是多点传送的，所以不用加额外的代码你就何以支持多用户。相对于用接口这样做可使类之间的耦合性降低。 &lt;br /&gt;&lt;br /&gt;下面的类处理键盘输入并把它传给所有的registered listeners： &lt;br /&gt;&lt;br /&gt;public class KeyboardProcessor &lt;br /&gt;{ &lt;br /&gt;private OnGetLine theFunc = null; &lt;br /&gt;&lt;br /&gt;public OnGetLine OnGetLineCallback { &lt;br /&gt;　get { &lt;br /&gt;return theFunc; &lt;br /&gt;　} &lt;br /&gt;　set { &lt;br /&gt;theFunc = value; &lt;br /&gt;　} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;public void Run (){ &lt;br /&gt;// Read input. &lt;br /&gt;// If there is any listeners, publish: &lt;br /&gt;string s; &lt;br /&gt;do { &lt;br /&gt;　s = Console.ReadLine (); &lt;br /&gt;　if (s.Length == 0) &lt;br /&gt;break; &lt;br /&gt;　if (theFunc != null){ &lt;br /&gt;System.Delegate [] funcs =theFunc.GetInvocationList(); &lt;br /&gt;foreach (OnGetLine f in funcs) { &lt;br /&gt;　try { &lt;br /&gt;f (s); &lt;br /&gt;　} catch (Exception e) { &lt;br /&gt;Console.WriteLine &lt;br /&gt;("Caught Exception: {0}", e.Message); &lt;br /&gt;　} &lt;br /&gt;} &lt;br /&gt;　} &lt;br /&gt;} while (true); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;任何数目的listeners都可注册到producer，它们所要做的只是提供一个特定的函数：deletate。 &lt;br /&gt;   &lt;br /&gt;4. 注意初始化顺序 &lt;br /&gt;&lt;br /&gt;C＃中对于一些变量声明加入了initializer的概念。它们在构造函数之前被执行，实际上变量在基类的构造函数执行前之前被初始化。 &lt;br /&gt;&lt;br /&gt;所以，在初始化变量的时候不要用基类中的数据，因为它们还没有被构造。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-2977399409074161212?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/2977399409074161212/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=2977399409074161212' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2977399409074161212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2977399409074161212'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_2977.html' title='C#的四个基本技巧'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-5592705177281636880</id><published>2008-10-21T05:03:00.002-07:00</published><updated>2008-10-21T05:04:12.697-07:00</updated><title type='text'>提高C#编程水平的50个要诀</title><content type='html'>1.总是用属性 (Property) 来代替可访问的数据成员&lt;br /&gt;&lt;br /&gt;2.在  readonly 和 const 之间，优先使用 readonly&lt;br /&gt;&lt;br /&gt;3.在 as 和 强制类型转换之间，优先使用 as 操作符&lt;br /&gt;&lt;br /&gt;4.使用条件属性 (Conditional Attributes) 来代替条件编译语句 #if&lt;br /&gt;&lt;br /&gt;5.总是为自定义类重载 ToString 方法&lt;br /&gt;&lt;br /&gt;6.区别值类型和引用类型&lt;br /&gt;&lt;br /&gt;7.使用不可变的值类型(Immutable Atomic Value Types)&lt;br /&gt;&lt;br /&gt;8.在值类型中，确保0是一个合法的数据&lt;br /&gt;&lt;br /&gt;9.理解 ReferenceEquals, static Equals, instance Equals 和 比较运算符(==)之间的关系&lt;br /&gt;&lt;br /&gt;10.理解 GetHashCode方法的缺陷&lt;br /&gt;&lt;br /&gt;11.在编写循环时，优先使用 foreach.&lt;br /&gt;&lt;br /&gt;12.在定义变量的时候就将其初始化&lt;br /&gt;&lt;br /&gt;13.使用静态构造函数来初始化静态成员变量&lt;br /&gt;&lt;br /&gt;14.用多个构造函数时，利用构造函数链&lt;br /&gt;&lt;br /&gt;15.使用using和try/finally来处理资源的释放&lt;br /&gt;&lt;br /&gt;16.尽量避免产生资源垃圾&lt;br /&gt;&lt;br /&gt;17.尽量避免使用装箱(boxing)和拆箱(unboxing)&lt;br /&gt;&lt;br /&gt;18.实现类的 Dispose 方法&lt;br /&gt;&lt;br /&gt;19.在接口和继承(Inheritance)之间，优先使用接口(interface)&lt;br /&gt;&lt;br /&gt;20.区分接口和重载(overrides)&lt;br /&gt;&lt;br /&gt;21.用委托(delegate)来实现回调(callback)&lt;br /&gt;&lt;br /&gt;22.用事件(event)来定义外部接口&lt;br /&gt;&lt;br /&gt;23.避免返回类内部成员的引用&lt;br /&gt;&lt;br /&gt;24.使用元数据来控制程序&lt;br /&gt;&lt;br /&gt;25.优先使用可序列化(serilizable)类型&lt;br /&gt;&lt;br /&gt;26.对需要排序的对象实现IComparable和IComparer接口&lt;br /&gt;&lt;br /&gt;27.避免使用 ICloneable接口&lt;br /&gt;&lt;br /&gt;28.避免使用类型转换操作符&lt;br /&gt;&lt;br /&gt;29.只有当基类加入了与派生类中现有的函数名称相同的函数时，才需要使用 new 操作符&lt;br /&gt;&lt;br /&gt;30.尽量使用 CLS-Compliant&lt;br /&gt;&lt;br /&gt;31.尽量编写短少，简单的函数&lt;br /&gt;&lt;br /&gt;32.尽量编写比较小的程序集(assembly)&lt;br /&gt;&lt;br /&gt;33.限定类型的可见性(visibility)&lt;br /&gt;&lt;br /&gt;34.编写大粒度的 web API&lt;br /&gt;&lt;br /&gt;35.在使用事件时，优先继承基类事件，而不是重新创建一个事件&lt;br /&gt;&lt;br /&gt;36.多使用 framework 的运行时调试 (DEBUG, TRACE, EVENTLOG等)&lt;br /&gt;&lt;br /&gt;37.使用.net标准的配置机制&lt;br /&gt;&lt;br /&gt;38.使用并且在类中支持.net的数据绑定功能 (Data Binding)&lt;br /&gt;&lt;br /&gt;39.使用.net的验证机制 (Validation)&lt;br /&gt;&lt;br /&gt;40.根据你的需求选择正确的集合类(Collection)&lt;br /&gt;&lt;br /&gt;41.在自定义结构中使用 DataSet&lt;br /&gt;&lt;br /&gt;42.利用属性(Attributes)&lt;br /&gt;&lt;br /&gt;43.不要过度使用反射(Reflection)&lt;br /&gt;&lt;br /&gt;44.创建完整的，应用程序特定的异常&lt;br /&gt;&lt;br /&gt;45.尽可能多的考虑程序可能出现的异常，并作出处理&lt;br /&gt;&lt;br /&gt;46.尽可能少的使用 Interop&lt;br /&gt;&lt;br /&gt;47.尽量使用安全代码 (safe code)&lt;br /&gt;&lt;br /&gt;48.多多学习、使用外部工具和资源&lt;br /&gt;&lt;br /&gt;49.准备使用 C# 2.0&lt;br /&gt;&lt;br /&gt;50.学习 ECMA 标准&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-5592705177281636880?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/5592705177281636880/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=5592705177281636880' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/5592705177281636880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/5592705177281636880'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c50.html' title='提高C#编程水平的50个要诀'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-3106149801258694017</id><published>2008-10-21T05:03:00.001-07:00</published><updated>2008-10-21T05:03:51.935-07:00</updated><title type='text'>C#合并多个结构一样的Excel</title><content type='html'>合并代码如下：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using Excel = Microsoft.Office.Interop.Excel;&lt;br /&gt;namespace ConsoleApplication20&lt;br /&gt;{&lt;br /&gt;    //添加引用-COM-MicroSoft Excel 11.0 Object Libery&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            //M为表格宽度标志（Excel中的第M列为最后一列），3为表头高度&lt;br /&gt;            MergeExcel.DoMerge(new string[] &lt;br /&gt;            {&lt;br /&gt;                @"E:\excel\类型A\公司A.xls", &lt;br /&gt;                @"E:\excel\类型A\公司B.xls" &lt;br /&gt;            },&lt;br /&gt;                @"E:\excel\类型A\合并测试.xls", "M", 3);&lt;br /&gt;            MergeExcel.DoMerge(new string[] &lt;br /&gt;            {&lt;br /&gt;                @"E:\excel\类型B\统计表A.xls", &lt;br /&gt;                @"E:\excel\类型B\统计表B.xls" &lt;br /&gt;            },&lt;br /&gt;                @"E:\excel\类型B\合并测试.xls", "I", 4);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    public class MergeExcel&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        Excel.Application app = new Microsoft.Office.Interop.Excel.ApplicationClass();&lt;br /&gt;        //保存目标的对象&lt;br /&gt;        Excel.Workbook bookDest = null;&lt;br /&gt;        Excel.Worksheet sheetDest = null;&lt;br /&gt;        //读取数据的对象 &lt;br /&gt;        Excel.Workbook bookSource = null;&lt;br /&gt;        Excel.Worksheet sheetSource = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        string[] _sourceFiles = null;&lt;br /&gt;        string _destFile = string.Empty;&lt;br /&gt;        string _columnEnd = string.Empty;&lt;br /&gt;        int _headerRowCount = 1;&lt;br /&gt;        int _currentRowCount = 0;&lt;br /&gt;&lt;br /&gt;        public MergeExcel(string[] sourceFiles,string destFile,string columnEnd,int headerRowCount)&lt;br /&gt;        {&lt;br /&gt;            &lt;br /&gt;            bookDest = (Excel.WorkbookClass)app.Workbooks.Add(Missing.Value);&lt;br /&gt;            sheetDest = bookDest.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value) as Excel.Worksheet;&lt;br /&gt;            sheetDest.Name = "Data";&lt;br /&gt;&lt;br /&gt;            _sourceFiles = sourceFiles;&lt;br /&gt;            _destFile = destFile;&lt;br /&gt;            _columnEnd = columnEnd;&lt;br /&gt;            _headerRowCount = headerRowCount;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 打开工作表&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="fileName"&gt;&lt;/param&gt;&lt;br /&gt;        void OpenBook(string fileName)&lt;br /&gt;        {&lt;br /&gt;            bookSource = app.Workbooks._Open(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value&lt;br /&gt;                , Missing.Value, Missing.Value, Missing.Value, Missing.Value&lt;br /&gt;                , Missing.Value, Missing.Value, Missing.Value, Missing.Value);&lt;br /&gt;            sheetSource = bookSource.Worksheets[1] as Excel.Worksheet;&lt;br /&gt;        }&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 关闭工作表&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        void CloseBook()&lt;br /&gt;        {&lt;br /&gt;            bookSource.Close(false, Missing.Value, Missing.Value);&lt;br /&gt;        }&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 复制表头&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        void CopyHeader()&lt;br /&gt;        {&lt;br /&gt;            Excel.Range range = sheetSource.get_Range("A1", _columnEnd + _headerRowCount.ToString());&lt;br /&gt;            range.Copy(sheetDest.get_Range("A1",Missing.Value));&lt;br /&gt;            _currentRowCount += _headerRowCount;&lt;br /&gt;        }&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 复制数据&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        void CopyData()&lt;br /&gt;        {&lt;br /&gt;            int sheetRowCount = sheetSource.UsedRange.Rows.Count;&lt;br /&gt;            Excel.Range range = sheetSource.get_Range(string.Format("A{0}", _headerRowCount + 1), _columnEnd + sheetRowCount.ToString());&lt;br /&gt;            range.Copy(sheetDest.get_Range(string.Format("A{0}", _currentRowCount + 1), Missing.Value));&lt;br /&gt;            _currentRowCount += range.Rows.Count;&lt;br /&gt;        }&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 保存结果&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        void Save()&lt;br /&gt;        {&lt;br /&gt;            bookDest.Saved = true;&lt;br /&gt;            bookDest.SaveCopyAs(_destFile);&lt;br /&gt;        }&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 退出进程&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        void Quit()&lt;br /&gt;        {&lt;br /&gt;            app.Quit();&lt;br /&gt;        }&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 合并&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        void DoMerge()&lt;br /&gt;        {&lt;br /&gt;            bool b = false;&lt;br /&gt;            foreach (string strFile in _sourceFiles)&lt;br /&gt;            {&lt;br /&gt;                OpenBook(strFile);&lt;br /&gt;                if (b == false)&lt;br /&gt;                {&lt;br /&gt;                    CopyHeader();&lt;br /&gt;                    b = true;&lt;br /&gt;                }&lt;br /&gt;                CopyData();&lt;br /&gt;                CloseBook();&lt;br /&gt;            }&lt;br /&gt;            Save();&lt;br /&gt;            Quit();&lt;br /&gt;        }&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 合并表格&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="sourceFiles"&gt;源文件&lt;/param&gt;&lt;br /&gt;        /// &lt;param name="destFile"&gt;目标文件&lt;/param&gt;&lt;br /&gt;        /// &lt;param name="columnEnd"&gt;最后一列标志&lt;/param&gt;&lt;br /&gt;        /// &lt;param name="headerRowCount"&gt;表头行数&lt;/param&gt;&lt;br /&gt;        public static void DoMerge(string[] sourceFiles, string destFile, string columnEnd, int headerRowCount)&lt;br /&gt;        {&lt;br /&gt;            new MergeExcel(sourceFiles, destFile, columnEnd, headerRowCount).DoMerge();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;资料引用:http://www.knowsky.com/440441.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-3106149801258694017?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/3106149801258694017/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=3106149801258694017' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/3106149801258694017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/3106149801258694017'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/cexcel.html' title='C#合并多个结构一样的Excel'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-3334474164188729989</id><published>2008-10-21T05:02:00.004-07:00</published><updated>2008-10-21T05:03:28.782-07:00</updated><title type='text'>使用C#创建SQL Server的存储过程</title><content type='html'>通常，开发人员使用的是T-SQL来创建SQL Server的存储过程、函数和触发器。 而现在的SQL Server 2005已经完全支持.NET通用语言运行时（CLR）了。 这就意味着，你可以使用.NET的语言，如C#、VB.NET之类的来开发SQL Server的存储过程、函数和触发器。 SQL Server 和 CLR 的集成给我们带来了n多好处，如实时编译、类型安全、增强的安全性以及增强的编程模型等。 本文中，我将向大家演示如何使用C#创建SQL Server的存储过程。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;背景&lt;br /&gt;我们在使用SQL Server存储过程时，最常做的工作就是从数据库中读取或保存数据。 其常用应用如下：&lt;br /&gt;    ·执行一些简单的逻辑，没有任何返回值。 也没有输出参数。&lt;br /&gt;    ·执行一些逻辑，并通过一个或更多的输出参数返回结果。&lt;br /&gt;    ·执行一些逻辑，并返回从表中读取的一条或多条记录。&lt;br /&gt;    ·执行一些逻辑，并返回一行或多行记录。 这些记录不是从表中读取的，而是你自定义的一些数据行。&lt;br /&gt;&lt;br /&gt;为了演示如何用C#开发出这几种应用的SQL Server存储过程，我将一个一个地举出示例。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;启用CLR集成&lt;br /&gt;在你开始用C#写存储过程之前，必须要启用你的SQL Server的CLR集成特性。 默认情况它是不启用的。 打开你的SQL Server Management Studio并执行如下脚本。&lt;br /&gt;sp_configure 'clr enabled', 1 &lt;br /&gt;GO &lt;br /&gt;RECONFIGURE &lt;br /&gt;GO &lt;br /&gt;这里，我们执行了系统存储过程“sp_configure”，为其提供的两个参数分别为：“clr enabled”和“1”。如果要停用CLR集成的话也是执行这个存储过程，只不过第二个参数要变为“0”而已。另外，为了使新的设置产生效果，不要忘记调用“RECONFIGURE”。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL Server项目&lt;br /&gt;现在打开Visual Studio，并从文件菜单中选择“新建项目”。 在“新建项目”对话框中选择“Visual C#”下的“Database”。 然后选择“SQL Server项目”模板。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;起好项目名称后就单击“确定”按钮。 &lt;br /&gt;&lt;br /&gt;很快，你所创建的项目就要求你选择一个SQL Server数据库。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;按照提示一步一步地做就好了，就算你选择了取消，也可以在“项目”–“属性”对话框中再一次选择数据库。 举个例子，假如你的电脑上有一个Northwind数据库，那么就在“新建数据库引用”对话框中选中它，然后单击“确定”按钮。 之后，SQL Server项目在部署的时候就会将我们开发的存储过程写入这个数据库（继续往后看你就清楚是怎么回事了）。&lt;br /&gt;&lt;br /&gt;接下来，右键单击你新建的这个项目，选择“添加”-“存储过程”。 然后将会出现如下图所示的对话框：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;选择“存储过程”模板，并起一个合适的名字，然后单击“添加”按钮。 &lt;br /&gt;&lt;br /&gt;添加完后你就会发现，实际上这是创建了一个已经导入了需要用到的命名空间的类。&lt;br /&gt;using System;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.SqlClient;&lt;br /&gt;using System.Data.SqlTypes;&lt;br /&gt;using Microsoft.SqlServer.Server;&lt;br /&gt;注意一下加粗显示的命名空间（译者注：后两个using）。 System.Data.SqlTypes命名空间包含了很多不同的类型，它们可以用来代替SQL Server的数据类型。 Microsoft.SqlServer.Server命名空间下的类负责SQL Server的CLR集成。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;没有返回值的存储过程&lt;br /&gt;在这一节中，我们将会看到如何写一个执行了一些逻辑，但是却没有任何返回值和输出参数的存储过程。 在这个例子里，我们将创建一个名为“ChangeCompanyName”的存储过程，它用来修改Customers表中CompanyName字段的值。 这个存储过程需要两个参数 – CustomerID（需要更改公司名称的客户的ID）和CompanyName（新的公司名称）。 “ChangeCompanyName”存储过程完成后的代码如下：&lt;br /&gt;[SqlProcedure]&lt;br /&gt;public static void ChangeCompanyName&lt;br /&gt;(SqlString CustomerID, SqlString CompanyName)&lt;br /&gt;{&lt;br /&gt;SqlConnection cnn = new SqlConnection&lt;br /&gt;("context connection=true");&lt;br /&gt;cnn.Open();&lt;br /&gt;SqlCommand cmd = new SqlCommand();&lt;br /&gt;cmd.Connection = cnn;&lt;br /&gt;cmd.CommandText = "update customers set &lt;br /&gt;companyname=@p1 where customerid=@p2";&lt;br /&gt;SqlParameter p1 = new SqlParameter("@p1", CompanyName);&lt;br /&gt;SqlParameter p2 = new SqlParameter("@p2", CustomerID);&lt;br /&gt;cmd.Parameters.Add(p1);&lt;br /&gt;cmd.Parameters.Add(p2);&lt;br /&gt;int i=cmd.ExecuteNonQuery();&lt;br /&gt;cnn.Close();&lt;br /&gt;SqlContext.Pipe.Send(i.ToString());&lt;br /&gt;}&lt;br /&gt;仔细看一下这个ChangeCompanyName()方法。 它是一个静态方法并且没有返回值（void）。 它需要两个名为CustomerID和CompanyName的参数。 请注意这两个参数的数据类型都是SqlString。 SqlString可以用来代替SQL Server中的nvarchar数据类型。 这个方法用了一个[SqlProcedure]属性来修饰。 该属性用于标记ChangeCompanyName()方法是一个SQL Server存储过程。&lt;br /&gt;&lt;br /&gt;在方法内我们创建了一个SqlConnection对象，并设置其连接字符串为“context connection = true”。 “上下文连接”可以让你使用当前登录到数据库的用户作为你的登录数据库的验证信息。 本例中，ChangeCompanyName()方法将会转换为存储过程，然后保存到Northwind数据库里。 所以在这里的“上下文连接”指的就是Northwind数据库。 这样你就不需要再写任何关于登录数据库的验证信息了。&lt;br /&gt;&lt;br /&gt;接下来是打开数据库连接。 然后通过设置SqlCommand对象的Connection和CommandText属性，让其执行更新操作。 同时，我们还需要设置两个参数。 这样通过调用ExecuteNonQuery()方法就可以执行更新操作了。 再接下来就是关闭连接。&lt;br /&gt;&lt;br /&gt;最后，将ExecuteNonQuery()方法的返回值发送到客户端。 当然你也可以不做这一步。 现在我们来了解一下SqlContext类的使用。 SqlContext类用于在服务端和客户端之间传递处理结果。 本例使用了Send()方法发送一个字符串返回给调用者。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;返回从表中读取的一条或多条记录的存储过程&lt;br /&gt;我们在使用存储过程时，经常会SELECT一条或多条记录。 你可以采用两种方法来创建这样的存储过程。 &lt;br /&gt;&lt;br /&gt;首先我们创建一个名为GetAllCustomers()的方法，代码如下：&lt;br /&gt;[SqlProcedure]&lt;br /&gt;public static void GetAllCustomers()&lt;br /&gt;{&lt;br /&gt;SqlConnection cnn = new SqlConnection&lt;br /&gt;("context connection=true");&lt;br /&gt;cnn.Open();&lt;br /&gt;SqlCommand cmd = new SqlCommand();&lt;br /&gt;cmd.Connection = cnn;&lt;br /&gt;cmd.CommandText = "select * from customers";&lt;br /&gt;SqlDataReader reader = cmd.ExecuteReader();&lt;br /&gt;SqlContext.Pipe.Send(reader);&lt;br /&gt;reader.Close();&lt;br /&gt;cnn.Close();&lt;br /&gt;}&lt;br /&gt;这个GetAllCustomers()方法用了一个[SqlProcedure]属性来修饰。 在方法内创建一个SqlConnection和一个SqlCommand对象。 然后使用ExecuteReader()方法来执行SELECT语句。 接下来用Send()方法将取得的SqlDataReader数据发送到客户端。 最后就是关闭SqlDataReader和SqlConnection。 在这种方法中，是我们自己创建的SqlDataReader。 其实，我们也可以把这个任务交给SqlContext类去完成，代码如下：&lt;br /&gt;[SqlProcedure]&lt;br /&gt;public static void GetCustomerByID&lt;br /&gt;(SqlString CustomerID)&lt;br /&gt;{&lt;br /&gt;SqlConnection cnn = new SqlConnection&lt;br /&gt;("context connection=true");&lt;br /&gt;cnn.Open();&lt;br /&gt;SqlCommand cmd = new SqlCommand();&lt;br /&gt;cmd.Connection = cnn;&lt;br /&gt;cmd.CommandText = "select * from customers &lt;br /&gt;where customerid=@p1";&lt;br /&gt;SqlParameter p1 = new SqlParameter("@p1", CustomerID);&lt;br /&gt;cmd.Parameters.Add(p1);&lt;br /&gt;SqlContext.Pipe.ExecuteAndSend(cmd);&lt;br /&gt;cnn.Close();&lt;br /&gt;}&lt;br /&gt;GetCustomerByID()方法需要一个参数 – CustomerID，它将从Customers表中返回某个customer的记录。 这个方法内的代码，除了ExecuteAndSend()方法外，你应该都已经比较熟悉了。 ExecuteAndSend()方法接收一个SqlCommand对象作为参数，执行它就会返回数据集给客户端。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;有输出参数的存储过程&lt;br /&gt;我们在使用存储过程时，经常会通过输出参数返回一个经过计算的值。 所以，现在让我们来看一看如何创建具有一个或多个输出参数的存储过程。&lt;br /&gt;[SqlProcedure]&lt;br /&gt;public static void GetCompanyName&lt;br /&gt;(SqlString CustomerID,out SqlString CompanyName)&lt;br /&gt;{&lt;br /&gt;SqlConnection cnn = new SqlConnection&lt;br /&gt;("context connection=true");&lt;br /&gt;cnn.Open();&lt;br /&gt;SqlCommand cmd = new SqlCommand();&lt;br /&gt;cmd.Connection = cnn;&lt;br /&gt;cmd.CommandText = "select companyname from &lt;br /&gt;customers where customerid=@p1";&lt;br /&gt;SqlParameter p1 = new SqlParameter&lt;br /&gt;("@p1", CustomerID);&lt;br /&gt;cmd.Parameters.Add(p1);&lt;br /&gt;object obj = cmd.ExecuteScalar();&lt;br /&gt;cnn.Close();&lt;br /&gt;CompanyName = obj.ToString();&lt;br /&gt;}&lt;br /&gt;这是一个名为GetCompanyName()的方法，它需要两个参数。 第一个参数是CustomerID，它是一个输入参数；第二个参数是CompanyName，它是一个输出参数（用关键字out来指明）。 这两个参数都是SqlString类型的。 GetCompanyName()方法会接收一个CustomerID参数，然后返回CompanyName（作为输出参数）。&lt;br /&gt;&lt;br /&gt;该方法内的代码首先设置了SqlConnection和SqlCommand对象。 然后，使用ExecuteScalar()方法来执行SELECT语句。 ExecuteScalar()方法返回的值是一个object类型，它其实就是公司名称。 最后将输出参数CompanyName设置为这个值。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;返回一行或多行自定义数据的存储过程&lt;br /&gt;我们在使用存储过程时，更多的还是从某些表中读取数据。 但是，某些情况下我们需要的数据可能不在任何表里。 例如，你可能会基于某些计算来生成一个数据表格。 因为它的数据不是从表中获得的，所以上面的方法就不在适用了。 幸运的是，SQL Server的CLR集成特性给我们提供了一个解决这个问题的方法。 请看如下代码：&lt;br /&gt;[SqlProcedure]&lt;br /&gt;public static void GetCustomRow()&lt;br /&gt;{&lt;br /&gt;SqlMetaData[] metadata = new SqlMetaData[2];&lt;br /&gt;metadata[0] = new SqlMetaData&lt;br /&gt;("CustomerID", SqlDbType.NVarChar,50);&lt;br /&gt;metadata[1] = new SqlMetaData&lt;br /&gt;("CompanyName", SqlDbType.NVarChar,50);&lt;br /&gt;SqlDataRecord record = new SqlDataRecord(metadata);&lt;br /&gt;record.SetString(0, "ALFKI");&lt;br /&gt;record.SetString(1, "Alfreds Futterkiste");&lt;br /&gt;SqlContext.Pipe.Send(record);&lt;br /&gt;}&lt;br /&gt;GetCustomRow()方法会返回一条记录并发送给客户端。 这个方法首先声明了一个SqlMetaData对象。 当你要用到自定义列的时候，就可以使用这个SqlMetaData类。 在我们的示例中，创建了两个类型为NVarChar，长度为50的列。然后创建了一个SqlDataRecord对象。 SqlDataRecord类可以用来表示一个自定义行。 它的构造函数需要一个SqlMetaData数组作为参数。 SqlDataRecord对象的SetString()方法用来设置列的值。 另外，还有许多不同的类似SetString()这样的方法，可以用来处理不同的数据类型。 最后，调用Send()方法将SqlDataRecord对象发送到客户端。&lt;br /&gt;&lt;br /&gt;在上面的示例中，我们只返回了一行数据给调用者。 那么，如果要返回多行呢？ 请看下面的代码：&lt;br /&gt;[SqlProcedure]&lt;br /&gt;public static void GetMultipleCustomRows()&lt;br /&gt;{&lt;br /&gt;SqlMetaData[] metadata = new SqlMetaData[2];&lt;br /&gt;metadata[0] = new SqlMetaData&lt;br /&gt;("CustomerID", SqlDbType.NVarChar, 50);&lt;br /&gt;metadata[1] = new SqlMetaData&lt;br /&gt;("CompanyName", SqlDbType.NVarChar, 50);&lt;br /&gt;SqlDataRecord record = new SqlDataRecord(metadata);&lt;br /&gt;SqlContext.Pipe.SendResultsStart(record);&lt;br /&gt;record.SetString(0, "ALFKI");&lt;br /&gt;record.SetString(1, "Alfreds Futterkiste");&lt;br /&gt;SqlContext.Pipe.SendResultsRow(record);&lt;br /&gt;record.SetString(0, "ANATR");&lt;br /&gt;record.SetString(1, "Ana Trujillo Emparedados y helados");&lt;br /&gt;SqlContext.Pipe.SendResultsRow(record);&lt;br /&gt;SqlContext.Pipe.SendResultsEnd();&lt;br /&gt;}&lt;br /&gt;GetMultipleCustomRows()方法将会返回多个SqlDataRecord对象到客户端。 接下来创建自定义列和设置列的值都和之前的例子一样。 但是，我们使用的是SendResutlsStart()方法来传输数据。 SendResultsRow()方法也是发送一个SqlDataRecord对象到客户端，但是我们可以多次调用它，从而做到发送多条记录。 最后，调用SendResultsEnd()方法用来标记已经完成数据传输操作。&lt;br /&gt;&lt;br /&gt;我们已经开发完了存储过程。 现在就可以将这个项目编译为一个程序集（.DLL）。 但是我们的工作并没有到此结束。 我们还需要部署这个程序集和存储过程到SQL Server数据库。 有两种方法可以完成这个工作 – 手动和自动。 手动方法是使用T-SQL语句注册你的程序集，并将存储过程部署到SQL Server数据库中。 在本例中，我将使用自动的方法来部署存储过程到SQL Server数据库。&lt;br /&gt;&lt;br /&gt;右键单击你的项目，然后在菜单中选择“部署”选项。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如此就会自动地完成注册程序集和部署存储过程的工作。 注意，只有在你创建项目时添加了数据库引用的时候，才会出现“部署”选项。 如果因为某些原因你没能添加数据库引用，那么你可以通过项目属性对话框来设置它。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果你在SQL Server Management Studio查看Northwind数据库的话，那么就应该可以看到和下图相似的结果。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;注意，在存储过程节点下出现了我们创建的所有方法（有“锁”图标的），并且在程序集节点下出现了我们的程序集。 &lt;br /&gt;&lt;br /&gt;就是这些东西，很简单吧。 现在你就可以在你的程序中调用这些存储过程了。 你也可以在SQL Server Management Studio中来测试它们。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-3334474164188729989?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/3334474164188729989/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=3334474164188729989' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/3334474164188729989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/3334474164188729989'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/csql-server.html' title='使用C#创建SQL Server的存储过程'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-4631023438716564375</id><published>2008-10-21T05:02:00.003-07:00</published><updated>2008-10-21T05:02:54.519-07:00</updated><title type='text'>c#数据库操作的3种典型用法</title><content type='html'>由于最近和数据库打交道,需要用C#和SQL Server 2005进行操作,就把近段时间内的最常用的操作做个总结.本人也是第一次用C#操作数据库,所以这三种典型用法对初学者还是挺有帮助的.&lt;br /&gt;       以下是我在visual studio 2005上写的一个类(连的是SQL Server 2005),已经过测试通过.里面有3个方法比较典型,在此把源码贴出:&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.SqlClient;&lt;br /&gt; &lt;br /&gt;namespace DatabaseOperate&lt;br /&gt;{&lt;br /&gt;    class SqlOperateInfo&lt;br /&gt;    {&lt;br /&gt;        //Suppose your ServerName is "aa",DatabaseName is "bb",UserName is "cc", Password is "dd"&lt;br /&gt;        private string sqlConnectionCommand = "Data Source=aa;Initial Catalog=bb;User ID=cc;Pwd=dd";&lt;br /&gt;        //This table contains two columns:KeywordID int not null,KeywordName varchar(100) not null&lt;br /&gt;        private string dataTableName = "Basic_Keyword_Test";&lt;br /&gt; &lt;br /&gt;        private string storedProcedureName = "Sp_InertToBasic_Keyword_Test";&lt;br /&gt;        private string sqlSelectCommand = "Select KeywordID, KeywordName From Basic_Keyword_Test";&lt;br /&gt;        //sqlUpdateCommand could contain "insert" , "delete" , "update" operate&lt;br /&gt;        private string sqlUpdateCommand = "Delete From Basic_Keyword_Test Where KeywordID = 1";&lt;br /&gt; &lt;br /&gt;        public void UseSqlReader()&lt;br /&gt;        {&lt;br /&gt;            SqlConnection sqlConnection = new SqlConnection(sqlConnectionCommand);&lt;br /&gt;            SqlCommand sqlCommand = new SqlCommand();&lt;br /&gt;            sqlCommand.CommandType = System.Data.CommandType.Text;&lt;br /&gt;            sqlCommand.Connection = sqlConnection;&lt;br /&gt;            sqlCommand.CommandText = sqlSelectCommand;&lt;br /&gt; &lt;br /&gt;            sqlConnection.Open();&lt;br /&gt;            SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();&lt;br /&gt;            while(sqlDataReader.Read())&lt;br /&gt;            {&lt;br /&gt;                //Get KeywordID and KeywordName , You can do anything you like. Here I just output them.&lt;br /&gt;                int keywordid = (int)sqlDataReader[0]; &lt;br /&gt;                //the same as: int keywordid = (int)sqlDataReader["KeywordID"]&lt;br /&gt;                string keywordName = (string)sqlDataReader[1]; &lt;br /&gt;                //the same as: string keywordName = (int)sqlDataReader["KeywordName"]&lt;br /&gt;                Console.WriteLine("KeywordID = " + keywordid + " , KeywordName = " + keywordName);&lt;br /&gt;            }&lt;br /&gt; &lt;br /&gt;            sqlDataReader.Close();&lt;br /&gt;            sqlCommand.Dispose();&lt;br /&gt;            sqlConnection.Close();&lt;br /&gt;        }&lt;br /&gt;        public void UseSqlStoredProcedure()&lt;br /&gt;        {&lt;br /&gt;            SqlConnection sqlConnection = new SqlConnection(sqlConnectionCommand);&lt;br /&gt;            SqlCommand sqlCommand = new SqlCommand();&lt;br /&gt;            sqlCommand.CommandType = CommandType.StoredProcedure;&lt;br /&gt;            sqlCommand.Connection = sqlConnection;&lt;br /&gt;            sqlCommand.CommandText = storedProcedureName;&lt;br /&gt; &lt;br /&gt;            sqlConnection.Open();&lt;br /&gt;            sqlCommand.ExecuteNonQuery();&lt;br /&gt;            //you can use reader here,too.as long as you modify the sp and let it like select * from ....&lt;br /&gt; &lt;br /&gt;            sqlCommand.Dispose();&lt;br /&gt;            sqlConnection.Close();&lt;br /&gt;        }&lt;br /&gt;        public void UseSqlDataSet()&lt;br /&gt;        {&lt;br /&gt;            SqlConnection sqlConnection = new SqlConnection(sqlConnectionCommand);&lt;br /&gt;            SqlCommand sqlCommand = new SqlCommand();&lt;br /&gt;            sqlCommand.CommandType = System.Data.CommandType.Text;&lt;br /&gt;            sqlCommand.Connection = sqlConnection;&lt;br /&gt;            sqlCommand.CommandText = sqlSelectCommand;&lt;br /&gt; &lt;br /&gt;            sqlConnection.Open();&lt;br /&gt;            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();&lt;br /&gt;            sqlDataAdapter.SelectCommand = sqlCommand;&lt;br /&gt;            DataSet dataSet = new DataSet();&lt;br /&gt;            //sqlCommandBuilder is for update the dataset to database&lt;br /&gt;            SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter);&lt;br /&gt;            sqlDataAdapter.Fill(dataSet, dataTableName);&lt;br /&gt; &lt;br /&gt;            //Do something to dataset then you can update it to Database.Here I just add a row&lt;br /&gt;            DataRow row = dataSet.Tables[0].NewRow();&lt;br /&gt;            row[0] = 10000;&lt;br /&gt;            row[1] = "new row";&lt;br /&gt;            dataSet.Tables[0].Rows.Add(row);&lt;br /&gt; &lt;br /&gt;            sqlDataAdapter.Update(dataSet, dataTableName);&lt;br /&gt; &lt;br /&gt;            sqlCommand.Dispose();&lt;br /&gt;            sqlDataAdapter.Dispose();&lt;br /&gt;            sqlConnection.Close();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;以上的程序概括了最典型的用法,也是最基本的用法.更多的用法我将会陆续给出,大家有什么疑问或建议,欢迎来信(jiangbiao0827@163.com)或留言.关于SQL Server的使用和心得,我也会在近期在DataBase区给出.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-4631023438716564375?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/4631023438716564375/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=4631023438716564375' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4631023438716564375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4631023438716564375'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c3.html' title='c#数据库操作的3种典型用法'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-2206086715336265565</id><published>2008-10-21T05:02:00.001-07:00</published><updated>2008-10-21T05:02:34.540-07:00</updated><title type='text'>利用C#远程存取Access数据库</title><content type='html'>目前，基于数据库服务器的桌面管理程序和Web程序已经有太多的应用了，尤其是网络的大量普及，孤立地数据库管理系统无法胜任分布式管理应用，但是面对基于Access数据库的现有的桌面应用我们也无法完全的摒弃。我们利用.Net 远程处理功能将连接和存取Access的行为封装为一个远程对象，供网络中其它客户端通过调用该远程对象来存取实际的Access数据库。我们以 C# 2005 为开发语言来实现上述功能。&lt;br /&gt;&lt;br /&gt;　　一、 技术要点&lt;br /&gt;&lt;br /&gt;　　我们都知道Windows应用程序在运行时会启动一个进程，其总包括若干线程，不同的进程之间通信是开发分布式应用程序所必需的，传统上，这不仅需要深入了解通信流两端上进程的对象，而且还要深入了解低级别协议的宿主、应用程序编程接口以及配置工具等。总之，它是一项需要大量专业知识和经验的复杂任务。&lt;br /&gt;&lt;br /&gt;　　幸好.Net为我们提供了远程处理功能，它所提供的通信方法可以快速而方便地完成上述建立通信的任务。因此，无论是需要快速开发 Web 应用程序，还是要花费更多时间生成关键的企业范围的应用程序，.NET Framework 都会提供支持。通过 .NET 远程处理，客户端应用程序可以使用同一台计算机或其网络中其他任何可用的计算机上的其他进程中的对象。&lt;br /&gt;&lt;br /&gt;　　要使用 .NET 远程处理创建可以让两个对象跨越应用程序直接通信的应用程序，只需生成以下对象即可： &lt;br /&gt;&lt;br /&gt;　　1、 可远程处理的对象。&lt;br /&gt;&lt;br /&gt;　　2、 侦听对该远程对象的请求的应用程序即服务器程序。&lt;br /&gt;&lt;br /&gt;　　3、 对该远程对象发出请求的客户端应用程序。&lt;br /&gt;&lt;br /&gt;　　.Net下不同应用程序中的对象的通信方式有两种：一种是跨应用程序域边界传输对象副本，一种是使用代理交换消息。MarshalByRefObject 是通过使用代理交换消息来进行通信的对象的基类。当跨应用程序使用远程对象时，对象的基类必须是从 MarshalByRefObject 继承。&lt;br /&gt;&lt;br /&gt;　　二、 程序实现&lt;br /&gt;&lt;br /&gt;　　（1）我们先在VS的IDE中创建名为“TestRemoteAccess”的新的解决方案来容纳前述用来实现远程处理的三个项目，首先向解决方案中添加名为“RemoteObject”的类库，然后将默认创建的类名更改为“CRemoteAccess”，并且继承于“MarshalByRefObject”，代码如下：&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text; &lt;br /&gt;namespace RemoteObject&lt;br /&gt;{&lt;br /&gt;　public class CRemoteAccess : MarshalByRefObject&lt;br /&gt;　{}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;　　我们需要在该对象内创建用于连接和存取本地Access数据库的所有函数，供服务端客户端程序同时调用。用于连接和存取Access数据库的方法这里不再详述，参看附件源码。&lt;br /&gt;&lt;br /&gt;　　首先所有需要向客户端公开的函数其可见性都必须设为 public。变量m_ConnString需要设置为public static，目的是当客户端调用了SetRemoteAccessConnString后将数据库连接字符串保存下来以备在本次连接期间始终能够访问，代码如下：&lt;br /&gt;&lt;br /&gt;……&lt;br /&gt;public static string m_ConnString;&lt;br /&gt;……&lt;br /&gt;public void SetRemoteAccessConnString(string Connstr)&lt;br /&gt;{&lt;br /&gt;　m_ConnString = Connstr;&lt;br /&gt;}&lt;br /&gt;…… &lt;br /&gt;&lt;br /&gt;　　成功连接了Access数据库后我们需要返回数据集给请求的客户端进行显示和编辑，在远程对象中我们声明了几个相关函数：&lt;br /&gt;&lt;br /&gt;private void LoadData(string SqlStr, string TableName)&lt;br /&gt;public void SaveData(DataTable ClientDataTable)&lt;br /&gt;public DataTable GetUserTable(string SqlStr, string TableName) &lt;br /&gt;&lt;br /&gt;　　客户端可以传递SQL查询脚本通过调用 GetUserTable来获取相关数据库表的数据，并返回一个DataTable，然后可以将该DataTable附值给DataGridView以便将数据显示出来。GetUserTable通过调用私有的LoadData 函数来完成对数据的获取。SaveData函数用于将编辑过的数据集保存回本地Access数据库文件，代码如下：&lt;br /&gt;&lt;br /&gt;……&lt;br /&gt;m_connection.Open();&lt;br /&gt;m_adapter.Update(ClientDataTable);&lt;br /&gt;……&lt;br /&gt;　　（2）远程对象创建完成，我们需要创建用于侦听该远程对象请求的服务端应用程序。在“TestRemoteAccess”解决方案中新建一个Windows窗体项目名为：“TestServer”，从工具箱中拖拽下几个组件，界面如下所示：&lt;a href="http://1.bp.blogspot.com/_LACRXgkTnEo/SPI_oKoIR8I/AAAAAAAAACA/CIXw1IIALzI/s1600-h/1fjh.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_LACRXgkTnEo/SPI_oKoIR8I/AAAAAAAAACA/CIXw1IIALzI/s320/1fjh.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5256333674374776770" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;　　服务器程序TestServer除了具备远程访问对象的能力外，它最主要的作用就是获取实际的Access数据库文件路径，并且设置远程对象的数据库连接字符串。我们必须添加远程对象以及远程处理和网络通讯协议等的类库的引用。在服务器程序启动初始，需要创建远程对象的实例以及注册通信端口，然后调用RemotingConfiguration.RegisterWellKnownServiceType 方法，MSDN中关于该方法的描述是这样的：通过使用给定的参数初始化 WellKnownServiceTypeEntry 的新实例，将服务端上的对象 Type 注册为已知类型，所有知道已注册已知对象的 URI 的客户都可以获取该对象的代理。所谓URI即统一资源标识符 (Uniform Resource Identifier)。代码如下：&lt;br /&gt;&lt;br /&gt;……&lt;br /&gt;remotableObject = new RemoteObject.CRemoteAccess();&lt;br /&gt;TcpChannel channel = new TcpChannel(8080);&lt;br /&gt;ChannelServices.RegisterChannel(channel);&lt;br /&gt;RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.CRemoteAccess), "RithiaTestAccessServer", WellKnownObjectMode.Singleton);&lt;br /&gt;……&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;　　当选择了要进行存取的Access数据库文件后，我们需要调用远程对象的SetRemoteAccessConnString方法，该方法将保存在本次与服务器程序连接期间连接该Access数据库文件的连接字符串，代码如下：&lt;br /&gt;&lt;br /&gt;……&lt;br /&gt;ProviderStr = ProviderStrPart + txtAccessMdbFileName.Text + ";Jet OLEDB:Database Password=" + txtAccessPassword.Text;&lt;br /&gt;……&lt;br /&gt;remotableObject.SetRemoteAccessConnString(ProviderStr);&lt;br /&gt;……&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;　　（3）最后我们创建用于连接和请求服务的客户端程序，它会通过调用服务器程序TestServer已经注册的远程对象来获取相关数据集，并将编辑过的数据保存回实际的数据库文件。在“TestRemoteAccess”解决方案中新建一个Windows窗体项目名为：“TestClient”，从工具箱中拖拽下几个组件，界面如下所示：&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LACRXgkTnEo/SPI_dscR5KI/AAAAAAAAAB4/seZ1JlfOXKw/s1600-h/2fjh.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LACRXgkTnEo/SPI_dscR5KI/AAAAAAAAAB4/seZ1JlfOXKw/s320/2fjh.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5256333494473319586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;　　客户端程序需要知道服务器程序所运行在的计算机名称或IP地址以及侦听的端口号，然后创建远程对象的实例，并且创建DataTable以便接收返回的数据，代码如下：&lt;br /&gt;&lt;br /&gt;……&lt;br /&gt;string RemoteURL;&lt;br /&gt;Host = txtHost.Text;&lt;br /&gt;Port = txtPort.Text;&lt;br /&gt;RemoteURL = "tcp://" + Host + ":" + Port + "/RithiaTestAccessServer";&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;　TcpChannel chan = new TcpChannel();&lt;br /&gt;　ChannelServices.RegisterChannel(chan);&lt;br /&gt;　remoteObject = (RemoteObject.CRemoteAccess)Activator.GetObject(typeof(RemoteObject.CRemoteAccess), RemoteURL);&lt;br /&gt;　RemoteDataTable = new DataTable();&lt;br /&gt;　button3.Enabled = false;&lt;br /&gt;}&lt;br /&gt;catch (Exception E)&lt;br /&gt;{&lt;br /&gt;　MessageBox.Show(E.Message.ToString());&lt;br /&gt;}&lt;br /&gt;finally&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;…… &lt;br /&gt;&lt;br /&gt;　　客户端程序根据服务程序所侦听的信道是TCP还是HTTP来注册相应的信道和端口号，并且组合成远程对象的Url，即Url= 信道://主机名:端口号/对象的Uri，然后创建远程对象的实例，就像使用本地对象一样可以对其进行存取，我们可以调用远程对象的GetUserTable方法获取指定查询脚本的结果集，代码如下：&lt;br /&gt;&lt;br /&gt;……&lt;br /&gt;RemoteDataTable = remoteObject.GetUserTable(txtSQL.Text, "Test");&lt;br /&gt;dataGridView1.DataSource = RemoteDataTable;&lt;br /&gt;…… &lt;br /&gt;&lt;br /&gt;　　保存结果集时仅需简单调用SaveData方法即可，代码如下：&lt;br /&gt;&lt;br /&gt;……&lt;br /&gt;remoteObject.SaveData(RemoteDataTable);&lt;br /&gt;…… &lt;br /&gt;&lt;br /&gt;　　三、 结果&lt;br /&gt;&lt;br /&gt;　　该程序成功地在Visual Studio .Net 2005及Windows XP SP2下调试运行通过。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-2206086715336265565?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/2206086715336265565/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=2206086715336265565' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2206086715336265565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2206086715336265565'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/caccess_5032.html' title='利用C#远程存取Access数据库'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LACRXgkTnEo/SPI_oKoIR8I/AAAAAAAAACA/CIXw1IIALzI/s72-c/1fjh.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-9151536912353628470</id><published>2008-10-21T05:01:00.004-07:00</published><updated>2008-10-21T05:02:14.947-07:00</updated><title type='text'>c#一种简单快速改变窗体风格和肤色的方法源码及其控件</title><content type='html'>原文地址：http://bbs.bccn.net/thread-73964-1-1.html&lt;br /&gt;&lt;br /&gt;学生成绩管理系统源码下载地址&lt;br /&gt;&lt;br /&gt;NetBeans5.5编写&lt;br /&gt;Struts1.2.8 + Hibernate3.1 + MYSQL5.0&lt;br /&gt;&lt;br /&gt;数据库结构为：&lt;br /&gt;DROP DATABASE IF EXISTS ENOVA;&lt;br /&gt;CREATE DATABASE ENOVA;&lt;br /&gt;USE ENOVA;&lt;br /&gt;&lt;br /&gt;CREATE TABLE STUDENT (&lt;br /&gt;    ID int(11) NOT NULL auto_increment,&lt;br /&gt;    NUMBER char(15) NOT NULL UNIQUE,&lt;br /&gt;    NAME varchar(4) NOT NULL ,&lt;br /&gt;    SEX varchar(1) default NULL,&lt;br /&gt;    NATION varchar(10) default NULL,&lt;br /&gt;    ENROLL_YEAR YEAR(4) NOT NULL ,&lt;br /&gt;    BIRTHDAY date default NULL,&lt;br /&gt;    BIRTH_PLACE varchar(50) default NULL,&lt;br /&gt;    PASSWORD char(15) NOT NULL ,&lt;br /&gt;    CLASS_ID int(11) NOT NULL ,&lt;br /&gt;    PRIMARY KEY  (ID))ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;br /&gt;CREATE TABLE TEACHER(&lt;br /&gt;    ID int(11) NOT NULL auto_increment,&lt;br /&gt;    NAME varchar(4) default NULL ,&lt;br /&gt;    SEX varchar(1) default NULL,&lt;br /&gt;    USERNAME char(15) NOT NULL UNIQUE ,&lt;br /&gt;    PASSWORD char(15) NOT NULL ,&lt;br /&gt;    PRIMARY KEY  (ID))ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;br /&gt;CREATE TABLE DEPARTMENT(&lt;br /&gt;    ID int(11) NOT NULL auto_increment,&lt;br /&gt;    NAME varchar(20) NOT NULL,&lt;br /&gt;    PRIMARY KEY (ID))ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;br /&gt;CREATE TABLE SPECIAL(&lt;br /&gt;    ID int(11) NOT NULL auto_increment,&lt;br /&gt;    NAME varchar(20) NOT NULL,&lt;br /&gt;    DEPARTMENT_ID int(11) NOT NULL ,&lt;br /&gt;    PRIMARY KEY (ID))ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;br /&gt;CREATE TABLE CLASS(&lt;br /&gt;    ID int(11) NOT NULL auto_increment,&lt;br /&gt;    NAME varchar(20) NOT NULL,&lt;br /&gt;    TEACHER_ID int(11) NOT NULL ,&lt;br /&gt;    SPECIAL_ID int(11) NOT NULL ,&lt;br /&gt;    YEAR year(4) NOT NULL ,&lt;br /&gt;    PRIMARY KEY (ID))ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;br /&gt;CREATE TABLE COURSE(&lt;br /&gt;    ID int(11) NOT NULL auto_increment,&lt;br /&gt;    NAME varchar(20) NOT NULL,&lt;br /&gt;    TEACHER_ID int(11) NOT NULL ,&lt;br /&gt;    HOUR int(4) default NULL,&lt;br /&gt;    CREDIT float(2,1) NOT NULL ,&lt;br /&gt;    YEAR year(4) default NULL,&lt;br /&gt;    TERM varchar(1) default NULL,&lt;br /&gt;    EXAM_MODE varchar(2) default NULL,&lt;br /&gt;    EXAM_TYPE varchar(2) default NULL,&lt;br /&gt;    TYPE varchar(2) default NULL,&lt;br /&gt;    PRIMARY KEY  (ID))ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;br /&gt;CREATE TABLE SCORE(&lt;br /&gt;    COURSE_ID int(11) NOT NULL ,&lt;br /&gt;    STUDENT_ID int(11) NOT NULL ,&lt;br /&gt;    VALUE int(4) default NULL ,&lt;br /&gt;    DATE date NOT NULL ,&lt;br /&gt;    PRIMARY KEY  (STUDENT_ID,COURSE_ID))ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;br /&gt;CREATE TABLE ROOT(&lt;br /&gt;    ID int(11) NOT NULL auto_increment,&lt;br /&gt;    USERNAME char(15) NOT NULL UNIQUE ,&lt;br /&gt;    PASSWORD char(15) NOT NULL ,&lt;br /&gt;    PRIMARY KEY (ID))ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;br /&gt;CREATE TABLE CLASS_COURSE(&lt;br /&gt;    CLASS_ID int(11) NOT NULL ,&lt;br /&gt;    COURSE_ID int(11) NOT NULL ,&lt;br /&gt;    PRIMARY KEY (CLASS_ID,COURSE_ID))ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;br /&gt;alter table STUDENT add constraint FK_STUDENT_CLASS&lt;br /&gt;      foreign key(CLASS_ID) references CLASS(ID) on delete cascade;&lt;br /&gt;&lt;br /&gt;alter table SPECIAL add constraint FK_SPECIAL_DEPARTMENT&lt;br /&gt;      foreign key(DEPARTMENT_ID) references DEPARTMENT(ID) on delete cascade;&lt;br /&gt;&lt;br /&gt;alter table CLASS add constraint FK_CLASS_TEACHER&lt;br /&gt;      foreign key(TEACHER_ID) references TEACHER(ID) on delete cascade;&lt;br /&gt;&lt;br /&gt;alter table CLASS add constraint FK_CLASS_SPECIAL&lt;br /&gt;      foreign key(SPECIAL_ID) references SPECIAL(ID) on delete cascade;&lt;br /&gt;&lt;br /&gt;alter table SCORE add constraint FK_SCORE_COURSE&lt;br /&gt;      foreign key(COURSE_ID) references COURSE(ID) on delete cascade;&lt;br /&gt;&lt;br /&gt;alter table SCORE add constraint FK_SCORE_SUTDENT&lt;br /&gt;      foreign key(STUDENT_ID) references STUDENT(ID) on delete cascade;&lt;br /&gt;&lt;br /&gt;alter table CLASS_COURSE add constraint FK_CC_CLASS&lt;br /&gt;      foreign key(CLASS_ID) references CLASS(ID) on delete cascade;&lt;br /&gt;&lt;br /&gt;alter table CLASS_COURSE add constraint FK_CC_COURSE&lt;br /&gt;      foreign key(COURSE_ID) references COURSE(ID) on delete cascade;&lt;br /&gt;&lt;br /&gt;alter table COURSE add constraint FK_COURSE_TEACHER&lt;br /&gt;      foreign key(TEACHER_ID) references TEACHER(ID) on delete cascade;&lt;br /&gt;&lt;br /&gt;insert into ROOT(USERNAME,PASSWORD) values('vlinux','lovefs');&lt;br /&gt;&lt;br /&gt;create trigger CLASS_COURSE_DELETE BEFORE DELETE ON CLASS_COURSE&lt;br /&gt;       FOR EACH ROW DELETE FROM SCORE WHERE COURSE_ID=old.COURSE_ID &lt;br /&gt;           and STUDENT_ID in (SELECT ID FROM STUDENT WHERE CLASS_ID=old.CLASS_ID);&lt;br /&gt;&lt;br /&gt;grant all on ENOVA.* to enova@localhost identified by "enova" with grant option;&lt;br /&gt;&lt;br /&gt;数据结构文件可以从/enova/src/enova/ENOVA_DB.SQL中找到&lt;br /&gt;&lt;br /&gt;管理员初始帐号／密码为：vlinux/lovefs&lt;br /&gt;&lt;br /&gt;PS：管理员的学生成绩管理模块还没时间做，如果那个人有能力的就帮忙做了吧，不过估计在这个注释缺乏的程序中想快速理解好像有点难度。考试完我会适当加上注释的。毕竟我目前的目标就是为BCCN写一个自己的论坛。&lt;br /&gt;大家可以把这个程序当成一本书，有什么对Struts、Hibernate不理解的地方可以参考一下。呵呵，一起努力吧。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-9151536912353628470?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/9151536912353628470/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=9151536912353628470' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/9151536912353628470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/9151536912353628470'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_7347.html' title='c#一种简单快速改变窗体风格和肤色的方法源码及其控件'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-4768608128741102040</id><published>2008-10-21T05:01:00.003-07:00</published><updated>2008-10-21T05:01:53.508-07:00</updated><title type='text'>用 C# 编程实现读写Binary</title><content type='html'>本文给出一个用 C# 编程实现读写 Binary 的实例代码，对于初学者来说是个不可多得的参考性文章……&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　//返回blob数据 &lt;br /&gt;　　public MemoryStream getBlob(string SQL) &lt;br /&gt;　　...{ &lt;br /&gt;　　try &lt;br /&gt;　　...{ &lt;br /&gt;　　Db_Conn(); &lt;br /&gt;　　cmd = new OleDbCommand(SQL, Conn); &lt;br /&gt;　　cmd.CommandType = CommandType.Text;//是sql &lt;br /&gt;　　OleDbDataReader Rs = cmd.ExecuteReader(); &lt;br /&gt;　　if (Rs.Read()) //循环到下一条记录 &lt;br /&gt;　　...{ &lt;br /&gt;　　if (!(Rs.GetValue(0) is System.DBNull)) &lt;br /&gt;　　...{ &lt;br /&gt;　　byte[] image_bytes = (byte[])Rs.GetValue(0); &lt;br /&gt;　　MemoryStream ms = new MemoryStream(image_bytes); &lt;br /&gt;　　return ms; &lt;br /&gt;　　} &lt;br /&gt;　　else &lt;br /&gt;　　return null; &lt;br /&gt;　　} &lt;br /&gt;　　else &lt;br /&gt;　　return null; &lt;br /&gt;　　} &lt;br /&gt;　　finally &lt;br /&gt;　　...{ &lt;br /&gt;　　this.close(); &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;　　//设置blob &lt;br /&gt;　　public bool SetBlob(string SQL, MemoryStream Ms) &lt;br /&gt;　　...{ &lt;br /&gt;　　try &lt;br /&gt;　　...{ &lt;br /&gt;　　Db_Conn(); &lt;br /&gt;　　cmd = new OleDbCommand(SQL, Conn); &lt;br /&gt;　　cmd.CommandType = CommandType.Text;//是sql &lt;br /&gt;　　int n=Convert.ToInt32(Ms.Length.ToString()); &lt;br /&gt;　　Ms.Position = 0; &lt;br /&gt;　　byte[] pReadByte = new Byte[n]; &lt;br /&gt;　　Ms.Read(pReadByte, 0, n); &lt;br /&gt;　　cmd.Parameters.Add("BLOB", OleDbType.Binary).Value = pReadByte; &lt;br /&gt;　　cmd.ExecuteNonQuery(); &lt;br /&gt;　　return true; &lt;br /&gt;　　} &lt;br /&gt;　　catch (Exception ex) &lt;br /&gt;　　...{ &lt;br /&gt;　　MessageBox.Show("错误:因" + ex.Message + ",无法执行:" + SQL); &lt;br /&gt;　　return false; &lt;br /&gt;　　} &lt;br /&gt;　　finally &lt;br /&gt;　　...{ &lt;br /&gt;　　this.close(); &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　调用 getBlob&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　String sqlStr = "select content from dp where id=" + ID;//content为dp中的BLOB字段,ID为主键 &lt;br /&gt;　　MemoryStream ms = DBClass.getBlob(sqlStr); &lt;br /&gt;　　if (ms == null) &lt;br /&gt;　　richTextBox.Clear(); &lt;br /&gt;　　else &lt;br /&gt;　　...{ &lt;br /&gt;　　if (ms.Length &gt; 0) &lt;br /&gt;　　...{ &lt;br /&gt;　　ms.Position = 0; &lt;br /&gt;　　try &lt;br /&gt;　　...{ &lt;br /&gt;　　richTextBox.LoadFile(ms, RichTextBoxStreamType.RichText); &lt;br /&gt;　　}catch...{ &lt;br /&gt;　　richTextBox.LoadFile(ms, RichTextBoxStreamType.PlainText); &lt;br /&gt;　　} &lt;br /&gt;　　}else &lt;br /&gt;　　richTextBox.Clear(); &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　调用setBlob&lt;br /&gt;&lt;br /&gt;以下是引用片段：&lt;br /&gt;　　String sqlStr = "update dp set content=:BLOB where id=" + ID; &lt;br /&gt;　　MemoryStream ms = new MemoryStream(); &lt;br /&gt;　　richTextBox.SaveFile(ms, RichTextBoxStreamType.RichText); &lt;br /&gt;　　if (!DBClass.SetBlob(sqlStr, ms)) &lt;br /&gt;　　...{ &lt;br /&gt;　　MessageBox.Show("保存失败"); &lt;br /&gt;　　}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-4768608128741102040?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/4768608128741102040/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=4768608128741102040' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4768608128741102040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4768608128741102040'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c-binary.html' title='用 C# 编程实现读写Binary'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-5151226103334382556</id><published>2008-10-21T05:01:00.001-07:00</published><updated>2008-10-21T05:01:31.660-07:00</updated><title type='text'>C#操作ACCESS数据库（创建,压缩,备份,恢复）</title><content type='html'>用C#压缩和修复Access数据库(这部分是劳动人民翻译的)&lt;br /&gt;介绍&lt;br /&gt;    下面这段C# 代码可以用来压缩和修复Access数据库,不管它是一个简单的".mdb"ACCESS数据库还是一个".mdw"网络共享数据库,这个过程和你在用MS Access应用程序中使用的"工具-数据库实用工具-压缩和修复"时执行的操作完全一样.实例代码使用了"迟绑定"(运行中在内存中建立COM对象),这样就不需要在工程中加入COM引用了,也不需要在PC上安装MS Access应用程序.只需要一个Jet引擎(Jet引擎包含在MDAC安装包中,在Windows NT4以后的版本中,系统已经自带了这个引擎).&lt;br /&gt;&lt;br /&gt;C#操作ACCESS数据库的背景&lt;br /&gt;   不知你是否也厌烦了在工程中加入复杂的COM库引用,但我相信这个纯.NET代码将省去额外的交互操作, RCWs和COM引用.基本上,由于系统中安装的Microsoft类库的不同(例如:MS Office Object Library 9,10,11等等),我们也不知道用户PC中安装的Office版本,所以我们要通过ProgID来访问COM对象,而不能用CLSID.例如,当调用"Excel.Application",时,得到的是Excel,而不管系统中安装MS Office的版本,当在代码中加入"MS Excel 10 Object library"引用时,其实只是给应用程序加入了一个非常受限制的功能.所以我们使用System.Reflection和迟绑定.&lt;br /&gt;1. 实例代码&lt;br /&gt;只需调用CompactAccessDB函数即可压缩和修复目标数据库.&lt;br /&gt;&lt;br /&gt;2. 参数:&lt;br /&gt;connectionString – 用来连接到Access数据库. &lt;br /&gt;Mdwfilename –要压缩的MDB文件的全名(路径+文件名). &lt;br /&gt;由于Jet引擎的限制,执行此方法压缩Access数据库会把结果生成为一个新文件,所以我们要还需要把这个新的Access文件拷贝到目的位置覆盖原来未压缩文件.&lt;br /&gt;&lt;br /&gt;当调用此方法时请确认被压缩数据库无打开的连接.&lt;br /&gt;&lt;br /&gt;C#操作ACCESS数据库 代码如下:&lt;br /&gt;&lt;br /&gt;/// MBD compact method © 2004 Alexander Youmashev&lt;br /&gt;/// !!IMPORTANT!!&lt;br /&gt;/// !make sure there's no open connections&lt;br /&gt;///    to your db before calling this method!&lt;br /&gt;/// !!IMPORTANT!!&lt;br /&gt;/// &lt;br /&gt;/// &lt;br /&gt;connection string to your db&lt;br /&gt;/// &lt;br /&gt;FULL name&lt;br /&gt;///     of an MDB file you want to compress.&lt;br /&gt;Public static void CompactAccessDB(string connectionString, string mdwfilename)&lt;br /&gt;{&lt;br /&gt;    object[] oParams;&lt;br /&gt;&lt;br /&gt;//create an inctance of a Jet Replication Object&lt;br /&gt;    object objJRO = &lt;br /&gt;      Activator.CreateInstance(Type.GetTypeFromProgID(\"JRO.JetEngine\"));&lt;br /&gt;&lt;br /&gt;//filling Parameters array&lt;br /&gt;    //cnahge \"Jet OLEDB:Engine Type=5\" to an appropriate value&lt;br /&gt;    // or leave it as is if you db is JET4X format (access 2000,2002)&lt;br /&gt;    //(yes, jetengine5 is for JET4X, no misprint here)&lt;br /&gt;&lt;br /&gt;oParams = new object[] { &lt;br /&gt;        connectionString,&lt;br /&gt;        \"Provider=Microsoft.Jet.OLEDB.4.0;Data\" + &lt;br /&gt;        \" Source=C:tempdb.mdb;Jet OLEDB:Engine Type=5\"};&lt;br /&gt;&lt;br /&gt;//invoke a CompactDatabase method of a JRO object&lt;br /&gt;    //pass Parameters array&lt;br /&gt;&lt;br /&gt;objJRO.GetType().InvokeMember(\"CompactDatabase\", &lt;br /&gt;        System.Reflection.BindingFlags.InvokeMethod,&lt;br /&gt;        null,&lt;br /&gt;        objJRO,&lt;br /&gt;        oParams);&lt;br /&gt;&lt;br /&gt;//database is compacted now&lt;br /&gt;    //to a new file C:tempdb.mdw&lt;br /&gt;    //let's copy it over an old one and delete it&lt;br /&gt;&lt;br /&gt;System.IO.File.Delete(mdwfilename);&lt;br /&gt;    System.IO.File.Move(\"C:tempdb.mdb\", mdwfilename);&lt;br /&gt;    //clean up (just in case)&lt;br /&gt;    System.Runtime.InteropServices.Marshal.ReleaseComObject(objJRO);&lt;br /&gt;    objJRO=null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;教你一种更绝的：如何在没有Microsoft Access用.NET操作ACCESS数据库？(创建,压缩,备份,恢复组件) （这部分可不是翻译的）&lt;br /&gt;&lt;br /&gt;手头没有Microsoft Access，C#如何操作ACCESS数据库？&lt;br /&gt;写一个小型程序,手头没有Microsoft Access,如何建立数据库,一切依然简单.&lt;br /&gt;首先引用C:Program FilesCommon FilesSystemadomsadox.dll,该DLL包含ADOX命名空间;&lt;br /&gt;接着引用C:Program FilesCommon FilesSystemadomsjro.dll,该DLL包含JRO命名空间&lt;br /&gt;注意:如，导入dll不成功，手动把com组件 导入为 .net组件，在用vs.net工具导入 &lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.IO; &lt;br /&gt;using ADOX; //该命名空间包含创建ACCESS的类(方法)--解决方案 ==&gt; 引用 ==&gt; 添加引用 ==&gt; 游览找到.dll&lt;br /&gt;using JRO; //该命名空间包含压缩ACCESS的类(方法)&lt;br /&gt;&lt;br /&gt;public class Access&lt;br /&gt;{&lt;br /&gt;    ///根据指定的文件名称创建ACCESS数据库&lt;br /&gt;    ///mdbPath:要创件的ACCESS绝对路径&lt;br /&gt;    public void Create( string mdbPath )&lt;br /&gt;    {&lt;br /&gt;        if( File.Exists(mdbPath) ) //检查数据库是否已存在&lt;br /&gt;        {&lt;br /&gt;            throw new Exception(\"目标数据库已存在,无法创建\");&lt;br /&gt;        }&lt;br /&gt;        // 可以加上密码,这样创建后的数据库必须输入密码后才能打开&lt;br /&gt;        mdbPath = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\" + mdbPath;&lt;br /&gt;        // 创建一个CatalogClass对象的实例,&lt;br /&gt;        ADOX.CatalogClass cat = new ADOX.CatalogClass();&lt;br /&gt;        // 使用CatalogClass对象的Create方法创建ACCESS数据库&lt;br /&gt;        cat.Create(mdbPath);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ///压缩修复ACCESS数据库,mdbPath为数据库绝对路径&lt;br /&gt;    public void Compact( string mdbPath )&lt;br /&gt;    {&lt;br /&gt;        if( !File.Exists(mdbPath) ) //检查数据库是否已存在&lt;br /&gt;        {&lt;br /&gt;            throw new Exception(\"目标数据库不存在,无法压缩\");&lt;br /&gt;        }&lt;br /&gt;        //声明临时数据库的名称&lt;br /&gt;        string temp = DateTime.Now.Year.ToString();&lt;br /&gt;        temp += DateTime.Now.Month.ToString();&lt;br /&gt;        temp += DateTime.Now.Day.ToString();&lt;br /&gt;        temp += DateTime.Now.Hour.ToString();&lt;br /&gt;        temp += DateTime.Now.Minute.ToString();&lt;br /&gt;        temp += DateTime.Now.Second.ToString() + \".bak\";&lt;br /&gt;        temp = mdbPath.Substring(0, mdbPath.LastIndexOf(\"\")+1) + temp;&lt;br /&gt;        //定义临时数据库的连接字符串&lt;br /&gt;        temp2 = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\" + temp;&lt;br /&gt;        //定义目标数据库的连接字符串&lt;br /&gt;        mdbPath2 = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\" + mdbPath;&lt;br /&gt;        //创建一个JetEngineClass对象的实例&lt;br /&gt;        JRO.JetEngineClass jt = new JRO.JetEngineClass();&lt;br /&gt;        //使用JetEngineClass对象的CompactDatabase方法压缩修复数据库&lt;br /&gt;        jt.CompactDatabase( mdbPath2, temp2 );&lt;br /&gt;        //拷贝临时数据库到目标数据库(覆盖)&lt;br /&gt;        File.Copy( temp, mdbPath, true );&lt;br /&gt;        //最后删除临时数据库&lt;br /&gt;        File.Delete( temp ); &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// 备份数据库,mdb1,源数据库绝对路径; mdb2: 目标数据库绝对路径 &lt;br /&gt;    public void Backup( string mdb1, string mdb2 )&lt;br /&gt;    {&lt;br /&gt;        if( !File.Exists(mdb1) )&lt;br /&gt;        {&lt;br /&gt;            throw new Exception(\"源数据库不存在\");&lt;br /&gt;        }&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            File.Copy( mdb1, mdb2, true );&lt;br /&gt;        }&lt;br /&gt;        catch( IOException ixp )&lt;br /&gt;        {&lt;br /&gt;            throw new Exception(ixp.ToString());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ///恢复数据库,mdb1为备份数据库绝对路径,mdb2为当前数据库绝对路径&lt;br /&gt;    public void Recover( string mdb1, string mdb2 )&lt;br /&gt;    {&lt;br /&gt;        if( !File.Exists(mdb1) )  &lt;br /&gt;        {&lt;br /&gt;            throw new Exception(\"备份数据库不存在\"); &lt;br /&gt;        }&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            File.Copy( mdb1, mdb2, true );&lt;br /&gt;        }&lt;br /&gt;        catch( IOException ixp )&lt;br /&gt;        {&lt;br /&gt;            throw new Exception(ixp.ToString());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-5151226103334382556?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/5151226103334382556/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=5151226103334382556' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/5151226103334382556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/5151226103334382556'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/caccess_1788.html' title='C#操作ACCESS数据库（创建,压缩,备份,恢复）'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-349411505495994574</id><published>2008-10-21T05:00:00.004-07:00</published><updated>2008-10-21T05:01:08.565-07:00</updated><title type='text'>C#接口的作用</title><content type='html'>1、C#接口的作用 ：&lt;br /&gt;&lt;br /&gt;C#接口是一个让很多初学C#者容易迷糊的东西，用起来好像很简单，定义接口，里面包含方法，但没有方法具体实现的代码，然后在继承该接口的类里面要实现接口的所有方法的代码，但没有真正认识到接口的作用的时候就觉得用接口是多此一举，当然你这样想那是绝对绝对错误的，比尔盖茨的微软请的员工都是比盖茨还聪明的人，他们的C#能添这样的多足吗？！关于接口的作用，网上有一位就真的深入浅出给我们做了很好理解的分析。 我们定义一个接口&lt;br /&gt;public interface IBark&lt;br /&gt;{&lt;br /&gt;    void Bark();&lt;br /&gt;}&lt;br /&gt;再定义一个类,继承于IBark,并且必需实现其中的Bark()方法&lt;br /&gt;public class Dog:IBark&lt;br /&gt;{&lt;br /&gt;    public Dog()&lt;br /&gt;    {}&lt;br /&gt;    public void Bark()&lt;br /&gt;    {&lt;br /&gt;       Consol.write("汪汪");&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;然后,声明Dog的一个实例,并调用Bark()方法&lt;br /&gt;      Dog 旺财=new Dog();&lt;br /&gt;      旺财.Bark();&lt;br /&gt;试想一样,若是想调用Bark()方法,只需要在Dog()中声明这样的一个方法不就行了吗,干什么还要用接口呢.因为接口中并没有Bark()具体实现.真的实现还是要在Dog()中.那么使用接口不是多此一举吗?&lt;br /&gt;还有人是这样说的:从接口的定义方面来说,接口其实就是类和类之间的一种协定,一种约束.还拿上面的例子来说.所有继承了IBark接口的类中必需实现Bark()方法.那么从用户(使用类的用户)的角度来说,如果他知道了某个类是继承于IBark接口,那么他就可以放心大胆的调用Bark()方法,而不用管Bark()方法具体是如何实现的.比如,我们另外写了一个类.&lt;br /&gt;       public class Cat:IBark&lt;br /&gt;       {&lt;br /&gt;          public Cat()&lt;br /&gt;          {}&lt;br /&gt;          public void Bark()&lt;br /&gt;          {&lt;br /&gt;             Consol.write("喵喵");&lt;br /&gt;          }&lt;br /&gt;       }&lt;br /&gt;当用户用到Cat类或是Dog类的时候,知道他们继承于IBark,那么不用管类里的具体实现,而就可以直接调用Bark()方法,因为这两个类中肯定有关于Bark()方法的具体实现.&lt;br /&gt;&lt;br /&gt;如果我们从设计的角度来看.一个项目中用若干个类需要去编写,由于这些类比较复杂,工作量比较大,这样每个类就需要占用一个工作人员进行编写.比如A程序员去定Dog类,B程序员去写Cat类.这两个类本来没什么联系的,可是由于用户需要他们都实现一个关于"叫"的方法.这就要对他们进行一种约束.让他们都继承于IBark接口,目的是方便统一管理.另一个是方便调用.当然了,不使用接口一样可以达到目的.只不过这样的话,这种约束就不那么明显,如果这样类还有Duck类等等,比较多的时候难免有人会漏掉这样方法.所以说还是通过接口更可靠一些,约束力更强一些.&lt;br /&gt;&lt;br /&gt;2、C#中接口的深入浅出:&lt;br /&gt;通过学习对C#中接口的作用有了更进一步的理解，拿出来跟大家分享一下，有说的不对的地方请大家指教。&lt;br /&gt;我在上一篇帖子（http://www.programfan.com/club/showbbs.asp?id=150228）中只是简单的谈了一下接口的作用，有兴趣的朋友可以去看一下。&lt;br /&gt;言归正传：&lt;br /&gt;    假设我们公司有两种程序员：VB程序员，指的是用VB写程序的程序员，用clsVBProgramer这个类表示；Delphi程序员指的是用Delphi写程序的程序员，用clsDelphiProgramer这个类来表示。每个类都有一个WriteCode()方法。定义如下： &lt;br /&gt;class clsVBProgramer()&lt;br /&gt;{&lt;br /&gt;....&lt;br /&gt;WriteCode()&lt;br /&gt;{&lt;br /&gt;     //用VB语言写代码；&lt;br /&gt;}&lt;br /&gt;....&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class clsDelphiProgramer()&lt;br /&gt;{&lt;br /&gt;....&lt;br /&gt;WriteCode()&lt;br /&gt;{&lt;br /&gt;    //用Delphi语言写代码；&lt;br /&gt;}&lt;br /&gt;   ....&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;现在公司来了一个项目，要求派某个程序员写一个程序。&lt;br /&gt;class clsProject()&lt;br /&gt;{&lt;br /&gt;....&lt;br /&gt;WritePrograme(clsVBProgramer programer)//用VB写代码&lt;br /&gt;{&lt;br /&gt;    programer.WriteCode();&lt;br /&gt;}&lt;br /&gt;WritePrograme(clsDelphiProgramer programer)//重载方法，用Delphi写代码&lt;br /&gt;{&lt;br /&gt;    programer.WriteCode();&lt;br /&gt;}&lt;br /&gt;......&lt;br /&gt;}&lt;br /&gt;在主程序中我们可以这样写：&lt;br /&gt;main()&lt;br /&gt;{&lt;br /&gt;   clsProject proj=new clsProject;&lt;br /&gt;   //如果需要用VB写代码&lt;br /&gt;   clsVBProgramer programer1=new clsVBProgramer;&lt;br /&gt;   proj.WritePrograme(programer1);&lt;br /&gt;   //如果需要用Delphi写代码&lt;br /&gt;   clsDelphiProgramer programer2=new clsDelphiProgramer;&lt;br /&gt;   proj.WritePrograme(programer2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;但是如果这时公司又来了一个C#程序员，我们怎么改这段程序，使它能够实现用C#写程序的功能呢？我们需要增加一个新类clsCSharpProgramer,同时在此clsProject这个类中要再次重载WritePrograme（clsCSharpProgramer programer）方法。这下麻烦多了。如果还有C程序员，C++程序员，JAVA程序员呢。麻烦大了！&lt;br /&gt;&lt;br /&gt;但是如果改用接口，就完全不一样了：&lt;br /&gt;首先声明一个程序员接口：&lt;br /&gt;interface IProgramer()&lt;br /&gt;{&lt;br /&gt;WriteCode();&lt;br /&gt;}&lt;br /&gt;然后声明两个类，并实现IProgramer接口：&lt;br /&gt;class clsVBProgramer():IProgramer&lt;br /&gt;{&lt;br /&gt;....&lt;br /&gt;WriteCode()&lt;br /&gt;{&lt;br /&gt;     //用VB语言写代码；&lt;br /&gt;}&lt;br /&gt;....&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class clsDelphiProgramer():IProgramer&lt;br /&gt;{&lt;br /&gt;....&lt;br /&gt;WriteCode()&lt;br /&gt;{&lt;br /&gt;    //用Delphi语言写代码；&lt;br /&gt;}&lt;br /&gt;   ....&lt;br /&gt;}&lt;br /&gt;对clsProject这个类进行一下修改：&lt;br /&gt;class clsProject()&lt;br /&gt;{&lt;br /&gt;....&lt;br /&gt;WritePrograme(IProgramer programer)&lt;br /&gt;{&lt;br /&gt;    programer.WriteCode();//写代码&lt;br /&gt;}&lt;br /&gt;......&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;main()&lt;br /&gt;{&lt;br /&gt;   clsProject proj=new clsProject;&lt;br /&gt;   IProgramer programer;&lt;br /&gt;   //如果需要用VB写代码&lt;br /&gt;   programer=new clsVBProgramer;&lt;br /&gt;   proj.WritePrograme(programer);&lt;br /&gt;   //如果需要用Delphi写代码&lt;br /&gt;   programer=new clsDelphiProgramer;&lt;br /&gt;   proj.WritePrograme(programer);   &lt;br /&gt;}&lt;br /&gt;如果再有C#，C，C++，JAVA这样的程序员添加进来的话，我们只需把它们相关的类加进来，然后在main()中稍做修改就OK了。扩充性特别好！&lt;br /&gt;&lt;br /&gt;另外我们如果把clsProject这个类封成一个组件，那么当我们的用户需要要扩充功能的时候，我们只需要在外部做很小的修改就能实现，可以说根本就用不着改动我们已经封好组件！是不是很方便，很强大！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-349411505495994574?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/349411505495994574/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=349411505495994574' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/349411505495994574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/349411505495994574'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_5644.html' title='C#接口的作用'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-5990046207139106504</id><published>2008-10-21T05:00:00.003-07:00</published><updated>2008-10-21T05:00:48.143-07:00</updated><title type='text'>运用C#完成分布式数据库查询</title><content type='html'>随着传统的数据库、计算机网络和数字通信技术的飞速发展，以数据分布存储和分布处理为主要特征的分布式数据库系统的研究和开发越来越受到人们的关注。但由于其开发较为复杂，在一定程度上制约了它的发展。基于此，本文提出了在.Net环境下使用一种新的开发语言C#结合ADO.Net数据访问模型来开发分布式数据库系统，大大简化了开发过程。&lt;br /&gt;&lt;br /&gt;　　1 分布式数据库系统&lt;br /&gt;&lt;br /&gt;　　就其本质而言，分布式数据库系统的数据在逻辑上是统一的，而在物理上却是分散的。与集中式数据库相比它有如下主要优点：&lt;br /&gt;&lt;br /&gt;　　· 解决组织机构分散而数据需要相互联系的问题。&lt;br /&gt;&lt;br /&gt;　　· 均衡负载。负载在各处理机间分担，可避免临界瓶颈。&lt;br /&gt;&lt;br /&gt;　　· 可靠性高。数据分布在不同场地，且存有多个副本，即使个别场地发生故障，不致引起整个系统的瘫痪。&lt;br /&gt;&lt;br /&gt;　　· 可扩充性好。当需要增加新的相对自主的组织单位时，可在对当前机构影响最小的情况下进行扩充。&lt;br /&gt;&lt;br /&gt;　　分布式数据库系统虽然有诸多优点，但它同时也带来了许多新问题。如：数据一致性问题、数据远程传递的实现、通信开销的降低等，这使得分布式数据库系统的开发变得较为复杂。幸运的是，微软的.Net开发环境为我们提供了C#开发语言和ADO.Net数据访问模型，结合两者来开发分布式数据库系统能够大大简化开发工作。&lt;br /&gt;&lt;br /&gt;　　2 远程处理框架和ADO.Net&lt;br /&gt;&lt;br /&gt;　　开发分布式数据库系统需要解决的两个重要问题是：各场地间的数据通信以及对数据库的操作及管理。使用C#结合ADO.Net能够高效、可靠地解决这两方面的问题。具体表现为，在C#中通过使用.Net远程处理框架能够方便地解决数据、命令远程传递问题；C#通过ADO.Net对数据库进行操作，使分布式数据库系统中对数据库的各种操作变得高效、可靠，同时易于解决数据一致性问题。&lt;br /&gt;&lt;br /&gt;　　2.1 .Net远程处理框架&lt;br /&gt;&lt;br /&gt;　　实现数据和命令的远程传递有三种方式。第一种是使用报文或消息的方式，把要传送的数据转化为流格式，再通过套接字编程用报文的形式发送到远程主机。此种方法麻烦，不易实现。第二种是使用Web Service，即各远程主机提供一个数据库查询服务的Web Service。这种方式只能对单个场地进行查询，无法实现多场地的联合查询。第三种是使用.Net远程处理框架（.Net Remoting Framework）技术，它将远程调用的技术细节隐藏起来，服务程序只需通过简单的设置就可以把本地对象变成为远程提供服务的远程对象，客户端可以像访问本地对象一样透明地访问远程对象，所有的消息、报文等都交给.Net Remoting对象处理，大大简化了开发。远程处理的一般过程如图1所示：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;图1 远程处理过程&lt;br /&gt;&lt;br /&gt;　　首先，服务器端创建一个服务器类的实例，远程处理系统创建一个表示该类的代理对象，并向客户端对象返回一个对该代理的引用。当客户端调用方法时，远程处理基础结构连接检查类型信息，并通过信道将该调用发送到服务器进程。侦听信道获得该请求并将其转发给服务器远程处理系统，服务器远程处理系统查找（或在必要时创建）并调用被请求的对象。然后，此过程将反向进行，服务器远程处理系统将响应捆绑成消息并由服务器信道发送到客户端信道。最后，客户端远程处理系统通过代理将调用的结果返回给客户端对象。&lt;br /&gt;&lt;br /&gt;　　2.2 ADO.Net&lt;br /&gt;&lt;br /&gt;　　ADO.Net以XML为核心，是.Net数据库应用程序的解决方案。它使用离线数据结构，数据源中的数据被缓存到数据集（DataSet）对象中，用户无须锁定数据源，数据以XML格式保存。&lt;br /&gt;&lt;br /&gt;　　2.2.1 ADO.Net管理数据一致性&lt;br /&gt;&lt;br /&gt;　　在分布式数据库系统中，很可能出现多个用户同时访问和修改数据的情况，因此，对于分布式数据库系统，数据一致性是不可或缺的。ADO.Net通过使用乐观一致性方案来控制数据一致性（实际上DataSet对象被设计成支持使用乐观一致性控制机制），即数据行只有在数据库中真正被更新时才会被锁定，而在悲观一致性方案中，数据行在从被提取出来到在数据库中更新这段时间内一直被锁定。因此，使用ADO.Net能够在更少的时间内响应数量巨大的用户。&lt;br /&gt;&lt;br /&gt;　　另外，在分布式数据库系统中，还会经常遇到当用户修改自从提取出来以来已经被修改的行时，违反一致性原则。对此问题ADO.Net也作了很好地解决，即使用DataSet对象为每一条修改过的记录维护两个版本：原始版本和更新版本，在更新的记录被写回数据库之前，先要把数据集中记录的原始版本与数据库中的当前版本进行比较，如果两个版本匹配，就在数据库中更新记录；否则，就会出现违反一致性原则的错误。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　3 实例开发&lt;br /&gt;&lt;br /&gt;　　一个家用电器连锁店设有一个总部和许多分店，总部和分店以及各分店之间经常需要进行各种信息的查询（如：商品当日价目表、各店销售状况和库存信息等），对此组织机构建立分布式数据库查询系统，可实现总部和各店信息的共享，便于统一管理。&lt;br /&gt;&lt;br /&gt;　　3.1 系统设计&lt;br /&gt;&lt;br /&gt;　　3.1.1系统结构图&lt;br /&gt;&lt;br /&gt;　　系统结构如图2所示：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;图2 系统结构图&lt;br /&gt;&lt;br /&gt;　　总部和各分店都配置了一台具有固定IP的服务器，其它电脑通过集线器与服务器相连，总部和各分店的服务器通过通信网络联接起来。&lt;br /&gt;&lt;br /&gt;　　3.1.2 系统实现步骤&lt;br /&gt;&lt;br /&gt;　　系统实现分为三个主要步骤。首先，为总部和各分店设计数据库。由于数据量较大，故采用SQL Server为每个分店创建销售和库存数据库，同时为总部创建员工数据库、整个连锁店的存货数据库、信用卡客户数据库以及供应商信息数据库等。其次，需要建立一个提供数据库服务（DbServer）的动态链接库（dll），将查询时所要用到的一些服务（如：远程对象的发布和获取等）和函数（如：本地异地数据表的查询、数据表的远程创建和删除、表间的连接和合并等）置入该dll中，各分店都需要使用这个dll，以便查询时对一些服务和函数进行调用。最后，根据实际需要开发客户端查询界面。&lt;br /&gt;&lt;br /&gt;　　3.2系统实现的关键技术&lt;br /&gt;&lt;br /&gt;　　3.2.1 远程对象的发布与获取&lt;br /&gt;&lt;br /&gt;　　系统运行后所要做的第一个工作是发布本地的远程对象并获取其它各店所发布的远程对象。发布远程对象时，首先要设置一个网络端口号，然后创建并注册一个通道，最后发布该服务器端的激活对象。其它场地的服务器根据IP地址和网络端口号即可方便地获取所发布的远程对象。实现远程对象发布和获取的关键代码如下：&lt;br /&gt;&lt;br /&gt;　　远程对象的发布：&lt;br /&gt;&lt;br /&gt;//创建一个通道实例,port为指定的网络端口号&lt;br /&gt;TcpChannel MyChannel= new TcpChannel (Int32.Parse(port));&lt;br /&gt;//注册通道&lt;br /&gt;ChannelServices.RegisterChannel(MyChannel);&lt;br /&gt;//发布该服务器端激活对象&lt;br /&gt;RemotingConfiguration.RegisterWellKnownServiceType( typeof ( DbServer ), "STORE", WellKnownObjectMode.Singleton);&lt;br /&gt;远程对象的获取：&lt;br /&gt;//根据IP地址和端口号获取相应的远程对象&lt;br /&gt;try&lt;br /&gt;{myDbServer=(DbServer)Activator.GetObject(typeof(DbServer),"tcp://"+ip+":"+p+"/STORE"); }&lt;br /&gt;//捕捉异常 &lt;br /&gt;catch( NullReferenceException nullExp )&lt;br /&gt;{MessageBox.Show( "指定的url地址不可到达 " + nullExp.Message );}&lt;br /&gt;catch( RemotingException remExp )&lt;br /&gt;{MessageBox.Show( "指定获得的对象定义不对" + remExp.Message );} &lt;br /&gt;&lt;br /&gt;　　3.2.2数据库的访问&lt;br /&gt;&lt;br /&gt;　　通过ADO.Net访问数据库，可以方便地连接数据库，将数据源中的数据导入DataSet对象中，在DataSet对象中可对数据表进行各种操作，而且DataSet对象本身也可远程传递。这为开发分布式数据库系统带来极大方便。实现数据库访问的关键代码如下所示：&lt;br /&gt;&lt;br /&gt;//建立数据库的连接 &lt;br /&gt;string SqlConn = "Initial Catalog=Store;Data Source=Localhost;Userid=sa;Password=;";&lt;br /&gt;SqlConnection Conn= new SqlConnection&lt;br /&gt;(SqlConn);&lt;br /&gt;Conn.Open();//打开数据库&lt;br /&gt;//将数据源中的数据导入到数据集对象&lt;br /&gt;try{ &lt;br /&gt;DataSet ds = new DataSet();&lt;br /&gt;DataTable dt=new DataTable("Result");&lt;br /&gt;SqlDataAdapter adapter=new SqlDataAdapter();&lt;br /&gt;SqlCommand mySqlDataSetCmd =new SqlCommand&lt;br /&gt;(CmdString,Conn);//CmdString为要执行的命令&lt;br /&gt;adapter.SelectCommand= mySqlDataSetCmd;&lt;br /&gt;adapter.Fill(dt);&lt;br /&gt;ds.Tables.Add(dt); }&lt;br /&gt;finally&lt;br /&gt;{ Conn.Close();//关闭数据库的连接}  &lt;br /&gt;&lt;br /&gt;　　3.2.3 查询&lt;br /&gt;&lt;br /&gt;　　分布式数据库系统中的查询一般分为三类：本地查询、远程查询和联合查询。本地查询和集中式数据库的查询没什么区别；对于远程查询，只要获取远程对象后，调用查询函数，即可方便地实现；最复杂的是联合查询，涉及到多场地之间数据的查询、表的远程创建、传递、连接、合并等技术。下面以实例介绍联合查询的实现。&lt;br /&gt;&lt;br /&gt;　　第二连锁店要查询离其较近的第三、第四连锁店中所有北京的供应商所供应的空调的库存信息以便调货，可通过以下步骤实现。首先，获取总部以及第三、第四连锁店所发布的远程对象。接着，通过远程对象在总部创建一临时数据表t1，将查询到的所有北京的供应商信息存放在t1表中（各分店只有供应商名，并不知其所在地，只有总部才有供应商的详细信息），再将t1表保存到第三和第四连锁店。然后让t1表分别与两店的库存表作连接，找出所有北京供应商所供应的空调库存信息（如空调名称、型号、个数、价格等信息），并将连接结果t2和t3数据表返回到第二连锁店。最后对t2和t3两表进行合并，并使用DataGrid控件显示出来。上述实现中，包含了不同场地之间数据表的复制、传递、连接等，所用到的一些函数（如：远程创建数据表、表与表间的远程连接、合并等）都放在dll中，可以方便地调用。&lt;br /&gt;&lt;br /&gt;　　4 结束语&lt;br /&gt;&lt;br /&gt;　　利用C#的.Net Remoting技术能够方便地解决各场地间数据的通信问题。另外，C#通过ADO.Net访问数据库，使得对数据库的操作及管理变得更加高效、可靠。这两种技术的使用，有效地解决了开发分布式数据库系统的主要问题，大大减轻了系统开发工作量，并且提高了系统的可靠性和安全性。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-5990046207139106504?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/5990046207139106504/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=5990046207139106504' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/5990046207139106504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/5990046207139106504'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_7754.html' title='运用C#完成分布式数据库查询'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-4512040724660064966</id><published>2008-10-21T05:00:00.001-07:00</published><updated>2008-10-21T05:00:24.692-07:00</updated><title type='text'>利用c#来获取汉字首字母</title><content type='html'>public static string CVT(string str)&lt;br /&gt;  {&lt;br /&gt;   if (str.CompareTo("吖") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    string s=str.Substring(0,1).ToUpper();&lt;br /&gt;    if (char.IsNumber(s, 0))&lt;br /&gt;    {&lt;br /&gt;     return "0";&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;     return s;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("八") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "A";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("嚓") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "B";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("咑") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "C";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("妸") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "D";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("发") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "E";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("旮") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "F";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("铪") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "G";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("讥") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "H";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("咔") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "J";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("垃") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "K";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("嘸") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "L";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("拏") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "M";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("噢") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "N";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("妑") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "O";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("七") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "P";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("亽") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "Q";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("仨") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "R";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("他") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "S";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("哇") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "T";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("夕") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "W";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("丫") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "X";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("帀") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "Y";&lt;br /&gt;   }&lt;br /&gt;   else if (str.CompareTo("咗") &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    return "Z";&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    return "0";&lt;br /&gt;   }&lt;br /&gt;          &lt;br /&gt;  }&lt;br /&gt; }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-4512040724660064966?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/4512040724660064966/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=4512040724660064966' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4512040724660064966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4512040724660064966'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_5595.html' title='利用c#来获取汉字首字母'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-128193086076058524</id><published>2008-10-21T04:59:00.003-07:00</published><updated>2008-10-21T05:00:03.203-07:00</updated><title type='text'>C#加密方法汇总</title><content type='html'>方法一：&lt;br /&gt;&lt;br /&gt;//须添加对System.Web的引用 &lt;br /&gt;using System.Web.Security;  &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;/// SHA1加密字符串 &lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;/// &lt;param name="source"&gt;源字符串&lt;/param&gt; &lt;br /&gt;/// &lt;returns&gt;加密后的字符串&lt;/returns&gt; &lt;br /&gt;public string SHA1(string source) &lt;br /&gt;{ &lt;br /&gt;    return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "SHA1"); &lt;br /&gt;} &lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;/// MD5加密字符串 &lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;/// &lt;param name="source"&gt;源字符串&lt;/param&gt; &lt;br /&gt;/// &lt;returns&gt;加密后的字符串&lt;/returns&gt; &lt;br /&gt;public string MD5(string source) &lt;br /&gt;{ &lt;br /&gt;    return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5");; &lt;br /&gt;} &lt;br /&gt;//须添加对System.Web的引用&lt;br /&gt;using System.Web.Security;&lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// SHA1加密字符串&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name="source"&gt;源字符串&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;加密后的字符串&lt;/returns&gt;&lt;br /&gt;public string SHA1(string source)&lt;br /&gt;{&lt;br /&gt;    return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "SHA1");&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// MD5加密字符串&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name="source"&gt;源字符串&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;加密后的字符串&lt;/returns&gt;&lt;br /&gt;public string MD5(string source)&lt;br /&gt;{&lt;br /&gt;    return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5");;&lt;br /&gt;}&lt;br /&gt;方法二(可逆加密解密)：&lt;br /&gt;&lt;br /&gt;using System.Security.Cryptography; &lt;br /&gt;&lt;br /&gt;public string Encode(string data) &lt;br /&gt;{ &lt;br /&gt;    byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64); &lt;br /&gt;    byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64); &lt;br /&gt;&lt;br /&gt;    DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); &lt;br /&gt;    int i = cryptoProvider.KeySize; &lt;br /&gt;    MemoryStream ms = new MemoryStream(); &lt;br /&gt;    CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write); &lt;br /&gt;&lt;br /&gt;    StreamWriter sw = new StreamWriter(cst); &lt;br /&gt;    sw.Write(data); &lt;br /&gt;    sw.Flush(); &lt;br /&gt;    cst.FlushFinalBlock(); &lt;br /&gt;    sw.Flush(); &lt;br /&gt;    return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;public string Decode(string data) &lt;br /&gt;{ &lt;br /&gt;    byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64); &lt;br /&gt;    byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64); &lt;br /&gt;&lt;br /&gt;    byte[] byEnc; &lt;br /&gt;    try &lt;br /&gt;    { &lt;br /&gt;        byEnc = Convert.FromBase64String(data); &lt;br /&gt;    } &lt;br /&gt;    catch &lt;br /&gt;    { &lt;br /&gt;        return null; &lt;br /&gt;    } &lt;br /&gt;&lt;br /&gt;    DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); &lt;br /&gt;    MemoryStream ms = new MemoryStream(byEnc); &lt;br /&gt;    CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read); &lt;br /&gt;    StreamReader sr = new StreamReader(cst); &lt;br /&gt;    return sr.ReadToEnd(); &lt;br /&gt;} &lt;br /&gt;using System.Security.Cryptography;&lt;br /&gt;&lt;br /&gt;public string Encode(string data)&lt;br /&gt;{&lt;br /&gt;    byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);&lt;br /&gt;    byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);&lt;br /&gt;&lt;br /&gt;    DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();&lt;br /&gt;    int i = cryptoProvider.KeySize;&lt;br /&gt;    MemoryStream ms = new MemoryStream();&lt;br /&gt;    CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);&lt;br /&gt;&lt;br /&gt;    StreamWriter sw = new StreamWriter(cst);&lt;br /&gt;    sw.Write(data);&lt;br /&gt;    sw.Flush();&lt;br /&gt;    cst.FlushFinalBlock();&lt;br /&gt;    sw.Flush();&lt;br /&gt;    return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public string Decode(string data)&lt;br /&gt;{&lt;br /&gt;    byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);&lt;br /&gt;    byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);&lt;br /&gt;&lt;br /&gt;    byte[] byEnc;&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        byEnc = Convert.FromBase64String(data);&lt;br /&gt;    }&lt;br /&gt;    catch&lt;br /&gt;    {&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();&lt;br /&gt;    MemoryStream ms = new MemoryStream(byEnc);&lt;br /&gt;    CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);&lt;br /&gt;    StreamReader sr = new StreamReader(cst);&lt;br /&gt;    return sr.ReadToEnd();&lt;br /&gt;}&lt;br /&gt;方法三(MD5不可逆)：&lt;br /&gt;&lt;br /&gt;using System.Security.Cryptography; &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;//MD5不可逆加密 &lt;br /&gt;&lt;br /&gt;//32位加密 &lt;br /&gt;&lt;br /&gt;public string GetMD5_32(string s, string _input_charset) &lt;br /&gt;{ &lt;br /&gt;    MD5 md5 = new MD5CryptoServiceProvider(); &lt;br /&gt;    byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s)); &lt;br /&gt;    StringBuilder sb = new StringBuilder(32); &lt;br /&gt;    for (int i = 0; i &lt; t.Length; i++) &lt;br /&gt;    { &lt;br /&gt;        sb.Append(t[i].ToString("x").PadLeft(2, '0')); &lt;br /&gt;    } &lt;br /&gt;    return sb.ToString(); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;//16位加密 &lt;br /&gt;public static string GetMd5_16(string ConvertString) &lt;br /&gt;{ &lt;br /&gt;    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); &lt;br /&gt;    string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 4, 8); &lt;br /&gt;    t2 = t2.Replace("-", ""); &lt;br /&gt;    return t2; &lt;br /&gt;} &lt;br /&gt;using System.Security.Cryptography;&lt;br /&gt;&lt;br /&gt;//MD5不可逆加密&lt;br /&gt;&lt;br /&gt;//32位加密&lt;br /&gt;&lt;br /&gt;public string GetMD5_32(string s, string _input_charset)&lt;br /&gt;{&lt;br /&gt;    MD5 md5 = new MD5CryptoServiceProvider();&lt;br /&gt;    byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s));&lt;br /&gt;    StringBuilder sb = new StringBuilder(32);&lt;br /&gt;    for (int i = 0; i &lt; t.Length; i++)&lt;br /&gt;    {&lt;br /&gt;        sb.Append(t[i].ToString("x").PadLeft(2, '0'));&lt;br /&gt;    }&lt;br /&gt;    return sb.ToString();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//16位加密&lt;br /&gt;public static string GetMd5_16(string ConvertString)&lt;br /&gt;{&lt;br /&gt;    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();&lt;br /&gt;    string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 4, 8);&lt;br /&gt;    t2 = t2.Replace("-", "");&lt;br /&gt;    return t2;&lt;br /&gt;}&lt;br /&gt;方法四(对称加密)：&lt;br /&gt;&lt;br /&gt;using System.IO; &lt;br /&gt;using System.Security.Cryptography;  &lt;br /&gt;&lt;br /&gt;private SymmetricAlgorithm mobjCryptoService; &lt;br /&gt;private string Key; &lt;br /&gt;/// &lt;summary&gt;    &lt;br /&gt;/// 对称加密类的构造函数    &lt;br /&gt;/// &lt;/summary&gt;    &lt;br /&gt;public SymmetricMethod() &lt;br /&gt;{ &lt;br /&gt;    mobjCryptoService = new RijndaelManaged(); &lt;br /&gt;    Key = "Guz(%&amp;hj7x89H$yuBI0456FtmaT5&amp;fvHUFCy76*h%(HilJ$lhj!y6&amp;(*jkP87jH7"; &lt;br /&gt;} &lt;br /&gt;/// &lt;summary&gt;    &lt;br /&gt;/// 获得密钥    &lt;br /&gt;/// &lt;/summary&gt;    &lt;br /&gt;/// &lt;returns&gt;密钥&lt;/returns&gt;    &lt;br /&gt;private byte[] GetLegalKey() &lt;br /&gt;{ &lt;br /&gt;    string sTemp = Key; &lt;br /&gt;    mobjCryptoService.GenerateKey(); &lt;br /&gt;    byte[] bytTemp = mobjCryptoService.Key; &lt;br /&gt;    int KeyLength = bytTemp.Length; &lt;br /&gt;    if (sTemp.Length &gt; KeyLength) &lt;br /&gt;        sTemp = sTemp.Substring(0, KeyLength); &lt;br /&gt;    else if (sTemp.Length &lt; KeyLength) &lt;br /&gt;        sTemp = sTemp.PadRight(KeyLength, ' '); &lt;br /&gt;    return ASCIIEncoding.ASCII.GetBytes(sTemp); &lt;br /&gt;} &lt;br /&gt;/// &lt;summary&gt;    &lt;br /&gt;/// 获得初始向量IV    &lt;br /&gt;/// &lt;/summary&gt;    &lt;br /&gt;/// &lt;returns&gt;初试向量IV&lt;/returns&gt;    &lt;br /&gt;private byte[] GetLegalIV() &lt;br /&gt;{ &lt;br /&gt;    string sTemp = "E4ghj*Ghg7!rNIfb&amp;95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&amp;!hg4ui%$hjk"; &lt;br /&gt;    mobjCryptoService.GenerateIV(); &lt;br /&gt;    byte[] bytTemp = mobjCryptoService.IV; &lt;br /&gt;    int IVLength = bytTemp.Length; &lt;br /&gt;    if (sTemp.Length &gt; IVLength) &lt;br /&gt;        sTemp = sTemp.Substring(0, IVLength); &lt;br /&gt;    else if (sTemp.Length &lt; IVLength) &lt;br /&gt;        sTemp = sTemp.PadRight(IVLength, ' '); &lt;br /&gt;    return ASCIIEncoding.ASCII.GetBytes(sTemp); &lt;br /&gt;} &lt;br /&gt;/// &lt;summary&gt;    &lt;br /&gt;/// 加密方法    &lt;br /&gt;/// &lt;/summary&gt;    &lt;br /&gt;/// &lt;param name="Source"&gt;待加密的串&lt;/param&gt;    &lt;br /&gt;/// &lt;returns&gt;经过加密的串&lt;/returns&gt;    &lt;br /&gt;public string Encrypto(string Source) &lt;br /&gt;{ &lt;br /&gt;    byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source); &lt;br /&gt;    MemoryStream ms = new MemoryStream(); &lt;br /&gt;    mobjCryptoService.Key = GetLegalKey(); &lt;br /&gt;    mobjCryptoService.IV = GetLegalIV(); &lt;br /&gt;    ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor(); &lt;br /&gt;    CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write); &lt;br /&gt;    cs.Write(bytIn, 0, bytIn.Length); &lt;br /&gt;    cs.FlushFinalBlock(); &lt;br /&gt;    ms.Close(); &lt;br /&gt;    byte[] bytOut = ms.ToArray(); &lt;br /&gt;    return Convert.ToBase64String(bytOut); &lt;br /&gt;} &lt;br /&gt;/// &lt;summary&gt;    &lt;br /&gt;/// 解密方法    &lt;br /&gt;/// &lt;/summary&gt;    &lt;br /&gt;/// &lt;param name="Source"&gt;待解密的串&lt;/param&gt;    &lt;br /&gt;/// &lt;returns&gt;经过解密的串&lt;/returns&gt;    &lt;br /&gt;public string Decrypto(string Source) &lt;br /&gt;{ &lt;br /&gt;    byte[] bytIn = Convert.FromBase64String(Source); &lt;br /&gt;    MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length); &lt;br /&gt;    mobjCryptoService.Key = GetLegalKey(); &lt;br /&gt;    mobjCryptoService.IV = GetLegalIV(); &lt;br /&gt;    ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor(); &lt;br /&gt;    CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read); &lt;br /&gt;    StreamReader sr = new StreamReader(cs); &lt;br /&gt;    return sr.ReadToEnd(); &lt;br /&gt;} &lt;br /&gt;using System.IO;&lt;br /&gt;using System.Security.Cryptography;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private SymmetricAlgorithm mobjCryptoService;&lt;br /&gt;private string Key;&lt;br /&gt;/// &lt;summary&gt;   &lt;br /&gt;/// 对称加密类的构造函数   &lt;br /&gt;/// &lt;/summary&gt;   &lt;br /&gt;public SymmetricMethod()&lt;br /&gt;{&lt;br /&gt;    mobjCryptoService = new RijndaelManaged();&lt;br /&gt;    Key = "Guz(%&amp;hj7x89H$yuBI0456FtmaT5&amp;fvHUFCy76*h%(HilJ$lhj!y6&amp;(*jkP87jH7";&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;   &lt;br /&gt;/// 获得密钥   &lt;br /&gt;/// &lt;/summary&gt;   &lt;br /&gt;/// &lt;returns&gt;密钥&lt;/returns&gt;   &lt;br /&gt;private byte[] GetLegalKey()&lt;br /&gt;{&lt;br /&gt;    string sTemp = Key;&lt;br /&gt;    mobjCryptoService.GenerateKey();&lt;br /&gt;    byte[] bytTemp = mobjCryptoService.Key;&lt;br /&gt;    int KeyLength = bytTemp.Length;&lt;br /&gt;    if (sTemp.Length &gt; KeyLength)&lt;br /&gt;        sTemp = sTemp.Substring(0, KeyLength);&lt;br /&gt;    else if (sTemp.Length &lt; KeyLength)&lt;br /&gt;        sTemp = sTemp.PadRight(KeyLength, ' ');&lt;br /&gt;    return ASCIIEncoding.ASCII.GetBytes(sTemp);&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;   &lt;br /&gt;/// 获得初始向量IV   &lt;br /&gt;/// &lt;/summary&gt;   &lt;br /&gt;/// &lt;returns&gt;初试向量IV&lt;/returns&gt;   &lt;br /&gt;private byte[] GetLegalIV()&lt;br /&gt;{&lt;br /&gt;    string sTemp = "E4ghj*Ghg7!rNIfb&amp;95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&amp;!hg4ui%$hjk";&lt;br /&gt;    mobjCryptoService.GenerateIV();&lt;br /&gt;    byte[] bytTemp = mobjCryptoService.IV;&lt;br /&gt;    int IVLength = bytTemp.Length;&lt;br /&gt;    if (sTemp.Length &gt; IVLength)&lt;br /&gt;        sTemp = sTemp.Substring(0, IVLength);&lt;br /&gt;    else if (sTemp.Length &lt; IVLength)&lt;br /&gt;        sTemp = sTemp.PadRight(IVLength, ' ');&lt;br /&gt;    return ASCIIEncoding.ASCII.GetBytes(sTemp);&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;   &lt;br /&gt;/// 加密方法   &lt;br /&gt;/// &lt;/summary&gt;   &lt;br /&gt;/// &lt;param name="Source"&gt;待加密的串&lt;/param&gt;   &lt;br /&gt;/// &lt;returns&gt;经过加密的串&lt;/returns&gt;   &lt;br /&gt;public string Encrypto(string Source)&lt;br /&gt;{&lt;br /&gt;    byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);&lt;br /&gt;    MemoryStream ms = new MemoryStream();&lt;br /&gt;    mobjCryptoService.Key = GetLegalKey();&lt;br /&gt;    mobjCryptoService.IV = GetLegalIV();&lt;br /&gt;    ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();&lt;br /&gt;    CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);&lt;br /&gt;    cs.Write(bytIn, 0, bytIn.Length);&lt;br /&gt;    cs.FlushFinalBlock();&lt;br /&gt;    ms.Close();&lt;br /&gt;    byte[] bytOut = ms.ToArray();&lt;br /&gt;    return Convert.ToBase64String(bytOut);&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;   &lt;br /&gt;/// 解密方法   &lt;br /&gt;/// &lt;/summary&gt;   &lt;br /&gt;/// &lt;param name="Source"&gt;待解密的串&lt;/param&gt;   &lt;br /&gt;/// &lt;returns&gt;经过解密的串&lt;/returns&gt;   &lt;br /&gt;public string Decrypto(string Source)&lt;br /&gt;{&lt;br /&gt;    byte[] bytIn = Convert.FromBase64String(Source);&lt;br /&gt;    MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);&lt;br /&gt;    mobjCryptoService.Key = GetLegalKey();&lt;br /&gt;    mobjCryptoService.IV = GetLegalIV();&lt;br /&gt;    ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();&lt;br /&gt;    CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);&lt;br /&gt;    StreamReader sr = new StreamReader(cs);&lt;br /&gt;    return sr.ReadToEnd();&lt;br /&gt;}&lt;br /&gt;方法五：&lt;br /&gt;&lt;br /&gt;using System.IO; &lt;br /&gt;using System.Security.Cryptography; &lt;br /&gt;using System.Text; &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;//默认密钥向量 &lt;br /&gt;private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; &lt;br /&gt;/**//**//**//// &lt;summary&gt; &lt;br /&gt;/// DES加密字符串 &lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;/// &lt;param name="encryptString"&gt;待加密的字符串&lt;/param&gt; &lt;br /&gt;/// &lt;param name="encryptKey"&gt;加密密钥,要求为8位&lt;/param&gt; &lt;br /&gt;/// &lt;returns&gt;加密成功返回加密后的字符串，失败返回源串&lt;/returns&gt; &lt;br /&gt;public static string EncryptDES(string encryptString, string encryptKey) &lt;br /&gt;{ &lt;br /&gt;    try &lt;br /&gt;    { &lt;br /&gt;        byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8)); &lt;br /&gt;        byte[] rgbIV = Keys; &lt;br /&gt;        byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString); &lt;br /&gt;        DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider(); &lt;br /&gt;        MemoryStream mStream = new MemoryStream(); &lt;br /&gt;        CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); &lt;br /&gt;        cStream.Write(inputByteArray, 0, inputByteArray.Length); &lt;br /&gt;        cStream.FlushFinalBlock(); &lt;br /&gt;        return Convert.ToBase64String(mStream.ToArray()); &lt;br /&gt;    } &lt;br /&gt;    catch &lt;br /&gt;    { &lt;br /&gt;        return encryptString; &lt;br /&gt;    } &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;/**//**//**//// &lt;summary&gt; &lt;br /&gt;/// DES解密字符串 &lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;/// &lt;param name="decryptString"&gt;待解密的字符串&lt;/param&gt; &lt;br /&gt;/// &lt;param name="decryptKey"&gt;解密密钥,要求为8位,和加密密钥相同&lt;/param&gt; &lt;br /&gt;/// &lt;returns&gt;解密成功返回解密后的字符串，失败返源串&lt;/returns&gt; &lt;br /&gt;public static string DecryptDES(string decryptString, string decryptKey) &lt;br /&gt;{ &lt;br /&gt;    try &lt;br /&gt;    { &lt;br /&gt;        byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey); &lt;br /&gt;        byte[] rgbIV = Keys; &lt;br /&gt;        byte[] inputByteArray = Convert.FromBase64String(decryptString); &lt;br /&gt;        DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider(); &lt;br /&gt;        MemoryStream mStream = new MemoryStream(); &lt;br /&gt;        CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write); &lt;br /&gt;        cStream.Write(inputByteArray, 0, inputByteArray.Length); &lt;br /&gt;        cStream.FlushFinalBlock(); &lt;br /&gt;        return Encoding.UTF8.GetString(mStream.ToArray()); &lt;br /&gt;    } &lt;br /&gt;    catch &lt;br /&gt;    { &lt;br /&gt;        return decryptString; &lt;br /&gt;    } &lt;br /&gt;}  &lt;br /&gt;using System.IO;&lt;br /&gt;using System.Security.Cryptography;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//默认密钥向量&lt;br /&gt;private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };&lt;br /&gt;/**//**//**//// &lt;summary&gt;&lt;br /&gt;/// DES加密字符串&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name="encryptString"&gt;待加密的字符串&lt;/param&gt;&lt;br /&gt;/// &lt;param name="encryptKey"&gt;加密密钥,要求为8位&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;加密成功返回加密后的字符串，失败返回源串&lt;/returns&gt;&lt;br /&gt;public static string EncryptDES(string encryptString, string encryptKey)&lt;br /&gt;{&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));&lt;br /&gt;        byte[] rgbIV = Keys;&lt;br /&gt;        byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);&lt;br /&gt;        DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();&lt;br /&gt;        MemoryStream mStream = new MemoryStream();&lt;br /&gt;        CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);&lt;br /&gt;        cStream.Write(inputByteArray, 0, inputByteArray.Length);&lt;br /&gt;        cStream.FlushFinalBlock();&lt;br /&gt;        return Convert.ToBase64String(mStream.ToArray());&lt;br /&gt;    }&lt;br /&gt;    catch&lt;br /&gt;    {&lt;br /&gt;        return encryptString;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**//**//**//// &lt;summary&gt;&lt;br /&gt;/// DES解密字符串&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name="decryptString"&gt;待解密的字符串&lt;/param&gt;&lt;br /&gt;/// &lt;param name="decryptKey"&gt;解密密钥,要求为8位,和加密密钥相同&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;解密成功返回解密后的字符串，失败返源串&lt;/returns&gt;&lt;br /&gt;public static string DecryptDES(string decryptString, string decryptKey)&lt;br /&gt;{&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);&lt;br /&gt;        byte[] rgbIV = Keys;&lt;br /&gt;        byte[] inputByteArray = Convert.FromBase64String(decryptString);&lt;br /&gt;        DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();&lt;br /&gt;        MemoryStream mStream = new MemoryStream();&lt;br /&gt;        CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);&lt;br /&gt;        cStream.Write(inputByteArray, 0, inputByteArray.Length);&lt;br /&gt;        cStream.FlushFinalBlock();&lt;br /&gt;        return Encoding.UTF8.GetString(mStream.ToArray());&lt;br /&gt;    }&lt;br /&gt;    catch&lt;br /&gt;    {&lt;br /&gt;        return decryptString;&lt;br /&gt;    }&lt;br /&gt;} &lt;br /&gt;方法六(文件加密)：&lt;br /&gt;&lt;br /&gt;using System.IO; &lt;br /&gt;using System.Security.Cryptography; &lt;br /&gt;using System.Text; &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;//加密文件 &lt;br /&gt;private static void EncryptData(String inName, String outName, byte[] desKey, byte[] desIV) &lt;br /&gt;{ &lt;br /&gt;    //Create the file streams to handle the input and output files. &lt;br /&gt;    FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read); &lt;br /&gt;    FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write); &lt;br /&gt;    fout.SetLength(0); &lt;br /&gt;&lt;br /&gt;    //Create variables to help with read and write. &lt;br /&gt;    byte[] bin = new byte[100]; //This is intermediate storage for the encryption. &lt;br /&gt;    long rdlen = 0;              //This is the total number of bytes written. &lt;br /&gt;    long totlen = fin.Length;    //This is the total length of the input file. &lt;br /&gt;    int len;                     //This is the number of bytes to be written at a time. &lt;br /&gt;&lt;br /&gt;    DES des = new DESCryptoServiceProvider(); &lt;br /&gt;    CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write); &lt;br /&gt;&lt;br /&gt;    //Read from the input file, then encrypt and write to the output file. &lt;br /&gt;    while (rdlen &lt; totlen) &lt;br /&gt;    { &lt;br /&gt;        len = fin.Read(bin, 0, 100); &lt;br /&gt;        encStream.Write(bin, 0, len); &lt;br /&gt;        rdlen = rdlen + len; &lt;br /&gt;    } &lt;br /&gt;&lt;br /&gt;    encStream.Close(); &lt;br /&gt;    fout.Close(); &lt;br /&gt;    fin.Close(); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;//解密文件 &lt;br /&gt;private static void DecryptData(String inName, String outName, byte[] desKey, byte[] desIV) &lt;br /&gt;{ &lt;br /&gt;    //Create the file streams to handle the input and output files. &lt;br /&gt;    FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read); &lt;br /&gt;    FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write); &lt;br /&gt;    fout.SetLength(0); &lt;br /&gt;&lt;br /&gt;    //Create variables to help with read and write. &lt;br /&gt;    byte[] bin = new byte[100]; //This is intermediate storage for the encryption. &lt;br /&gt;    long rdlen = 0;              //This is the total number of bytes written. &lt;br /&gt;    long totlen = fin.Length;    //This is the total length of the input file. &lt;br /&gt;    int len;                     //This is the number of bytes to be written at a time. &lt;br /&gt;&lt;br /&gt;    DES des = new DESCryptoServiceProvider(); &lt;br /&gt;    CryptoStream encStream = new CryptoStream(fout, des.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write); &lt;br /&gt;&lt;br /&gt;    //Read from the input file, then encrypt and write to the output file. &lt;br /&gt;    while (rdlen &lt; totlen) &lt;br /&gt;    { &lt;br /&gt;        len = fin.Read(bin, 0, 100); &lt;br /&gt;        encStream.Write(bin, 0, len); &lt;br /&gt;        rdlen = rdlen + len; &lt;br /&gt;    } &lt;br /&gt;&lt;br /&gt;    encStream.Close(); &lt;br /&gt;    fout.Close(); &lt;br /&gt;    fin.Close(); &lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-128193086076058524?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/128193086076058524/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=128193086076058524' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/128193086076058524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/128193086076058524'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_1221.html' title='C#加密方法汇总'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-3997671901868582643</id><published>2008-10-21T04:59:00.001-07:00</published><updated>2008-10-21T04:59:30.316-07:00</updated><title type='text'>VS2005 C# 本地和远程连接Sql2000、Access、Oracle数据库说明</title><content type='html'>1.Access&lt;br /&gt;(1)本地连接&lt;br /&gt;string source = @" Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = D:c#connDBschool.mdb";&lt;br /&gt;(2)远程链接（以下5种方法）:&lt;br /&gt;１)建立VPN(Virtual Private Network)，然后把服务器中mdb文件所在的 Folder 共享即可。&lt;br /&gt;        ADO连接方法如下：&lt;br /&gt;string source = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=服务器名文件夹 mydata.mdb;JetOLEDB:Database Password=datapass;Persist Security Info=False";&lt;br /&gt;２)把数据库放在Web 服务器上，使ADO或RDO通过RDS（Remote Data Service） 及IIS来实现:&lt;br /&gt;    a.如果服务器设置了ODBC DSN的话，连接方法如下：&lt;br /&gt;"Provider=MS Remote;Remote Server=http://服务器名;RemoteProvider=MSDASQL;DSN=AdvWorks;Uid=dataUserName;Pwd=dataPassWord"&lt;br /&gt;    b.如果设置的是OLE DB Provider 的话，连接方法如下：&lt;br /&gt;"Provider=MS Remote;Remote Server=http://服务器名;RemoteProvider=Microsoft.Jet.OLEDB.4.0; Data Source=数据库文件路径,"+ "admin,"+"" (数据库用户名为：admin；密码为空)&lt;br /&gt;３)自己编写服务器程序，通过TCP/IP，传递Recordset.&lt;br /&gt;４)使用第三方控件，如：ADO Anywhere或UDAParts RDB等.&lt;br /&gt;５)使用XMLHTTP&lt;br /&gt;&lt;br /&gt;示例代码：&lt;br /&gt;OledbConnection myconn = null;&lt;br /&gt;&lt;br /&gt;myconn =&lt;br /&gt;new OledbConnection("192.168.1.155",&lt;br /&gt; "DSN=mydata;DRIVER={Microsoft Access Driver (*.mdb)};UID=test;PWD=test;"); //其中服务器IP是 192.168.1.155 ;数据库名是 mydata ;数据库用户名这密码都是test&lt;br /&gt;&lt;br /&gt;myconn.Open();&lt;br /&gt;2.Sql server2000&lt;br /&gt;(1)本地连接&lt;br /&gt;// 下面是本地连接sql2000，采用下面两种连接字符串&lt;br /&gt;&lt;br /&gt;    string source = @" server = .kingsql;database = Northwind ; integrated security=SSPI ";&lt;br /&gt;&lt;br /&gt;    string source = @" server = .kingsql;database = Northwind ; uid = sa; pwd = sa ";&lt;br /&gt;(2)远程连接&lt;br /&gt;首先要保证客户端与SQL服务器连接。&lt;br /&gt;具体如下说明：&lt;br /&gt;1）ping 服务器IP测试连通与否&lt;br /&gt;           这个实际上是看和远程sql server 2000服务器的物理连接是否存在。如果不行，请检查网络，查 看配置，当然得确保远程sql server 2000服务器的IP拼写正确。&lt;br /&gt;&lt;br /&gt;2) 在Dos或命令行下输入telnet 服务器IP 端口，看能否连通&lt;br /&gt;          如: telnet 202.114.100.100 1433&lt;br /&gt;           通常端口值是1433，因为1433是sql server 2000的对于Tcp/IP的默认侦听端口。如果有问题，通常这一步会出问题。通常的提示是“……无法打开连接,连接 失败"。&lt;br /&gt;           如果这一步有问题，应该检查以下选项。&lt;br /&gt;           1 检查远程服务器是否启动了sql server 2000服务。如果没有，则启动。&lt;br /&gt;           2 检查服务器端有没启用Tcp/IP协议，因为远程连接（通过因特网）需要靠这个协检查方法是，在服务器上打开开始菜单-&gt;程序-&gt; Microsoft SQL Server-&gt;服务器网络实用工具，看启用的协议里是否有tcp/ip协议，如果没有，则启用它。&lt;br /&gt;           3 检查服务器的tcp/ip端口是否配置为1433端口。仍然在服务器网络实用工具里查看启用协议里面的tcp/ip的属性，确保默认端口为1433，并且隐藏服务器复选框 没有勾上。&lt;br /&gt;            事实上，如果默认端口被修改，也是可以的，但是在客户端做telnet测试时，写服务器端口号时必须与服务器配置的端口号保持一致。如果隐藏服务器复选框被勾      选，则意味着客户端无法通过枚举服务器来看到这台服务器，起到了保护的作用，但不影响连接，但是Tcp/ip协议的默认端口将被隐式修改为2433，在客户端连接     时必须作相应的改变。&lt;br /&gt;           4 如果服务器端操作系统打过sp2补丁，则要对windows防火墙作一定的配置，要对它开放1433端口，通常在测试时可以直接关掉windows防火墙（其他的防火墙也 关掉最好）。&lt;br /&gt;          5 检查服务器是否在1433端口侦听。如果服务器没有在tcp连接的1433端口侦听，则是连接不上的。检查方法是在服务器的dos或命令行下面输入netstat -a -n 或者是netstat -an，在结果列表里看是否有类似tcp 127.0.0.1  1433 listening的项。如果没有，则通常需要给sql server 2000打上至少sp3的补丁。其实在服务器端启动查询分析器，输入 select @@version 执行后可以看到版本号，版本号在8.0.2039以下的都需要打补丁。如果以上都没问题，这时你再做telnet 服务器ip 1433 测试，将会看到屏幕一 闪之后光标在左上角不停闪动。恭喜你，你马上可以开始在企业管理器或查询分析 器连接了。&lt;br /&gt;&lt;br /&gt;3)检查客户端设置&lt;br /&gt;         程序-&gt;Microsoft SQL Server -&gt; 客户端网络使用工具。像在服务器网络实用工具里一样，确保客 户端tcp/ip协议启用，并且默认端口为1433（或其他端口，与服务器端保持一致就行）。&lt;br /&gt;&lt;br /&gt;4)在企业管理器里或查询那分析器连接测试&lt;br /&gt;        企业管理器-&gt;右键SQlserver组-&gt;新建sqlserver注册-&gt;下一步-&gt;写入远程IP-&gt;     下一步-&gt;选Sqlserver登陆-&gt;下一步-&gt;写入登陆名与密码（sa,password）-&gt;下一步-&gt;下一步-&gt;完成查询分析器-&gt;文件-&gt;连接-&gt;写入远程IP-&gt;写入登录名和密码（sa,password）-&gt;确定通常建议在查询分析器里做，因为默认情况下，通过企业管理器注册另外一台SQL Server的超时设置是4秒，而查询分析器是15秒。&lt;br /&gt;       修改默认连接超时的方法：&lt;br /&gt;       企业管理器-&gt;工具-&gt;选项-&gt;在弹出的"SQL Server企业管理器属性"窗口中，点击"高级"选项卡-&gt;连接设置-&gt;在登录超时（秒）后面的框里输入一个较大的数字查询分析器-&gt;工具-&gt;选项-&gt;连接-&gt;在登录超时（秒）后面的框里输入一个较大的数字通常就可以连通了，如果提示错误，则进入下一步。&lt;br /&gt;&lt;br /&gt;5）错误产生的原因通常是由于SQL Server使用了"仅 Windows"的身份验证方式，因 此用户无法使 用SQL Server的登录帐户（如 sa ）进行连接。解决方法如下所示：&lt;br /&gt;　   1 在服务器端使用企业管理器，并且选择"使用 Windows 身份验证"连接上 SQL             Server。&lt;br /&gt;　   2 展开"SQL Server组"，鼠标右键点击SQL Server服务器的名称，选择"属性"，再选择"安全性"选项卡。&lt;br /&gt;　   3 在"身份验证"下，选择"SQL Server和 Windows "。&lt;br /&gt;　   4 重新启动SQL Server服务。（在dos或命令行下面net stop mssqlserver停止服务, net start mssqlserver启动服务，也是一种快捷的方法）。&lt;br /&gt;&lt;br /&gt;          附注：在连接本地服务器时，通常使用的是命名管道协议（在服务器网络实用工具里可以看到启用的协议有这个），默认端口是445，因此在本地能连通是不能说明什么问题的，连接远程服务器是完全不同的协议）&lt;br /&gt;&lt;br /&gt;3.Oracle&lt;br /&gt;(1)ODBC（要求：Oracle Client 7.3以上版本）&lt;br /&gt;"Driver={Microsoft ODBC for Oracle};Server=myServerAddress;Uid=myUsername;Pwd=myPassword;"&lt;br /&gt;(2)OLEDB（要求：Oracle Client 8i以上版本）&lt;br /&gt;"Provider=msdaora;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;"&lt;br /&gt;(3)System.Data.OracleClient（要求:MDAC 2.6Oracle Client 8i Release 3 (8.1.7) 以上版本)&lt;br /&gt;"Provider=msdaora;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;"&lt;br /&gt;(4)ODP.NET（要求：Oracle Client 9i以上版本）&lt;br /&gt;"Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;Integrated Security=no;"&lt;br /&gt;(5)OraDirect .net （要求：不需要安装Oracle客户端必须购买许可证）&lt;br /&gt;"User ID=myUsername;Password=myPassword;Host=ora;Pooling=true;Min Pool Size=0;&lt;br /&gt;     Max Pool Size=100;Connection Lifetime=0;"&lt;br /&gt;以下详看：&lt;br /&gt;Oracle Data Provider for .NET FAQ&lt;br /&gt;Remark:http://www.oracle.com/technology/tech/windows/odpnet/faq.html#install&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-3997671901868582643?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/3997671901868582643/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=3997671901868582643' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/3997671901868582643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/3997671901868582643'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/vs2005-c-sql2000accessoracle.html' title='VS2005 C# 本地和远程连接Sql2000、Access、Oracle数据库说明'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-5740321055429290208</id><published>2008-10-21T04:58:00.000-07:00</published><updated>2008-10-21T04:59:02.442-07:00</updated><title type='text'>C# 利用WinRAR (加密)压缩及解压缩</title><content type='html'>本次示例主要实现：&lt;br /&gt;1.压缩文件夹及其下文件&lt;br /&gt;2.压缩文件夹下文件&lt;br /&gt;3.压缩文件夹及其下文件为rar 还是 zip&lt;br /&gt;4.解压缩&lt;br /&gt;5.加密压缩及解加密压缩&lt;br /&gt;-----------&lt;br /&gt;示例代码如下：&lt;br /&gt;protected void Button1_Click(object sender, EventArgs e)&lt;br /&gt; {&lt;br /&gt;        string strtxtPath = "C:\\freezip\\free.txt";&lt;br /&gt;        string strzipPath = "C:\\freezip\\free.zip";&lt;br /&gt;        System.Diagnostics.Process Process1 = new System.Diagnostics.Process();&lt;br /&gt;        Process1.StartInfo.FileName = "Winrar.exe";&lt;br /&gt;        Process1.StartInfo.CreateNoWindow = true;&lt;br /&gt;&lt;br /&gt;        //// 1&lt;br /&gt;        ////压缩c:\freezip\free.txt(即文件夹及其下文件freezip\free.txt)&lt;br /&gt;        ////到c:\freezip\free.rar&lt;br /&gt;        //strzipPath = "C:\\freezip\\free";//默认压缩方式为 .rar&lt;br /&gt;        //Process1.StartInfo.Arguments = " a -r " + strzipPath + " " + strtxtPath;&lt;br /&gt;&lt;br /&gt;        //// 2&lt;br /&gt;        ////压缩c:\freezip\free.txt(即文件夹及其下文件freezip\free.txt)&lt;br /&gt;        ////到c:\freezip\free.rar&lt;br /&gt;        //strzipPath = "C:\\freezip\\free";//设置压缩方式为 .zip&lt;br /&gt;        //Process1.StartInfo.Arguments = " a -afzip " + strzipPath + " " + strtxtPath;&lt;br /&gt;&lt;br /&gt;        //// 3&lt;br /&gt;        ////压缩c:\freezip\free.txt(即文件夹及其下文件freezip\free.txt)&lt;br /&gt;        ////到c:\freezip\free.zip  直接设定为free.zip&lt;br /&gt;        //Process1.StartInfo.Arguments = " a -r "+strzipPath+" " + strtxtPath ;&lt;br /&gt;&lt;br /&gt;        //// 4&lt;br /&gt;        ////搬迁压缩c:\freezip\free.txt(即文件夹及其下文件freezip\free.txt)&lt;br /&gt;        ////到c:\freezip\free.rar 压缩后 原文件将不存在&lt;br /&gt;        //Process1.StartInfo.Arguments = " m " + strzipPath + " " + strtxtPath;&lt;br /&gt;&lt;br /&gt;        //// 5&lt;br /&gt;        ////压缩c:\freezip\下的free.txt(即文件free.txt)&lt;br /&gt;        ////到c:\freezip\free.zip  直接设定为free.zip 只有文件 而没有文件夹&lt;br /&gt;        //Process1.StartInfo.Arguments = " a -ep " + strzipPath + " " + strtxtPath;&lt;br /&gt;&lt;br /&gt;        //// 6&lt;br /&gt;        ////解压缩c:\freezip\free.rar&lt;br /&gt;        ////到 c:\freezip\&lt;br /&gt;        //strtxtPath = "c:\\freezip\\";&lt;br /&gt;        //Process1.StartInfo.Arguments = " x " + strzipPath + " " + strtxtPath;&lt;br /&gt;&lt;br /&gt;        //// 7&lt;br /&gt;        ////加密压缩c:\freezip\free.txt(即文件夹及其下文件freezip\free.txt)&lt;br /&gt;        ////到c:\freezip\free.zip  密码为123456 注意参数间不要空格&lt;br /&gt;        //Process1.StartInfo.Arguments = " a -p123456 " + strzipPath + " " + strtxtPath;&lt;br /&gt;&lt;br /&gt;        //// 8&lt;br /&gt;        ////解压缩加密的c:\freezip\free.rar&lt;br /&gt;        ////到 c:\freezip\   密码为123456 注意参数间不要空格&lt;br /&gt;        //strtxtPath = "c:\\freezip\\";&lt;br /&gt;        //Process1.StartInfo.Arguments = " x -p123456 " + strzipPath + " " + strtxtPath;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       //// 9 &lt;br /&gt;       ////-o+ 覆盖 已经存在的文件&lt;br /&gt;       //// -o- 不覆盖 已经存在的文件&lt;br /&gt;       //strtxtPath = "c:\\freezip\\";&lt;br /&gt;       //Process1.StartInfo.Arguments = " x -o+ " + strzipPath + " " + strtxtPath;&lt;br /&gt;&lt;br /&gt;       ////10&lt;br /&gt;       //// 只从指定的zip中&lt;br /&gt;       //// 解压出free1.txt&lt;br /&gt;       //// 到指定路径下&lt;br /&gt;       //// 压缩包中的其他文件 不予解压&lt;br /&gt;       //strtxtPath = "c:\\freezip\\";&lt;br /&gt;       //Process1.StartInfo.Arguments = " x " + strzipPath + " " +" free1.txt" + " " + strtxtPath;&lt;br /&gt;&lt;br /&gt;      //// 11&lt;br /&gt;      //// 通过 -y 对所有询问回应为"是" 以便 即便发生错误 也不弹出WINRAR的窗口&lt;br /&gt;      //// -cl 转换文件名为小写字母 &lt;br /&gt;      //strtxtPath = "c:\\freezip\\";&lt;br /&gt;      //Process1.StartInfo.Arguments = " t -y -cl " + strzipPath + " " + " free1.txt";&lt;br /&gt;&lt;br /&gt;        Process1.Start();    &lt;br /&gt;        if (Process1.HasExited)&lt;br /&gt;        {&lt;br /&gt;                int iExitCode = Process1.ExitCode;&lt;br /&gt;                if (iExitCode == 0)&lt;br /&gt;                {&lt;br /&gt;                    Response.Write(iExitCode.ToString() + " 正常完成");&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    Response.Write(iExitCode.ToString() + " 有错完成");&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;更多WinRAR命令(引自WinRAR帮助文档) &lt;br /&gt;&lt;br /&gt;a 添加文件到压缩文件 &lt;br /&gt;&lt;br /&gt;c 添加压缩文件注释 &lt;br /&gt;&lt;br /&gt;d 从压缩文件删除文件 &lt;br /&gt;&lt;br /&gt;e 从压缩文件解压压缩，忽略路径 &lt;br /&gt;&lt;br /&gt;f 刷新压缩文件中的文件 &lt;br /&gt;&lt;br /&gt;i 在压缩文件中查找字符串 &lt;br /&gt;&lt;br /&gt;k 锁定压缩文件 &lt;br /&gt;&lt;br /&gt;m 移动文件和文件夹到压缩文件 &lt;br /&gt;&lt;br /&gt;r 修复受损的压缩文件 &lt;br /&gt;&lt;br /&gt;rc 重建丢失的卷 &lt;br /&gt;&lt;br /&gt;rn 重命名压缩文件 &lt;br /&gt;&lt;br /&gt;rr[N] 添加数据恢复记录 &lt;br /&gt;&lt;br /&gt;rv[N] 创建恢复卷 &lt;br /&gt;&lt;br /&gt;s[name] 转换压缩文件成为自解压文件类型 &lt;br /&gt;&lt;br /&gt;s- 删除自解压模块 &lt;br /&gt;&lt;br /&gt;t 测试压缩文件 &lt;br /&gt;&lt;br /&gt;u 从压缩文件中更新文件 &lt;br /&gt;&lt;br /&gt;x 以完整路径名称从压缩文件解压压缩  &lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;-ac 在压缩或解压后清除存档属性 &lt;br /&gt;       -ad 附加压缩文件名到目标路径中 &lt;br /&gt;       -af&lt;类型&gt; 指定压缩文件格式 &lt;br /&gt;       -ag[格式] 以当前日期生成压缩文件名 &lt;br /&gt;       -ao 添加有存档属性设置的 &lt;br /&gt;       -ap 设置内部压缩文件路径 &lt;br /&gt;       -as 同步化压缩文件内容 &lt;br /&gt;       -av 应用用户身份校验信息 &lt;br /&gt;       -av- 禁用添加用户身份校验信息 &lt;br /&gt;       -cfg- 忽略默认配置和环境变量 &lt;br /&gt;       -cl 将文件名转换成为小写 &lt;br /&gt;       -cu 将文件名转换成为大写 &lt;br /&gt;       -df 压缩后删除压缩文件 &lt;br /&gt;       -dh 打开共享的文件 &lt;br /&gt;       -ds 不排序压缩的文件 &lt;br /&gt;       -ed 不添加空文件夹 &lt;br /&gt;       -en 不添加“压缩文件结束”块 &lt;br /&gt;       -ep 从名称中排除路径 &lt;br /&gt;       -ep1 从名称中排除主文件夹 &lt;br /&gt;       -ep2 扩大成完整路径 &lt;br /&gt;       -ep3 扩展包含盘符的完整路径 &lt;br /&gt;       -e[+]&lt;属性&gt; 设置文件排除和包含属性 &lt;br /&gt;-f 刷新文件 &lt;br /&gt;-hp[密码] 加密文件数据和头 &lt;br /&gt;-ibck 在后台运行 WinRAR &lt;br /&gt;-ieml 使用E-mail发送压缩文件 &lt;br /&gt;-iicon&lt;名称&gt; 指定自解压图标 &lt;br /&gt;-iimg&lt;名称&gt; 指定自解压图片 &lt;br /&gt;-ilog[名称] 记录错误到文件中 &lt;br /&gt;-inul 关闭错误信息 &lt;br /&gt;-ioff 关闭 PC 电源 &lt;br /&gt;-k 锁定压缩文件 &lt;br /&gt;-kb 保留坏掉的解压文件 &lt;br /&gt;-m&lt;n&gt; 设置压缩方式 &lt;br /&gt;-mc&lt;参数&gt; 设置高级压缩参数 &lt;br /&gt;-md&lt;n&gt; 选择字典大小 &lt;br /&gt;-ms 指定文件存储 &lt;br /&gt;-n&lt;文件&gt; 仅包含指定的文件 &lt;br /&gt;-n@&lt;列表文件&gt; 使用指定的列表文件包含文件 &lt;br /&gt;-os 保存 NTFS 数据流 &lt;br /&gt;-oc 设置 NTFS “压缩”属性 &lt;br /&gt;-ow 处理文件用户身份校验信息 &lt;br /&gt;-o+ 覆盖已存在的文件 &lt;br /&gt;-o- 不要覆盖已存在的文件 &lt;br /&gt;-p[密码] 设置密码 &lt;br /&gt;-r 返回子文件夹 &lt;br /&gt;-r0 只返回与通配符匹配的子文件夹 &lt;br /&gt;-ri 设置优先级和休眠时间 &lt;br /&gt;-rr[N] 添加数据恢复记录 &lt;br /&gt;-rv[N] 创建恢复卷 &lt;br /&gt;-s 创建固实压缩文件 &lt;br /&gt;-s&lt;N&gt; 以文件数量创建固实组 &lt;br /&gt;-se 以文件扩展名创建固实组 &lt;br /&gt;-sfx[名称] 创建自解压文件 &lt;br /&gt;-sv 创建互不依赖的固实压缩文件 &lt;br /&gt;-sv- 创建互相依赖的固实压缩文件 &lt;br /&gt;-s- 禁用固实算法 &lt;br /&gt;-t 压缩后测试文件 &lt;br /&gt;-ta&lt;日期&gt; 只处理指定日期之后修改的文件 &lt;br /&gt;-tb&lt;日期&gt; 只处理指定日期之前修改的文件 &lt;br /&gt;-tk 保持原有压缩文件时间 &lt;br /&gt;-tl 以最新的文件设置压缩文件时间 &lt;br /&gt;-tn&lt;时间&gt; 处理较新于指定时间的文件 &lt;br /&gt;-to&lt;时间&gt; 处理较旧于指定时间的文件 &lt;br /&gt;-ts&lt;m,c,a&gt; 保存或恢复文件时间(修改,创建,访问) &lt;br /&gt;-u 更新文件 &lt;br /&gt;-v&lt;n&gt;[k|b|f|m|M|g|G] 创建分卷压缩 &lt;br /&gt;-vd 创建分卷压缩前清除磁盘内容 &lt;br /&gt;-ver 文件版本控制 &lt;br /&gt;-vn 使用旧风格的卷命名法则 &lt;br /&gt;-vp 每次分卷压缩前暂停 &lt;br /&gt;-x&lt;文件&gt; 排除指定的文件 &lt;br /&gt;-x@&lt;文件列表&gt; 使用指定的列表文件来排除指定的文件 &lt;br /&gt;-y 假设全部的询问回应皆为“是” &lt;br /&gt;-z&lt;文件&gt; 从文件读取压缩文件注释&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-5740321055429290208?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/5740321055429290208/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=5740321055429290208' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/5740321055429290208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/5740321055429290208'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c-winrar.html' title='C# 利用WinRAR (加密)压缩及解压缩'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-8871699096502826874</id><published>2008-10-21T04:57:00.004-07:00</published><updated>2008-10-21T04:58:38.144-07:00</updated><title type='text'>怎么给XP系统文件夹加密?</title><content type='html'>1.打开要进行加密保护的文件夹中，在空白处单击鼠标右键，选择“自定义文件夹...”选项 &lt;br /&gt;2.选择“自定义”并在复选框中选择“选择或编辑该文件夹的Html模板”，单击“下一步” &lt;br /&gt;3.在选择模板类型中选择“标准”，单击“下一步”，最后单击“完成” &lt;br /&gt;4.完成以上操作后，打开被定义的文件夹，利用查找功能找到Folder.htt文件，然后编辑此文件，首先在文件中找到&lt;script language="JavaScript"&gt;段，然后在其下方顶头输入以下内容： &lt;br /&gt;var pass = prompt("请输入密码") //该处的“请输入密码”为系统提示语 &lt;br /&gt;if(pass !="123") //“123”处换成你自己设定的密码 &lt;br /&gt;{[[]]="c:"} &lt;br /&gt;5.保存“Folder.htt”文件之后，选择“完成”，文件夹加密就完成了，你再去打开那个文件的时候，就得输入密码了。 &lt;br /&gt;&lt;br /&gt;这个方法并不是对所有的系统都使用，如果不行的话，那只得用软件了： &lt;br /&gt;1.下载 Abel文件加密器，下载地址：http://so.xunlei.com/search?search=Abel%E6%96%87%E4%BB%B6%E5%8A%A0%E5%AF%86%E5%99%A8&amp;restype=-1&amp;id=3（用迅雷下载）。 &lt;br /&gt;2.在非系统盘里建一文件夹，把压缩文件解压其中． &lt;br /&gt;点击文件加密器(AbelLock)图标---出现“文件列表”,点击“添加”---出现打开,在“查找范围”选择你需加密的文件,单击后会出现在“文件名”显示框中,点击“打开”--- &lt;br /&gt;输入密码.确认密码后点击“加密”，点击退出. &lt;br /&gt;看看被加密的文件,文件名没变,多了后缀.xls@fc。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;我来给你推荐几个不错的软件，你可以试试看 &lt;br /&gt;文件夹加密超级大师 &lt;br /&gt;http://www.onlinedown.net/soft/41218.htm &lt;br /&gt;&lt;br /&gt;强大、专业的文件、文件夹加密软件。 &lt;br /&gt;&lt;br /&gt;超级加密3000 &lt;br /&gt;http://www.onlinedown.net/soft/42481.htm &lt;br /&gt;&lt;br /&gt;功能强大的文件和文件夹加密和保护软件。 &lt;br /&gt;&lt;br /&gt;文件夹保护 2006 &lt;br /&gt;&lt;br /&gt;http://www.onlinedown.net/soft/49201.htm &lt;br /&gt;&lt;br /&gt;优秀的文件夹保护软件，可以对文件夹进行加密码、隐藏、伪装的保护。快捷，方便的解决你文件保密问题 &lt;br /&gt;&lt;br /&gt;超级秘密文件夹 &lt;br /&gt;&lt;br /&gt;http://www.onlinedown.net/soft/50141.htm &lt;br /&gt;&lt;br /&gt;让你的重要数据和个人隐私更加保密和安全的加密软件。 &lt;br /&gt;&lt;br /&gt;超级秘密文件夹安装后不留任何痕迹，其他人绝对想不到你的机器上安装的有加密软件，当然也想不到你的机器上有加密的文件夹。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;高强度文件夹加密大师 V9000 Build 1004 绿色版 &lt;br /&gt;用迅雷下载 &lt;br /&gt;http://ghol.go1.icpcn.com/downsxxsw/hotfiles/SVOHOST9000.rar &lt;br /&gt;&lt;br /&gt;《高强度文件夹加密大师》一款专业的文件和文件夹加密器。 绝不是简单的隐藏文件夹！！！ 这款文件加密软件具有界面漂亮友好、简单易用、功能强大和兼容性好等特点。 经它加密的文件夹可以移动到其他电脑上使用。 而且支持临时解密的功能，让您不用每次都重新加密！ 并且它不受系统影响，即使重装、Ghost还原、系统盘格式化，也依然可以照样使用。 它支持两种加密方式：“本机加密”和“移动加密”。 其中的“移动加密”是本软件原创的加密方式 ，使用这种方式加密的文件夹可以随意的移动到任何电脑上，包括未安装本软件的电脑上 使用的加密方式安全性极高，不仅仅是简单的文件夹隐藏文件隐藏。 值得一提的是它的加密速度极快，上百 G 的数据仅需1秒钟完成。 没有大小限制。 使用了高强度的加密算法，给文件夹加密码，让您的文件夹更安全。不仅可以将您的文件夹彻底隐藏起来，更可以锁定您的软盘、硬盘等所有驱动器！方便,安全！ 另外它与系统结合的天衣无缝，在电脑中任何一个文件夹上右键即可加密。 设置运行密码：让软件只允许您一人使用。 强大的防删除功能：让破坏者无从下手。 本软件为绿色软件，安装卸载100% 无残留。&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-8871699096502826874?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/8871699096502826874/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=8871699096502826874' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8871699096502826874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8871699096502826874'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/xp.html' title='怎么给XP系统文件夹加密?'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-6101839731155503804</id><published>2008-10-21T04:57:00.003-07:00</published><updated>2008-10-21T04:57:55.013-07:00</updated><title type='text'>C#操作MySQL数据库的简单例子(转)</title><content type='html'>本示例演示了用C#操作MySQL的方法，提供了三个可重用的类MySqlDBUtil,MySqlPageUtil,Page。&lt;br /&gt;本示例由 C#操作Access数据库的简单例子（http://www.albertsong.com/read-56.html）修改而来。&lt;br /&gt;1.首先下载MySQL数据库的.NET驱动&lt;br /&gt;http://dev.mysql.com/get/Downloads/Connector-Net/mysql-connector-net-5.0.8.1-noinstall.zip/from/pick#mirrors&lt;br /&gt;将bin目录里的MySql.Data.dll文件复制到工程目录，并且将dll的引用加入到项目中，这样就可以通过相关的类来操作MySQL数据库了。&lt;br /&gt;using MySql.Data.MySqlClient;&lt;br /&gt;using System.Data;&lt;br /&gt;连接字符串：String connectionString = "server=127.0.0.1;user id=root; password=as; database=albertsong; pooling=false;charset=utf8";&lt;br /&gt;连接字符串中各个项目的意思是很明确的，需要注意的是charset应该设置成和数据库表的charset一致，否则可能出现中文乱码。&lt;br /&gt;然后将整个项目中的OleDb用MySql替换，这样基本上就可以了。不同的是带参数的sql语句，&lt;br /&gt;Access中是&lt;br /&gt;string sql="insert into product(name,quantity,price,sale_date,checked_flag)values(?,?,?,?,?)";&lt;br /&gt;parameters[0]=new MySqlParameter("@name",MySqlDbType.VarChar,100);&lt;br /&gt;MySql中应改为&lt;br /&gt;string sql="insert into product(name,quantity,price,sale_date,checked_flag)values(?name,?quantity,?price,?sale_date,?checked_flag)";&lt;br /&gt;parameters[0]=new MySqlParameter("?name",MySqlDbType.VarChar,100);&lt;br /&gt;2.取得MySQL自增标识字段在插入数据后的id值&lt;br /&gt;cmd.CommandText = @"select @@identity";&lt;br /&gt;int value = Int32.Parse(cmd.ExecuteScalar().ToString());&lt;br /&gt;return value;&lt;br /&gt;用cmd.CommandText = @"select LAST_INSERT_ID()";结果一样，两者的区别没有研究。&lt;br /&gt;3.分页查询&lt;br /&gt;使用Limit子句来处理分页查询，这样相对于Access的分页查询，代码大量简化，效率也会提高。&lt;br /&gt;代码这里下载MySqlDBUtilDemo.rar (198.41 KB )&lt;br /&gt;本例程是一个c#的winform程序，但是数据访问类可以在Web环境下使用。&lt;br /&gt;运行前先利用bin\Release下的sql语句文件建表并修改MySqlDBUtil中的连接字符串。&lt;br /&gt;本例程演示了：&lt;br /&gt;1.MySQL数据库的插入，更新，修改，查询；&lt;br /&gt;2.带参数的sql语句的使用，而不是拼SQL；&lt;br /&gt;3.使用Limit子句的分页查询；&lt;br /&gt;4.用事务同时执行多个SQL语句；&lt;br /&gt;5.在插入数据的同时返回最新的ID值；&lt;br /&gt;6.整型，实型，字符串，日期型，布尔型五种数据类型的操作；&lt;br /&gt;7.使用正则表达式来验证整数和实数；&lt;br /&gt;8.listview用来显示数据的一些基本用法。&lt;br /&gt;本示例不包括：&lt;br /&gt;1.完善的分页封装，只提供了分页的简单包装。&lt;br /&gt;2.嵌套的事务处理，提供了同时执行多个sql语句的事务处理，但不支持嵌套事务。&lt;br /&gt;3.listview的使用，只是利用winform控件来演示数据访问，因此不能作为winform编程的良好示例，例如添加数据时界面并没有很好地更新。&lt;br /&gt;后记：&lt;br /&gt;由于API接口一致，将操作Access数据库的类改为操作MySQL数据库的类很容易，利用这两个示例，可以学习基本的数据库操作，也可以用来做一些简单的应用程序了。实际的项目中有成熟的开源项目可用，如iBATIS.NET和NHibernate，这些项目都建筑在这些基本的API之上，先学习我写的这两个小例子也有助于学习理解这些项目。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-6101839731155503804?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/6101839731155503804/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=6101839731155503804' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/6101839731155503804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/6101839731155503804'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/cmysql.html' title='C#操作MySQL数据库的简单例子(转)'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-1206489474000719092</id><published>2008-10-21T04:57:00.001-07:00</published><updated>2008-10-21T04:57:31.527-07:00</updated><title type='text'>c#操作xml文件</title><content type='html'>一、xml文件&lt;br /&gt;&lt;br /&gt;        &lt;?xml version="1.0" encoding="utf-8" ?&gt;&lt;br /&gt;        &lt;school&gt;&lt;br /&gt;          &lt;student grade="5年级" class="3班"&gt;&lt;br /&gt;            &lt;name&gt;李四&lt;/name&gt;&lt;br /&gt;            &lt;age&gt;24&lt;/age&gt;&lt;br /&gt;            &lt;sex&gt;男&lt;/sex&gt;&lt;br /&gt;            &lt;telephone&gt;663456&lt;/telephone&gt;&lt;br /&gt;            &lt;city&gt;北京&lt;/city&gt;&lt;br /&gt;            &lt;position&gt;团员&lt;/position&gt;&lt;br /&gt;          &lt;/student&gt;&lt;br /&gt;          &lt;student grade="4年级" class="4班"&gt;&lt;br /&gt;            &lt;name&gt;王惠&lt;/name&gt;&lt;br /&gt;            &lt;age&gt;23&lt;/age&gt;&lt;br /&gt;            &lt;sex&gt;女&lt;/sex&gt;&lt;br /&gt;            &lt;telephone&gt;662345&lt;/telephone&gt;&lt;br /&gt;            &lt;city&gt;北京&lt;/city&gt;&lt;br /&gt;            &lt;position&gt;群众&lt;/position&gt;&lt;br /&gt;          &lt;/student&gt;&lt;br /&gt;          &lt;student grade="2年级" class="4班"&gt;&lt;br /&gt;            &lt;name&gt;杨二&lt;/name&gt;&lt;br /&gt;            &lt;age&gt;22&lt;/age&gt;&lt;br /&gt;            &lt;sex&gt;男&lt;/sex&gt;&lt;br /&gt;            &lt;telephone&gt;667744&lt;/telephone&gt;&lt;br /&gt;            &lt;city&gt;上海&lt;/city&gt;&lt;br /&gt;            &lt;position&gt;团员&lt;/position&gt;&lt;br /&gt;          &lt;/student&gt;&lt;br /&gt;        &lt;/school&gt;&lt;br /&gt;&lt;br /&gt;二、操作：&lt;br /&gt;&lt;br /&gt;    protected void Button1_Click(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        //模糊查询&lt;br /&gt;        string _Input = "//student[*='北京']";&lt;br /&gt;        string _Name = "";&lt;br /&gt;        string _Text = "";&lt;br /&gt;&lt;br /&gt;        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();&lt;br /&gt;        doc.Load(@"D:\Software TempCode\WebSite1\XMLFile.xml");&lt;br /&gt;&lt;br /&gt;        System.Xml.XmlNodeList list = doc.SelectNodes(_Input);&lt;br /&gt;&lt;br /&gt;        foreach (System.Xml.XmlNode node in list)&lt;br /&gt;        {&lt;br /&gt;            foreach (System.Xml.XmlNode childNode in node)&lt;br /&gt;            {&lt;br /&gt;                _Name += childNode.Name + ".";&lt;br /&gt;                _Text += childNode.InnerText + ".";&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        Response.Write(_Name + "&lt;br/&gt;" + _Text);&lt;br /&gt;        //运行结果：&lt;br /&gt;            //name.age.sex.telephone.city.position.name.age.sex.telephone.city.position.&lt;br /&gt;            //李四.24.男.663456.北京.团员.王惠.23.女.662345.北京.群众. &lt;br /&gt;    }&lt;br /&gt;    protected void Button2_Click(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        //根据路径查询&lt;br /&gt;        string _Input = "//school/student";&lt;br /&gt;        string _Grade = "5年级";&lt;br /&gt;        string _Class = "3班";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();&lt;br /&gt;        xmlDoc.Load(@"D:\Software TempCode\WebSite1\XMLFile.xml");&lt;br /&gt;        //System.Xml.XmlNodeList list = xmlDoc.SelectNodes(_Input);&lt;br /&gt;&lt;br /&gt;        string xmlPartName = _Input + "[@grade ='" + _Grade + "'or class = '" + _Class + "']/name";&lt;br /&gt;        string xmlPartAge = _Input + "[@grade ='" + _Grade + "'or class = '" + _Class + "']/age";&lt;br /&gt;&lt;br /&gt;        string _Name = xmlDoc.DocumentElement.SelectSingleNode(xmlPartName).InnerText;&lt;br /&gt;        string _Age = xmlDoc.DocumentElement.SelectSingleNode(xmlPartAge).InnerText;&lt;br /&gt;&lt;br /&gt;        Response.Write(_Name + "&lt;br/&gt;" + _Age);&lt;br /&gt;        //输出结果：&lt;br /&gt;            //李四&lt;br /&gt;            //24 &lt;br /&gt;    }&lt;br /&gt;    protected void Button3_Click(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(@"D:\Software TempCode\WebSite1\XMLFile.xml");&lt;br /&gt;        string _Name = "";&lt;br /&gt;        //顺序遍历&lt;br /&gt;        while (reader.Read())&lt;br /&gt;        {&lt;br /&gt;            if (reader.Name == "age" &amp;&amp; reader.NodeType == System.Xml.XmlNodeType.Element)&lt;br /&gt;            { &lt;br /&gt;                _Name = reader.Value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-1206489474000719092?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/1206489474000719092/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=1206489474000719092' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1206489474000719092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1206489474000719092'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/cxml.html' title='c#操作xml文件'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-1115686059855856693</id><published>2008-10-21T04:56:00.004-07:00</published><updated>2008-10-21T04:57:11.823-07:00</updated><title type='text'>用c＃动态创建access数据库_c#应用</title><content type='html'>摘自：http://www.west263.com/www/info/62911-1.htm&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;记得以前要动态的创建Access数据库的mdb文件都是采用DAO，用VC开发，一大堆的API，很是麻烦。现在好像也鲜有人提起DAO。其实动态的创建mdb数据的最简单的方法还是ADOX。&lt;br /&gt;      用ADOX创建access数据库方法很简单，只需要new一个Catalog对象，然后调用它的Create方法就可以了，如下：&lt;br /&gt;ADOX.Catalog catalog = new Catalog();&lt;br /&gt;catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\test.mdb;Jet OLEDB:Engine Type=5");&lt;br /&gt;&lt;br /&gt;      仅仅两行代码就搞定了。下来我主要介绍一下在c＃中的实现细节。首先你要添加引用，在“Add reference”对话框里切换到Com页面，选择“Microsoft ADO Ext. 2.8 for DDL and Security”,然后点击OK。在文件的开头using ADOX名字空间。然后添加如上面所示的代码就可以成功的创建Access 数据库了，代码如下：&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using ADOX;&lt;br /&gt;&lt;br /&gt;namespace testADOX&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            ADOX.Catalog catalog = new Catalog();&lt;br /&gt;            catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\test.mdb;Jet OLEDB:Engine Type=5");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;      创建了数据库文件是没有实际用处的，我们还要创建表。在创建表之前，我们必须连接目标数据库，用来连接数据的桥梁居然是ADO的Connection对象，所以我们不得不再次添加对ADO的应用，在添加引用对话框中切换到Com页面，选择“Microsoft ActiveX Data Objects 2.8 Library”，然后点击OK。下边是创建表的完整代码：&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using ADOX;&lt;br /&gt;&lt;br /&gt;namespace testADOX&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            ADOX.Catalog catalog = new Catalog();&lt;br /&gt;            catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\test.mdb;Jet OLEDB:Engine Type=5");&lt;br /&gt;&lt;br /&gt;            ADODB.Connection cn = new ADODB.Connection();&lt;br /&gt;            &lt;br /&gt;            cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\test.mdb", null, null, -1);&lt;br /&gt;            catalog.ActiveConnection = cn;&lt;br /&gt;&lt;br /&gt;            ADOX.Table table = new ADOX.Table();&lt;br /&gt;            table.Name = "FirstTable";&lt;br /&gt;&lt;br /&gt;            ADOX.Column column = new ADOX.Column();&lt;br /&gt;            column.ParentCatalog = catalog;&lt;br /&gt;            column.Name = "RecordId";&lt;br /&gt;            column.Type = DataTypeEnum.adInteger;&lt;br /&gt;            column.DefinedSize = 9;&lt;br /&gt;            column.Properties["AutoIncrement"].Value = true;&lt;br /&gt;            table.Columns.Append(column, DataTypeEnum.adInteger, 9);&lt;br /&gt;            table.Keys.Append("FirstTablePrimaryKey", KeyTypeEnum.adKeyPrimary, column, null, null);&lt;br /&gt;            table.Columns.Append("CustomerName", DataTypeEnum.adVarWChar, 50);&lt;br /&gt;            table.Columns.Append("Age", DataTypeEnum.adInteger, 9);&lt;br /&gt;            table.Columns.Append("Birthday", DataTypeEnum.adDate, 0);&lt;br /&gt;            catalog.Tables.Append(table);&lt;br /&gt;         &lt;br /&gt;            cn.Close();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;      上面的代码中，创建了一个名为FirstTable的表，在表里加入了4个字段，并设置了一个主键。表里的字段分别输入4中不同的常用类型，第一个字段是一个自动增长的整数类型，这个类型比较特殊，你必须为这个字段设置ParentCatalog属性，并将“AutoIncrement”的属性值设为 true.。Access里的Text类型对应的就是adVarWchar，而日期类型对应的是adDate。&lt;br /&gt;键的设置如 table.Keys.Append("FirstTablePrimaryKey", KeyTypeEnum.adKeyPrimary, column, null, null)所示，如果是外键的话，你还必须要设置关联的表和关联的字段，也就是Append方法的后两个字段。&lt;br /&gt;你也可以参照上边的代码创建索引和视图。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-1115686059855856693?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/1115686059855856693/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=1115686059855856693' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1115686059855856693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1115686059855856693'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/caccessc_21.html' title='用c＃动态创建access数据库_c#应用'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-2996714958513288341</id><published>2008-10-21T04:56:00.003-07:00</published><updated>2008-10-21T04:56:49.159-07:00</updated><title type='text'>c#窗口设置</title><content type='html'>1.     如何设置一个From的边界 &lt;br /&gt;&lt;br /&gt;2.     如何建立一个透明的From&lt;br /&gt;&lt;br /&gt;3.     如何设置窗体在屏幕中的位置&lt;br /&gt;&lt;br /&gt;4.     如何使最小化和最大化按钮不可用&lt;br /&gt;&lt;br /&gt;5.     如何使一个窗体不见&lt;br /&gt;&lt;br /&gt;6.     如何设置使窗体成为非矩形的.&lt;br /&gt;&lt;br /&gt;7.     如何使一个窗体在屏幕的最顶端.&lt;br /&gt;&lt;br /&gt;8.     如何显示一个Model和非Model的窗体&lt;br /&gt;&lt;br /&gt;9.     如何制作一个MDI的窗体&lt;br /&gt;&lt;br /&gt;10. 如何将你的窗体不显示在任务条上.&lt;br /&gt;&lt;br /&gt;11. 如何制作一个带启动屏幕的窗体.&lt;br /&gt;&lt;br /&gt;12. 如何使你的窗体TrayIcon.&lt;br /&gt;&lt;br /&gt;13. 如何修改控制窗体的尺寸和长宽尺寸.&lt;br /&gt;&lt;br /&gt;14. 如何建立一个Windows Explorer风格的窗体.&lt;br /&gt;&lt;br /&gt;15. 如何设置初始的启动窗体&lt;br /&gt;&lt;br /&gt;16. 如何建立一个有背景图像的窗体 &lt;br /&gt;==========================================================================================&lt;br /&gt;&lt;br /&gt;1.     如何设置一个From的边界&lt;br /&gt;&lt;br /&gt;form总共有七种不同的边界风格让你设置,你可以在设计时刻也可以运行时通过代码动态的来设置它.这七种边界风格分别是:&lt;br /&gt;&lt;br /&gt;none (System.Windows.Forms.FormBorderStyle.None )&lt;br /&gt;&lt;br /&gt;fixed 3D (System.Windows.Forms.FormBorderStyle.Fixed3D)&lt;br /&gt;&lt;br /&gt;fixed Dialog (System.Windows.Forms.FormBorderStyle.FixedDialog)&lt;br /&gt;&lt;br /&gt;fixed Single(System.Windows.Forms.FormBorderStyle.FixedSingle)&lt;br /&gt;&lt;br /&gt;fixed Tool Window(System.Windows.Forms.FormBorderStyle.FixedToolWindow)&lt;br /&gt;&lt;br /&gt;sizable(system.windows.forms.formborderstyle.sizable)&lt;br /&gt;&lt;br /&gt;sizable Tool Window&lt;br /&gt;&lt;br /&gt;(system.windows.forms.formborderstyle.sizabletoolwindow)&lt;br /&gt;&lt;br /&gt;在设计方式下在vs.net IDE的 Properties window中设置FormBorderStyle属性就可以了.&lt;br /&gt;&lt;br /&gt;在运行方式下你可以用代码来完成:&lt;br /&gt;&lt;br /&gt;dlgbx1.formborderstyle = System.Windows.Forms.FormBorderStyle.FixedDialog &lt;br /&gt;这七种边界类型VB6中就有,没有什么大的变化,运行方式下你需要对照不同的枚举变量进行设置.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.     如何建立一个透明的From&lt;br /&gt;&lt;br /&gt;你可以通过两种方法在设计时刻和运行时刻来做到这一点.&lt;br /&gt;&lt;br /&gt;设计时刻,你可以在vs.net IDE的 Properties window, 设置Opacity 属性达到这个效果.这个值从0.0到1.0 . 0表示完全透明,1.0表示完全不透明.&lt;br /&gt;&lt;br /&gt;运行时刻你可以用下面的编码设置窗体的opactiy属性来做到.具体:&lt;br /&gt;&lt;br /&gt;frmtransparentform.opacity = 0.76; ( C# )&lt;br /&gt;&lt;br /&gt;看得出现在很简单了,你已经不用再去了解什么alpha变量了.透明始终只是一种效果,不要滥用它.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.     如何设置窗体在屏幕中的位置&lt;br /&gt;&lt;br /&gt;你可以设置窗体的startposition属性,vs.net一般给你一个保守的选项” WindowsDefaultLocation“ 这样系统在Load窗体时将根据用户当前的计算机设置来确定一个值,你也可以在设计时将它改成另一个值”Center”.&lt;br /&gt;&lt;br /&gt;如果你一定要在设计方式下确定窗体在屏幕出现的位置你可以先设置startposition为manual,然后设置location的x和y的值.&lt;br /&gt;&lt;br /&gt;运行时用代码实现似乎更简洁一些:&lt;br /&gt;&lt;br /&gt;Form1.Location = new Point (100, 100) ( VB.NET ) &lt;br /&gt;当然你也可以分别修改的Location的X和Y值,对应的是窗体的Left和Top属性,比如:&lt;br /&gt;&lt;br /&gt;form1.left += 200 ( VB.NET )&lt;br /&gt;&lt;br /&gt;form1.top -= 100 ( VB.NET )&lt;br /&gt;&lt;br /&gt;另外一个属性将也将影响窗体在屏幕的位置:desktoplocation 这个属性主要是在你设置窗体的位置相对于任务栏时非常实用(当你把任务条放在屏幕的顶或左边时,其实相应改动了desktop coordinates (0,0)),你可以这样设置这个不出现在设计属性窗口中的属性,&lt;br /&gt;&lt;br /&gt;form1.desktoplocation = new Point (100,100)&lt;br /&gt;&lt;br /&gt;窗体在屏幕中的位置将主要取决于各自用户具体的硬件和设置情况,所以保守的作法是用默认的” WindowsDefaultLocation”或 ”Center”;专业的作法是自己先获取系统的设置然后编码动态计算后进行设置,不然很容易在屏幕上找不到你的窗体.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4.     如何使最小化和最大化按钮不可用&lt;br /&gt;&lt;br /&gt;在设置窗体的form.minimizebox和form.maximizebox 当为True时表示显示,False时表示不可.用编程方式见下:&lt;br /&gt;&lt;br /&gt;frmmaxmin.minnimizebox = False ( VB.NET)&lt;br /&gt;&lt;br /&gt;frmmaxmin.maxmnimizebox = True ( VB.NET )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5.     如何使一个窗体不见&lt;br /&gt;&lt;br /&gt;我想最直接的办法是你调用 Hide()方法来做到这一点.不过我想提供另一种方法,看了之后你会获得一些其它的启发. ( VB.NET )&lt;br /&gt;&lt;br /&gt;    Private Const WS_EX_TOOLWINDOW As Int32 = &amp;H80&lt;br /&gt;&lt;br /&gt;    Private Const WS_POPUP As Int32 = &amp;H80000000&lt;br /&gt;&lt;br /&gt;    Private Const WS_VISIBLE As Int32 = &amp;H10000000&lt;br /&gt;&lt;br /&gt;    Private Const WS_SYSMENU As Int32 = &amp;H80000&lt;br /&gt;&lt;br /&gt;    Private Const WS_MAXIMIZEBOX As Int32 = &amp;H10000&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams&lt;br /&gt;&lt;br /&gt;        Get&lt;br /&gt;&lt;br /&gt;            Dim cp As System.Windows.Forms.CreateParams&lt;br /&gt;&lt;br /&gt;            cp = MyBase.CreateParams&lt;br /&gt;&lt;br /&gt;            cp.ExStyle = WS_EX_TOOLWINDOW&lt;br /&gt;&lt;br /&gt;            cp.Style = WS_POPUP Or WS_VISIBLE Or WS_SYSMENU Or WS_MAXIMIZEBOX&lt;br /&gt;&lt;br /&gt;            cp.Height = 0&lt;br /&gt;&lt;br /&gt;            cp.Width = 0&lt;br /&gt;&lt;br /&gt;            Return cp&lt;br /&gt;&lt;br /&gt;        End Get&lt;br /&gt;&lt;br /&gt;    End Property&lt;br /&gt;&lt;br /&gt;    原来是把Height 和Width都设置成0 ，我想这种方式和Hide()调用的底层可能是不同的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6.     如何设置使窗体成为非矩形的.&lt;br /&gt;&lt;br /&gt;这个问题我想我提供的不是最专业的作法,至少它还不能达到我期望的那样,也就是说它在某些事件中它还会变回矩形.但至少我可以告诉你：如果试图调用原来的win32’s API SetWindowRng是不行的,我曾如此的尝试过.现在你可能需要知道有关窗体的Region属性&lt;br /&gt;&lt;br /&gt;     ' // ( VB.NET ) &lt;br /&gt;&lt;br /&gt;    Public Sub SetWindowRegion()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        Dim FormPath As System.Drawing.Drawing2D.GraphicsPath&lt;br /&gt;&lt;br /&gt;        Dim Reg As Drawing.Region&lt;br /&gt;&lt;br /&gt;        Dim lRet As Long&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        FormPath = New Drawing2D.GraphicsPath()&lt;br /&gt;&lt;br /&gt;        FormPath.AddEllipse(New Rectangle(0, 0, 250, 120))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        Me.Region = New Region(FormPath)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click&lt;br /&gt;&lt;br /&gt;        Me.Region = Nothing&lt;br /&gt;&lt;br /&gt;        SetWindowRegion()&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    Protected Overrides Sub OnResize(ByVal e As System.EventArgs)&lt;br /&gt;&lt;br /&gt;          Me.Region = Nothing&lt;br /&gt;&lt;br /&gt;          SetWindowRegion()&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7.     如何使一个窗体在屏幕的最顶端.&lt;br /&gt;&lt;br /&gt;这是很实用的一个功能,现在你不用在调用其它api了,只用设置topmost 属性为True就可以了.对于这个属性在设计时刻和运行时刻都是可以进行修改的.代码方式:&lt;br /&gt;&lt;br /&gt;         myTopForm.TopMost = True ( VB.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;8.     如何显示一个Model和非Model的窗体&lt;br /&gt;&lt;br /&gt;model和modeless的窗体主要将取决于你的应用,最多的是用在显示对话框.当你需要model的窗体时你调用myform. ShowDialog而非Model的调用MyForm.Show,对于ShowDialog有一个可选参数ower可以让你为一个窗体建立父子关系.比如:&lt;br /&gt;&lt;br /&gt;' Visual Basic &lt;br /&gt;Private Sub mnuAbout_Click(…args…) &lt;br /&gt;   Dim f As New FormOption &lt;br /&gt;   f.ShowDialog Me &lt;br /&gt;End Sub &lt;br /&gt;有一点需要注意的是对于ShowDialog来说,当执行到这一句,窗体显示,但这之后的代码将不会执行,只到窗口关闭之后才继续执行,而对于Show来说是即时的,显示窗体之后将立即执行下面的代码. &lt;br /&gt;9.     如何制作一个MDI的窗体&lt;br /&gt;&lt;br /&gt;1.     建立一个新的Windows Application项目&lt;br /&gt;&lt;br /&gt;2.     分别加入两个窗体Form1 、Form2&lt;br /&gt;&lt;br /&gt;3.     设置Form1的IsMdiContainer属性为True。使它成为MDI主窗体。&lt;br /&gt;&lt;br /&gt;4.     在Form2中加入一个RichTextBox控件，并设置Dock为：Fill&lt;br /&gt;&lt;br /&gt;5.     在Tools 窗体中拖一个MainMenu到窗体Form1，然后建立一个菜单File|Windows|Help三个菜单项，File中包括New、Exit菜单项；Windows中包括Cascade、Horizontal等。&lt;br /&gt;&lt;br /&gt;6.     设置Windows菜单项的MdiList属性＝True， 这样每一个MDI子窗口将自动加在Windows菜单项下面。&lt;br /&gt;&lt;br /&gt;7.     双击New菜单项，然后加入以下代码：&lt;br /&gt;&lt;br /&gt;     private void menuNew_Click(object sender, System.EventArgs e)&lt;br /&gt;&lt;br /&gt;     {&lt;br /&gt;&lt;br /&gt;         Form2 NewMdiChild ;&lt;br /&gt;&lt;br /&gt;         NewMdiChild = new Form2() ;&lt;br /&gt;&lt;br /&gt;         NewMdiChild.MdiParent = this ;&lt;br /&gt;&lt;br /&gt;         NewMdiChild.Show() ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;8.     在Windows的Cascade等菜单项中加入以下代码：&lt;br /&gt;&lt;br /&gt;     private void menuWindowCasca_Click(object sender, System.EventArgs e)&lt;br /&gt;&lt;br /&gt;     {&lt;br /&gt;&lt;br /&gt;         this.LayoutMdi( MdiLayout.Cascade) ;&lt;br /&gt;&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;另外还有以下常用的:&lt;br /&gt;&lt;br /&gt;this.layoutmdi(mdilayout.tilehorizontal);&lt;br /&gt;&lt;br /&gt;this.layoutmdi(mdilayout.tilevertical);&lt;br /&gt;&lt;br /&gt;9.     F5运行。&lt;br /&gt;&lt;br /&gt;最终版的vs.net 不知是否会有一个通用的模板，不过用完全手工的方式产生一个MDI的窗口，显得有些繁琐，不如VS.NET的IDE方式下那么简洁。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;10.     如何将你的窗体不显示在任务条上.&lt;br /&gt;&lt;br /&gt;当窗体的边界风格是tools Window时它都不会出现在任务条上的.另外上面标题5中介绍的方法不仅窗体看不见,也不会出现在任务条上.&lt;br /&gt;&lt;br /&gt;    如果你现在在Dotnet的世界，这件事也变的简单，任何的Winform窗体现在都有ShowInTaskbar属性，所以你只要简单的设置这个属性就可以了。同样你可以选择在属性窗口中将ShowInTaskbar由True改为False。或是用代码的方式：&lt;br /&gt;&lt;br /&gt;    MyTaskBarFrm.ShowInTaskbar = false ; ( C# )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;11.     如何制作一个带启动屏幕的窗体.&lt;br /&gt;&lt;br /&gt;需要你准备两个winform的窗体，一个叫它：splashscreen，把它做成一个漂亮的窗体。然后你需要一个主窗体叫它：form1吧，然后在这个窗体加入下面的代码。&lt;br /&gt;&lt;br /&gt;     // ( C# )&lt;br /&gt;&lt;br /&gt;     protected override void OnLoad ( System.EventArgs e )&lt;br /&gt;&lt;br /&gt;     {&lt;br /&gt;&lt;br /&gt;         //make load take a long time&lt;br /&gt;&lt;br /&gt;         Thread.Sleep(2000);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;         base.OnLoad(e);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;然后在main中加入这样的代码：&lt;br /&gt;&lt;br /&gt;     [STAThread]&lt;br /&gt;&lt;br /&gt;     static void Main()&lt;br /&gt;&lt;br /&gt;     {&lt;br /&gt;&lt;br /&gt;         SplashScreen splashForm = new SplashScreen();&lt;br /&gt;&lt;br /&gt;         splashForm.Show();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;         Form1 mainForm = new Form1() ;&lt;br /&gt;&lt;br /&gt;         mainForm.Load += new EventHandler(splashForm.MainScreen_Load);&lt;br /&gt;&lt;br /&gt;         Application.Run(mainForm);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;不要忘了加上对threading的引用： using System.Threading;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;12.     如何使你的窗体TrayIcon.&lt;br /&gt;&lt;br /&gt;实现这个功能你可以运用notifyicon控件来达到，从tools Windows中将NotifyIcon拖到你的窗体上然后在下面的事件加入如下代码，F5。&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   ' // VB.NET&lt;br /&gt;&lt;br /&gt;    Private mIconA As Icon = New Icon("Icon1.ico")&lt;br /&gt;&lt;br /&gt;    Private mIconB As Icon = New Icon("Icon2.ico")&lt;br /&gt;&lt;br /&gt;    Private mIconDisplayed As Boolean&lt;br /&gt;&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;    Public Sub New()&lt;br /&gt;&lt;br /&gt;        MyBase.New&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        Form1 = Me&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        'This call is required by the Win Form Designer.&lt;br /&gt;&lt;br /&gt;        InitializeComponent&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        'TODO: Add any initialization after the InitializeComponent() call&lt;br /&gt;&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;        'this form isn't used directly so hide it immediately&lt;br /&gt;&lt;br /&gt;        Me.Hide()&lt;br /&gt;&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;        'setup the tray icon&lt;br /&gt;&lt;br /&gt;        Initializenotifyicon()&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;    Private Sub Initializenotifyicon()&lt;br /&gt;&lt;br /&gt;        'setup the default icon&lt;br /&gt;&lt;br /&gt;        notifyicon = New System.Windows.Forms.NotifyIcon()&lt;br /&gt;&lt;br /&gt;        NotifyIcon.Icon = mIconA&lt;br /&gt;&lt;br /&gt;        NotifyIcon.Text = "Right Click for the menu"&lt;br /&gt;&lt;br /&gt;        NotifyIcon.Visible = True&lt;br /&gt;&lt;br /&gt;        mIconDisplayed = True&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        'Insert all MenuItem objects into an array and add them to&lt;br /&gt;&lt;br /&gt;        'the context menu simultaneously&lt;br /&gt;&lt;br /&gt;        Dim mnuItms(3) As MenuItem&lt;br /&gt;&lt;br /&gt;        mnuItms(0) = New MenuItem("Show Form...", New EventHandler(AddressOf Me.ShowFormSelect))&lt;br /&gt;&lt;br /&gt;        mnuItms(0).DefaultItem = True&lt;br /&gt;&lt;br /&gt;        mnuItms(1) = New MenuItem("Toggle Image", New EventHandler(AddressOf Me.ToggleImageSelect))&lt;br /&gt;&lt;br /&gt;        mnuItms(2) = New MenuItem("-")&lt;br /&gt;&lt;br /&gt;        mnuItms(3) = New MenuItem("Exit", New EventHandler(AddressOf Me.ExitSelect))&lt;br /&gt;&lt;br /&gt;        Dim notifyiconMnu As ContextMenu = New ContextMenu(mnuItms)&lt;br /&gt;&lt;br /&gt;        notifyicon.ContextMenu = notifyiconMnu&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    Public Sub ShowFormSelect(ByVal sender As Object, ByVal e As System.EventArgs)&lt;br /&gt;&lt;br /&gt;        'Display the settings dialog&lt;br /&gt;&lt;br /&gt;        Dim SettingsForm As New SettingsForm()&lt;br /&gt;&lt;br /&gt;        SettingsForm.ShowDialog()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    Public Sub ToggleImageSelect(ByVal sender As Object, ByVal e As System.EventArgs)&lt;br /&gt;&lt;br /&gt;        'called when the user selects the 'Toggle Image' context menu&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        'determine which icon is currently visible and switch it&lt;br /&gt;&lt;br /&gt;        If mIconDisplayed Then&lt;br /&gt;&lt;br /&gt;            'called when the user selects the 'Show Form' context menu&lt;br /&gt;&lt;br /&gt;            NotifyIcon.Icon = mIconB&lt;br /&gt;&lt;br /&gt;            NotifyIcon.Text = "Sad"&lt;br /&gt;&lt;br /&gt;            mIconDisplayed = False&lt;br /&gt;&lt;br /&gt;        Else&lt;br /&gt;&lt;br /&gt;            NotifyIcon.Icon = mIconA&lt;br /&gt;&lt;br /&gt;            NotifyIcon.Text = "Happy"&lt;br /&gt;&lt;br /&gt;            mIconDisplayed = True&lt;br /&gt;&lt;br /&gt;        End If&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    Public Sub ExitSelect(ByVal sender As Object, ByVal e As System.EventArgs)&lt;br /&gt;&lt;br /&gt;        'called when the user selects the 'Exit' context menu&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        'hide the tray icon&lt;br /&gt;&lt;br /&gt;        NotifyIcon.Visible = False&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        'close up&lt;br /&gt;&lt;br /&gt;        Me.Close()&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    'Form overrides dispose to clean up the component list.&lt;br /&gt;&lt;br /&gt;    Public Overloads Overrides Sub Dispose()&lt;br /&gt;&lt;br /&gt;        MyBase.Dispose()&lt;br /&gt;&lt;br /&gt;        components.Dispose()&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    图标文件你自己准备了，如果成功你可以看到有关NotifyIcond的各种功能了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;13.     如何修改控制窗体的尺寸和长宽尺寸.&lt;br /&gt;&lt;br /&gt;主要是修改winform的size, Width 和Height属性。同样它们都是可以在设计和运行时刻进行修改和设置。&lt;br /&gt;&lt;br /&gt;form1.size = New System.Drawing.Size(100, 100) ( VB.NET )&lt;br /&gt;&lt;br /&gt;form1.width += 100 (VB.NET )&lt;br /&gt;&lt;br /&gt;form1.height -= 20 (VB.NET )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;14.     如何建立一个Windows Explorer风格的窗体.&lt;br /&gt;&lt;br /&gt;1.建立一个新的windows Application&lt;br /&gt;&lt;br /&gt;2.从toolbox窗口拖一个treeview控件、、一个splitterk控件、一个listview控件，分别在属性窗口中设置treeview的dock属性为：：left；设置listview控件的dock属性为：fill&lt;br /&gt;&lt;br /&gt;3： F5 运行&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;15.     如何设置初始的启动窗体&lt;br /&gt;&lt;br /&gt;无论是c#还是visual Basic的Winform项目中你都可以在Solution Explorer窗口中右键你的Project，然后选择属性，从你Project的属性页中选择你启动的窗体或是Main()方法。&lt;br /&gt;&lt;br /&gt;有些不同的是在目前的vs.net Beta2中C#项目会自动产生Main() 方法，Visual Basic.Net 的项目中你必须自己添加Main()代码，C#中你可以将Form1改成任何你可以启动的窗体名：&lt;br /&gt;&lt;br /&gt;     // ( C# )&lt;br /&gt;&lt;br /&gt;        static void Main()&lt;br /&gt;&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            Application.Run(new Form1());&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;16.     如何建立一个有背景图像的窗体&lt;br /&gt;&lt;br /&gt;现在的winform中所有的窗体都有一个backgroundimage属性，只用对它赋值就可以了。普通窗体可以在运行模式也可以在运行模式完成这个设置。比如在initializecomponent()或窗体的构造函数中加入这样的代码：&lt;br /&gt;&lt;br /&gt;this.backgroundimage = new Bitmap("C:\\DotNetApp\\WinForm\\Tile.bmp" ) ;&lt;br /&gt;&lt;br /&gt;    对于MDI的主窗体要麻烦一些，在VS.NET的IDE窗体中，当你设置完IsMdiContainer属性为True后，你需要查看一下InitializeComponent()中是否有这样的代码 ( C# )：&lt;br /&gt;&lt;br /&gt;            this.mdiClient1.Dock = System.Windows.Forms.DockStyle.Fill;&lt;br /&gt;&lt;br /&gt;            this.mdiClient1.Name = "mdiClient1";&lt;br /&gt;&lt;br /&gt;或是在窗口的属性窗口组合框中看到mdiclient1 System.Windows.Forms.mdiClient.这就是主MDI窗口，不过我没有在dotnet的文档中找到任何有关System.Windows.Forms.mdiClient的说明。然后你可以在InitializeComponent()或窗体的构造函数中加入这样的代码( C# )：&lt;br /&gt;&lt;br /&gt;this.mdiclient1.backgroundimage = new Bitmap("C:\\DotNetApp\\WinForm\\Tile.bmp" ) ;&lt;br /&gt;&lt;br /&gt;    网上有一个ImageView的例子，里面演示了给MDI主窗体中背景上加入一行Logo文字的方法，这样使你的MDI窗体看起来很商业化，具体的你可以这样做：&lt;br /&gt;&lt;br /&gt;1．   先在VS.NET 自动产生代码的InitializeComponent中看是否有这样的语句( C# )：&lt;br /&gt;&lt;br /&gt;this.controls.addrange(new System.Windows.Forms.Control[] {this.mdiClient1});&lt;br /&gt;&lt;br /&gt;    又是这个mdiClient （haha）&lt;br /&gt;&lt;br /&gt;2．   建立以下两个函数用于显示这个Logo字符：&lt;br /&gt;&lt;br /&gt;// ( C# )&lt;br /&gt;&lt;br /&gt;        protected void Mdi_OnPaint ( Object s, System.Windows.Forms.PaintEventArgs e )&lt;br /&gt;&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            Control c = (Control)s;&lt;br /&gt;&lt;br /&gt;           &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            Rectangle r1 = c.ClientRectangle;&lt;br /&gt;&lt;br /&gt;            r1.Width -= 4;&lt;br /&gt;&lt;br /&gt;            r1.Height -= 4;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            Rectangle r2 = r1;&lt;br /&gt;&lt;br /&gt;            r2.Width -= 1;&lt;br /&gt;&lt;br /&gt;            r2.Height -= 1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            Font f = new Font("Tahoma", 8);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            String str = "MyWinform.NET ?2001 MyWinform Application V1.0";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            StringFormat sf = new StringFormat();&lt;br /&gt;&lt;br /&gt;            sf.Alignment = StringAlignment.Far;&lt;br /&gt;&lt;br /&gt;            sf.LineAlignment = StringAlignment.Far;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            e.Graphics.DrawString(str, f, new SolidBrush(SystemColors.ControlDarkDark), r1, sf);&lt;br /&gt;&lt;br /&gt;            e.Graphics.DrawString(str, f, new SolidBrush(SystemColors.ControlLight), r2, sf);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        protected void Mdi_OnResize ( Object s , System.EventArgs e )&lt;br /&gt;&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;           &lt;br /&gt;&lt;br /&gt;            Control c = (Control)s;&lt;br /&gt;&lt;br /&gt;            c.Invalidate();&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;3．   在InitializeComponent()或窗体的构造函数中加入这样的代码：&lt;br /&gt;&lt;br /&gt;( C# )&lt;br /&gt;&lt;br /&gt;    this.Controls[0].Paint += new PaintEventHandler( Mdi_OnPaint ) ;&lt;br /&gt;&lt;br /&gt;    this.Controls[0].Resize += new EventHandler( Mdi_OnResize ) ;&lt;br /&gt;&lt;br /&gt;        注意将它加在InitializeComponent()后面或是在InitializeComponent函数中this.Controls.AddRange函数之后。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-2996714958513288341?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/2996714958513288341/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=2996714958513288341' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2996714958513288341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2996714958513288341'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_9889.html' title='c#窗口设置'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-4858747970487966586</id><published>2008-10-21T04:56:00.001-07:00</published><updated>2008-10-21T04:56:26.237-07:00</updated><title type='text'>Visual C# 2005如何连接至Access数据库</title><content type='html'>Access是一个非常流行的桌面数据库，深受许多小型企业与个人用户喜爱，因此如何连接至Access数据库，自然成为一项非常重要的课题。欲连接至Access数据库，您必须掌握下列要诀：&lt;br /&gt;&lt;br /&gt;◆请使用OleDbConnectionStringBuilder类来构建连接字符串。&lt;br /&gt;◆请将OleDbConnectionStringBuilder对象的Provider属性设置成Microsoft.Jet.OLEDB.4.0。&lt;br /&gt;◆请将OleDbConnectionStringBuilder对象的DataSource属性设置成数据库文件的完整路径。&lt;br /&gt;◆必须使用OLE DB.NET Framework数据提供程序的OleDbConnection类来进行连接。&lt;br /&gt;&lt;br /&gt;程序范例&lt;br /&gt;&lt;br /&gt; &lt;a href="http://3.bp.blogspot.com/_LACRXgkTnEo/SPdlMYl4utI/AAAAAAAAACI/UtuRMcZpyJg/s1600-h/1358300.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_LACRXgkTnEo/SPdlMYl4utI/AAAAAAAAACI/UtuRMcZpyJg/s320/1358300.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5257782353412537042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;图 4-9 &lt;br /&gt;&lt;br /&gt;图4-9是程序范例CH4_DemoForm007.cs的执行画面，它示范如何连接至Access数据库C:＼VCSharp 2005_IO_Data_Sample＼Database＼杂汇.mdb，并将此数据库的“学生”数据表的数据记录显示在DataGridView控件中。&lt;br /&gt;&lt;br /&gt;本程序范例的设计重点说明如下：&lt;br /&gt;&lt;br /&gt;◆请导入所需的命名空间：&lt;br /&gt;&lt;br /&gt;using System.Data.OleDb； &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;◆请替按钮的Click事件处理函数编写下列程序代码，以便构建连接字符串并建立一个OleDbConnection对象来连接至Access数据库：&lt;br /&gt;&lt;br /&gt;private void btnConnect_Click(object sender, EventArgs e){try{// 利用 OleDbConnectionStringBuilder 对象来构建// 连接字符串。OleDbConnectionStringBuilder connectStringBuilder=new OleDbConnectionStringBuilder()；connectStringBuilder.DataSource=@"C:＼VCSharp2005IODataSample＼Database＼杂汇.mdb"；connectStringBuilder.Provider="Microsoft.Jet.OLEDB.4.0"；using (OleDbConnection cn=new OleDbConnection(connectStringBuilder.ConnectionString)){DataSet ds=new DataSet()；OleDbCommand cmdLiming=new OleDbCommand("SELECT * FROM 学生", cn)；cn.Open()；using (OleDbDataReader drLiming=cmdLiming.ExecuteReader()){ds.Load(drLiming, LoadOption.OverwriteChanges, new string［］ { "学生" })；// 将 BindingSource 组件绑定到 DataSet 当中的"学生"数据表。this.BindingSource1.DataSource=ds.Tables［"学生"］；// 将 DataGridView 控件绑定到 BindingSource 组件。this.DataGridView1.DataSource=this.BindingSource1；}}}}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-4858747970487966586?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/4858747970487966586/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=4858747970487966586' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4858747970487966586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4858747970487966586'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/visual-c-2005access.html' title='Visual C# 2005如何连接至Access数据库'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LACRXgkTnEo/SPdlMYl4utI/AAAAAAAAACI/UtuRMcZpyJg/s72-c/1358300.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-1560671156431922328</id><published>2008-10-21T04:55:00.002-07:00</published><updated>2008-10-21T04:56:03.726-07:00</updated><title type='text'>c#.net连接access操作类</title><content type='html'>1、配置web.config文件：配置数据库连接参数&lt;br /&gt;&lt;br /&gt;&lt;configuration&gt;&lt;br /&gt; &lt;appSettings/&gt;&lt;br /&gt; &lt;connectionStrings&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;add name="ConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\TeacherSystem\App_Data\db.mdb;Jet OLEDB:Database Password=123"&lt;br /&gt;   providerName="System.Data.OleDb" /&gt;&lt;br /&gt; &lt;/connectionStrings&gt;&lt;br /&gt;&lt;br /&gt; 2&lt;br /&gt;程序设计开始：&lt;br /&gt;&lt;br /&gt;1、按要求建立Access数据库及数据表&lt;br /&gt;&lt;br /&gt;2、编写数据库访问、操作的公用类，此类可以复用到以后开发的任何系统中&lt;br /&gt;&lt;br /&gt;（1）、新建一个C# 类库项目， 命名为“Com.LXJ”，设置项目属性：程序集名称、默认命名空间均为“Com.LXJ”&lt;br /&gt;&lt;br /&gt;（2）、在此项目目录下创建目录Database，新建C# 类文件ConnDbForAccess.cs 在Database目录下。&lt;br /&gt;&lt;br /&gt;              添加引用：System.Web.dll&lt;br /&gt;&lt;br /&gt;（3）、编写ConnDbForAccess.cs 的代码&lt;br /&gt;&lt;br /&gt;  using System;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.OleDb;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Configuration;&lt;br /&gt;&lt;br /&gt;namespace Com.LXJ.Database&lt;br /&gt;{&lt;br /&gt;    /// &lt;summary&gt;&lt;br /&gt;    /// conn 的摘要说明。&lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    public class ConnDbForAcccess&lt;br /&gt;    {&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 连接数据库字符串&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        private string connectionString;&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 存储数据库连接（保护类，只有由它派生的类才能访问）&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        protected OleDbConnection Connection;&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 构造函数：数据库的默认连接&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        public ConnDbForAcccess()&lt;br /&gt;        {&lt;br /&gt;            string connStr;&lt;br /&gt;            connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString.ToString();&lt;br /&gt;           // connStr = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString(); //从web.config配置中读取&lt;br /&gt;            connectionString = connStr;&lt;br /&gt;            //connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + HttpContext.Current.Request.PhysicalApplicationPath + connStr;&lt;br /&gt;           // connectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString();&lt;br /&gt;            //&lt;br /&gt;            Connection = new OleDbConnection(connectionString);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 构造函数：带有参数的数据库连接&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="newConnectionString"&gt;&lt;/param&gt;&lt;br /&gt;        public ConnDbForAcccess(string newConnectionString)&lt;br /&gt;        {&lt;br /&gt;            //connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + HttpContext.Current.Request.PhysicalApplicationPath + newConnectionString;&lt;br /&gt;            connectionString = newConnectionString;&lt;br /&gt;            Connection = new OleDbConnection(connectionString);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 获得连接字符串&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        public string ConnectionString&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return connectionString;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 执行SQL语句没有返回结果，如：执行删除、更新、插入等操作&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="strSQL"&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;returns&gt;操作成功标志&lt;/returns&gt;&lt;br /&gt;        public bool ExeSQL(string strSQL)&lt;br /&gt;        {&lt;br /&gt;            bool resultState = false;&lt;br /&gt;&lt;br /&gt;            Connection.Open();&lt;br /&gt;            OleDbTransaction myTrans = Connection.BeginTransaction();&lt;br /&gt;            OleDbCommand command = new OleDbCommand(strSQL, Connection, myTrans);&lt;br /&gt;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                command.ExecuteNonQuery();&lt;br /&gt;                myTrans.Commit();&lt;br /&gt;                resultState = true;&lt;br /&gt;            }&lt;br /&gt;            catch&lt;br /&gt;            {&lt;br /&gt;                myTrans.Rollback();&lt;br /&gt;                resultState = false;&lt;br /&gt;            }&lt;br /&gt;            finally&lt;br /&gt;            {&lt;br /&gt;                Connection.Close();&lt;br /&gt;            }&lt;br /&gt;            return resultState;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 执行SQL语句返回结果到DataReader中&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="strSQL"&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;returns&gt;dataReader&lt;/returns&gt;&lt;br /&gt;        private OleDbDataReader ReturnDataReader(string strSQL)&lt;br /&gt;        {&lt;br /&gt;            Connection.Open();&lt;br /&gt;            OleDbCommand command = new OleDbCommand(strSQL, Connection);&lt;br /&gt;            OleDbDataReader dataReader = command.ExecuteReader();&lt;br /&gt;            Connection.Close();&lt;br /&gt;&lt;br /&gt;            return dataReader;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 执行SQL语句返回结果到DataSet中&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="strSQL"&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;returns&gt;DataSet&lt;/returns&gt;&lt;br /&gt;        public DataSet ReturnDataSet(string strSQL)&lt;br /&gt;        {&lt;br /&gt;            Connection.Open();&lt;br /&gt;            DataSet dataSet = new DataSet();&lt;br /&gt;            OleDbDataAdapter OleDbDA = new OleDbDataAdapter(strSQL, Connection);&lt;br /&gt;            OleDbDA.Fill(dataSet, "objDataSet");&lt;br /&gt;&lt;br /&gt;            Connection.Close();&lt;br /&gt;            return dataSet;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// 执行一查询语句，同时返回查询结果数目&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="strSQL"&gt;&lt;/param&gt;&lt;br /&gt;        /// &lt;returns&gt;sqlResultCount&lt;/returns&gt;&lt;br /&gt;        public int ReturnSqlResultCount(string strSQL)&lt;br /&gt;        {&lt;br /&gt;            int sqlResultCount = 0;&lt;br /&gt;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                Connection.Open();&lt;br /&gt;                OleDbCommand command = new OleDbCommand(strSQL, Connection);&lt;br /&gt;                OleDbDataReader dataReader = command.ExecuteReader();&lt;br /&gt;&lt;br /&gt;                while (dataReader.Read())&lt;br /&gt;                {&lt;br /&gt;                    sqlResultCount++;&lt;br /&gt;                }&lt;br /&gt;                dataReader.Close();&lt;br /&gt;            }&lt;br /&gt;            catch&lt;br /&gt;            {&lt;br /&gt;                sqlResultCount = 0;&lt;br /&gt;            }&lt;br /&gt;            finally&lt;br /&gt;            {&lt;br /&gt;                Connection.Close();&lt;br /&gt;            }&lt;br /&gt;            return sqlResultCount;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    }//&lt;br /&gt;}//&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 好了，数据库访问、数据库操作的公用类完成了，详细代码意义大家自己看吧，这些属于C# 语法知识了，现在可以编译生成项目了，编译完后把项目的dll文件Com.LXJ.dll拷贝到Example项目下的bin目录中，然后在项目Example中引入Com.LXJ.dll即可。稍后介绍如何使用它，休息一下，喝口水，呵呵.....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-1560671156431922328?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/1560671156431922328/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=1560671156431922328' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1560671156431922328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1560671156431922328'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/cnetaccess.html' title='c#.net连接access操作类'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-1687114141124980043</id><published>2008-10-21T04:55:00.001-07:00</published><updated>2008-10-21T04:55:33.905-07:00</updated><title type='text'>C#用相对路径连接Access数据库的方法</title><content type='html'>先写出C#用绝对路径连接Access数据库方法的代码：&lt;br /&gt;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.OleDb;&lt;br /&gt;//使用Access或者Oracle数据库需要导入System.Data.OleDb命名空间&lt;br /&gt;&lt;br /&gt;......&lt;br /&gt;&lt;br /&gt;string strConnection="Provider=Microsoft.Jet.OleDb.4.0;";&lt;br /&gt;strConnection+=@"Data Source=C:\Authors.mdb";//这里用的是绝对路径&lt;br /&gt;&lt;br /&gt;OleDbConnection objConnection=new OleDbConnection(strConnection);&lt;br /&gt;&lt;br /&gt;objConnection.Open();&lt;br /&gt;objConnection.Close();&lt;br /&gt;&lt;br /&gt;......&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;Data Source是指明数据源的位置，如上代码使用的是绝对路径的方式，如果使用相对路径还需要用到 &lt;br /&gt;&lt;br /&gt;Page.MapPath 方法&lt;br /&gt;&lt;br /&gt;检索虚拟路径（绝对的或相对的）映射到的物理路径。&lt;br /&gt;&lt;br /&gt;[C#]&lt;br /&gt;public string MapPath(&lt;br /&gt;   string virtualPath&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;参数&lt;br /&gt;virtualPath &lt;br /&gt;表示虚拟路径的 String。 &lt;br /&gt;&lt;br /&gt;返回值&lt;br /&gt;与虚拟路径关联的物理路径。&lt;br /&gt;&lt;br /&gt;C#用相对路径连接Access数据库的方法代码：&lt;br /&gt;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.OleDb;&lt;br /&gt;&lt;br /&gt;......&lt;br /&gt;&lt;br /&gt;string strConnection="Provider=Microsoft.Jet.OleDb.4.0;";&lt;br /&gt;strConnection+=@"Data Source=MapPath("Authors.mdb");//这里是相对路径&lt;br /&gt;&lt;br /&gt;OleDbConnection objConnection=new OleDbConnection(strConnection);&lt;br /&gt;&lt;br /&gt;objConnection.Open();&lt;br /&gt;objConnection.Close();&lt;br /&gt;&lt;br /&gt;......&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　这个方法如同ASP中的Server.MapPath方法，原理是一样的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-1687114141124980043?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/1687114141124980043/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=1687114141124980043' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1687114141124980043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1687114141124980043'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/caccess_21.html' title='C#用相对路径连接Access数据库的方法'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-8072075642075105903</id><published>2008-10-21T04:54:00.004-07:00</published><updated>2008-10-21T04:55:11.348-07:00</updated><title type='text'>C#连接Access和SQL Server数据库</title><content type='html'>C#连接连接Access&lt;br /&gt;&lt;br /&gt;首先看一个例子代码片断:&lt;br /&gt;程序代码: &lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.OleDb;&lt;br /&gt;&lt;br /&gt;......&lt;br /&gt;&lt;br /&gt;string strConnection="Provider=Microsoft.Jet.OleDb.4.0;";&lt;br /&gt;strConnection+=@"Data Source=C:\BegASPNET\Northwind.mdb";&lt;br /&gt;&lt;br /&gt;OleDbConnection objConnection=new OleDbConnection(strConnection);&lt;br /&gt;&lt;br /&gt;......&lt;br /&gt;&lt;br /&gt;objConnection.Open();&lt;br /&gt;objConnection.Close();&lt;br /&gt;&lt;br /&gt;......&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;解释:&lt;br /&gt;&lt;br /&gt;　连接Access数据库需要导入额外的命名空间,所以有了最前面的两条using命令,这是必不可少的!&lt;br /&gt;&lt;br /&gt;　strConnection这个变量里存放的是连接数据库所需要的连接字符串,他指定了要使用的数据提供者和要使用的数据源.&lt;br /&gt;&lt;br /&gt;　"Provider=Microsoft.Jet.OleDb.4.0;"是指数据提供者,这里使用的是Microsoft Jet引擎,也就是Access中的数据引擎,asp.net就是靠这个和Access的数据库连接的.&lt;br /&gt;&lt;br /&gt;　"Data Source=C:\BegASPNET\Northwind.mdb"是指明数据源的位置,他的标准形式是"Data Source=MyDrive:MyPath\MyFile.MDB".&lt;br /&gt;&lt;br /&gt;ps:&lt;br /&gt;　1."+="后面的"@"符号是防止将后面字符串中的"\"解析为转义字符.&lt;br /&gt;　2.如果要连接的数据库文件和当前文件在同一个目录下,还可以使用如下的方法连接:&lt;br /&gt;　　strConnection+="Data Source=";&lt;br /&gt;　　strConnection+=MapPath("Northwind.mdb");&lt;br /&gt;　　这样就可以省得你写一大堆东西了!&lt;br /&gt;　3.要注意连接字符串中的参数之间要用分号来分隔.&lt;br /&gt;&lt;br /&gt;　"OleDbConnection objConnection=new OleDbConnection(strConnection);"这一句是利用定义好的连接字符串来建立了一个链接对象,以后对数据库的操作我们都要和这个对象打交道.&lt;br /&gt;&lt;br /&gt;　"objConnection.Open();"这用来打开连接.至此,与Access数据库的连接完成.其余操作(插入,删除...)请参阅相关书籍&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;C#连接SQL Server&lt;br /&gt;&lt;br /&gt;例子代码片断:&lt;br /&gt;程序代码: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.SqlClient;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;string strConnection="user id=sa;password=;";&lt;br /&gt;strConnection+="initial catalog=Northwind;Server=YourSQLServer;";&lt;br /&gt;strConnection+="Connect Timeout=30";&lt;br /&gt;&lt;br /&gt;SqlConnection objConnection=new SqlConnection(strConnection);&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;objConnection.Open();&lt;br /&gt;objConnection.Close();&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;解释:&lt;br /&gt;&lt;br /&gt;连接SQL Server数据库的机制与连接Access的机制没有什么太大的区别,只是改变了Connection对象和连接字符串中的不同参数.&lt;br /&gt;&lt;br /&gt;首先,连接SQL Server使用的命名空间不是"System.Data.OleDb",而是"System.Data.SqlClient".&lt;br /&gt;&lt;br /&gt;其次就是他的连接字符串了,我们一个一个参数来介绍(注意:参数间用分号分隔):&lt;br /&gt;　"user id=sa":连接数据库的验证用户名为sa.他还有一个别名"uid",所以这句我们还可以写成"uid=sa".&lt;br /&gt;　"password=":连接数据库的验证密码为空.他的别名为"pwd",所以我们可以写为"pwd=".&lt;br /&gt;　这里注意,你的SQL Server必须已经设置了需要用户名和密码来登录,否则不能用这样的方式来登录.如果你的SQL Server设置为Windows登录,那么在这里就不需要使用"user id"和"password"这样的方式来登录,而需要使用"Trusted_Connection=SSPI"来进行登录.&lt;br /&gt;　"initial catalog=Northwind":使用的数据源为"Northwind"这个数据库.他的别名为"Database",本句可以写成"Database=Northwind".&lt;br /&gt;　"Server=YourSQLServer":使用名为"YourSQLServer"的服务器.他的别名为"Data Source","Address","Addr".如果使用的是本地数据库且定义了实例名,则可以写为"Server=(local)\实例名";如果是远程服务器,则将"(local)"替换为远程服务器的名称或IP地址.&lt;br /&gt;　"Connect Timeout=30":连接超时时间为30秒.&lt;br /&gt;&lt;br /&gt;　在这里,建立连接对象用的构造函数为:SqlConnection.&lt;br /&gt;&lt;br /&gt;　其余的就和Access没有什么区别了!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-8072075642075105903?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/8072075642075105903/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=8072075642075105903' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8072075642075105903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8072075642075105903'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/caccesssql-server.html' title='C#连接Access和SQL Server数据库'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-2496444107832412698</id><published>2008-10-21T04:54:00.003-07:00</published><updated>2008-10-21T04:54:49.580-07:00</updated><title type='text'>操作ACCESS数据库（创建,压缩,备份,恢复）</title><content type='html'>C#压缩和修复Access数据库(这部分是劳动人民翻译的)&lt;br /&gt;介绍&lt;br /&gt;    下面这段C# 代码可以用来压缩和修复Access数据库,不管它是一个简单的".mdb"ACCESS数据库还是一个".mdw"网络共享数据库,这个过程和你在用MS Access应用程序中使用的"工具-数据库实用工具-压缩和修复"时执行的操作完全一样.实例代码使用了"迟绑定"(运行中在内存中建立COM对象),这样就不需要在工程中加入COM引用了,也不需要在PC上安装MS Access应用程序.只需要一个Jet引擎(Jet引擎包含在MDAC安装包中,在Windows NT4以后的版本中,系统已经自带了这个引擎).&lt;br /&gt;&lt;br /&gt;C#操作ACCESS数据库的背景&lt;br /&gt;   不知你是否也厌烦了在工程中加入复杂的COM库引用,但我相信这个纯.NET代码将省去额外的交互操作, RCWs和COM引用.基本上,由于系统中安装的Microsoft类库的不同(例如:MS Office Object Library 9,10,11等等),我们也不知道用户PC中安装的Office版本,所以我们要通过ProgID来访问COM对象,而不能用CLSID.例如,当调用"Excel.Application",时,得到的是Excel,而不管系统中安装MS Office的版本,当在代码中加入"MS Excel 10 Object library"引用时,其实只是给应用程序加入了一个非常受限制的功能.所以我们使用System.Reflection和迟绑定.&lt;br /&gt;1. 实例代码&lt;br /&gt;只需调用CompactAccessDB函数即可压缩和修复目标数据库.&lt;br /&gt;&lt;br /&gt;2. 参数:&lt;br /&gt;connectionString – 用来连接到Access数据库. &lt;br /&gt;Mdwfilename –要压缩的MDB文件的全名(路径+文件名). &lt;br /&gt;由于Jet引擎的限制,执行此方法压缩Access数据库会把结果生成为一个新文件,所以我们要还需要把这个新的Access文件拷贝到目的位置覆盖原来未压缩文件.&lt;br /&gt;&lt;br /&gt;当调用此方法时请确认被压缩数据库无打开的连接.&lt;br /&gt;&lt;br /&gt;C#操作ACCESS数据库 代码如下:&lt;br /&gt;&lt;br /&gt;/// MBD compact method © 2004 Alexander Youmashev&lt;br /&gt;/// !!IMPORTANT!!&lt;br /&gt;/// !make sure there's no open connections&lt;br /&gt;///    to your db before calling this method!&lt;br /&gt;/// !!IMPORTANT!!&lt;br /&gt;/// &lt;br /&gt;/// &lt;br /&gt;connection string to your db&lt;br /&gt;/// &lt;br /&gt;FULL name&lt;br /&gt;///     of an MDB file you want to compress.&lt;br /&gt;Public static void CompactAccessDB(string connectionString, string mdwfilename)&lt;br /&gt;{&lt;br /&gt;    object[] oParams;&lt;br /&gt;&lt;br /&gt;//create an inctance of a Jet Replication Object&lt;br /&gt;    object objJRO = &lt;br /&gt;      Activator.CreateInstance(Type.GetTypeFromProgID(\"JRO.JetEngine\"));&lt;br /&gt;&lt;br /&gt;//filling Parameters array&lt;br /&gt;    //cnahge \"Jet OLEDB:Engine Type=5\" to an appropriate value&lt;br /&gt;    // or leave it as is if you db is JET4X format (access 2000,2002)&lt;br /&gt;    //(yes, jetengine5 is for JET4X, no misprint here)&lt;br /&gt;&lt;br /&gt;oParams = new object[] { &lt;br /&gt;        connectionString,&lt;br /&gt;        \"Provider=Microsoft.Jet.OLEDB.4.0;Data\" + &lt;br /&gt;        \" Source=C:tempdb.mdb;Jet OLEDB:Engine Type=5\"};&lt;br /&gt;&lt;br /&gt;//invoke a CompactDatabase method of a JRO object&lt;br /&gt;    //pass Parameters array&lt;br /&gt;&lt;br /&gt;objJRO.GetType().InvokeMember(\"CompactDatabase\", &lt;br /&gt;        System.Reflection.BindingFlags.InvokeMethod,&lt;br /&gt;        null,&lt;br /&gt;        objJRO,&lt;br /&gt;        oParams);&lt;br /&gt;&lt;br /&gt;//database is compacted now&lt;br /&gt;    //to a new file C:tempdb.mdw&lt;br /&gt;    //let's copy it over an old one and delete it&lt;br /&gt;&lt;br /&gt;System.IO.File.Delete(mdwfilename);&lt;br /&gt;    System.IO.File.Move(\"C:tempdb.mdb\", mdwfilename);&lt;br /&gt;    //clean up (just in case)&lt;br /&gt;    System.Runtime.InteropServices.Marshal.ReleaseComObject(objJRO);&lt;br /&gt;    objJRO=null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;教你一种更绝的：如何在没有Microsoft Access用.NET操作ACCESS数据库？(创建,压缩,备份,恢复组件) （这部分可不是翻译的）&lt;br /&gt;&lt;br /&gt;手头没有Microsoft Access，C#如何操作ACCESS数据库？&lt;br /&gt;写一个小型程序,手头没有Microsoft Access,如何建立数据库,一切依然简单.&lt;br /&gt;首先引用C:Program FilesCommon FilesSystemadomsadox.dll,该DLL包含ADOX命名空间;&lt;br /&gt;接着引用C:Program FilesCommon FilesSystemadomsjro.dll,该DLL包含JRO命名空间&lt;br /&gt;注意:如，导入dll不成功，手动把com组件 导入为 .net组件，在用vs.net工具导入 &lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.IO; &lt;br /&gt;using ADOX; //该命名空间包含创建ACCESS的类(方法)--解决方案 ==&gt; 引用 ==&gt; 添加引用 ==&gt; 游览找到.dll&lt;br /&gt;using JRO; //该命名空间包含压缩ACCESS的类(方法)&lt;br /&gt;&lt;br /&gt;public class Access&lt;br /&gt;{&lt;br /&gt;    ///根据指定的文件名称创建ACCESS数据库&lt;br /&gt;    ///mdbPath:要创件的ACCESS绝对路径&lt;br /&gt;    public void Create( string mdbPath )&lt;br /&gt;    {&lt;br /&gt;        if( File.Exists(mdbPath) ) //检查数据库是否已存在&lt;br /&gt;        {&lt;br /&gt;            throw new Exception(\"目标数据库已存在,无法创建\");&lt;br /&gt;        }&lt;br /&gt;        // 可以加上密码,这样创建后的数据库必须输入密码后才能打开&lt;br /&gt;        mdbPath = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\" + mdbPath;&lt;br /&gt;        // 创建一个CatalogClass对象的实例,&lt;br /&gt;        ADOX.CatalogClass cat = new ADOX.CatalogClass();&lt;br /&gt;        // 使用CatalogClass对象的Create方法创建ACCESS数据库&lt;br /&gt;        cat.Create(mdbPath);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ///压缩修复ACCESS数据库,mdbPath为数据库绝对路径&lt;br /&gt;    public void Compact( string mdbPath )&lt;br /&gt;    {&lt;br /&gt;        if( !File.Exists(mdbPath) ) //检查数据库是否已存在&lt;br /&gt;        {&lt;br /&gt;            throw new Exception(\"目标数据库不存在,无法压缩\");&lt;br /&gt;        }&lt;br /&gt;        //声明临时数据库的名称&lt;br /&gt;        string temp = DateTime.Now.Year.ToString();&lt;br /&gt;        temp += DateTime.Now.Month.ToString();&lt;br /&gt;        temp += DateTime.Now.Day.ToString();&lt;br /&gt;        temp += DateTime.Now.Hour.ToString();&lt;br /&gt;        temp += DateTime.Now.Minute.ToString();&lt;br /&gt;        temp += DateTime.Now.Second.ToString() + \".bak\";&lt;br /&gt;        temp = mdbPath.Substring(0, mdbPath.LastIndexOf(\"\")+1) + temp;&lt;br /&gt;        //定义临时数据库的连接字符串&lt;br /&gt;        temp2 = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\" + temp;&lt;br /&gt;        //定义目标数据库的连接字符串&lt;br /&gt;        mdbPath2 = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\" + mdbPath;&lt;br /&gt;        //创建一个JetEngineClass对象的实例&lt;br /&gt;        JRO.JetEngineClass jt = new JRO.JetEngineClass();&lt;br /&gt;        //使用JetEngineClass对象的CompactDatabase方法压缩修复数据库&lt;br /&gt;        jt.CompactDatabase( mdbPath2, temp2 );&lt;br /&gt;        //拷贝临时数据库到目标数据库(覆盖)&lt;br /&gt;        File.Copy( temp, mdbPath, true );&lt;br /&gt;        //最后删除临时数据库&lt;br /&gt;        File.Delete( temp ); &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// 备份数据库,mdb1,源数据库绝对路径; mdb2: 目标数据库绝对路径 &lt;br /&gt;    public void Backup( string mdb1, string mdb2 )&lt;br /&gt;    {&lt;br /&gt;        if( !File.Exists(mdb1) )&lt;br /&gt;        {&lt;br /&gt;            throw new Exception(\"源数据库不存在\");&lt;br /&gt;        }&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            File.Copy( mdb1, mdb2, true );&lt;br /&gt;        }&lt;br /&gt;        catch( IOException ixp )&lt;br /&gt;        {&lt;br /&gt;            throw new Exception(ixp.ToString());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ///恢复数据库,mdb1为备份数据库绝对路径,mdb2为当前数据库绝对路径&lt;br /&gt;    public void Recover( string mdb1, string mdb2 )&lt;br /&gt;    {&lt;br /&gt;        if( !File.Exists(mdb1) )  &lt;br /&gt;        {&lt;br /&gt;            throw new Exception(\"备份数据库不存在\"); &lt;br /&gt;        }&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            File.Copy( mdb1, mdb2, true );&lt;br /&gt;        }&lt;br /&gt;        catch( IOException ixp )&lt;br /&gt;        {&lt;br /&gt;            throw new Exception(ixp.ToString());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-2496444107832412698?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/2496444107832412698/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=2496444107832412698' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2496444107832412698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/2496444107832412698'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/access.html' title='操作ACCESS数据库（创建,压缩,备份,恢复）'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-108049500193373240</id><published>2008-10-21T04:54:00.001-07:00</published><updated>2008-10-21T04:54:22.622-07:00</updated><title type='text'>在C#中调用VBScript、javascript等脚本的实现</title><content type='html'>以前在做工作流(workflow)项目的时候，里面有一项就是在用户制定流程定义时可以编写脚本来控制活动的跳转，而这些脚本定义后存在数据库中，当流程启动的时候，工作流引擎会控制活动执行顺序，串型的两个活动比较简单，但有的活动到下一个活动有条件判断，或者存在多个分支，简单的还好，只要在数据库表中加个字段就可以实现，复杂一点的就需要通过脚本实现了。当时经验不够，几天都没找到快速的解决办法，想自己写一个自定义脚本引擎没有把握，而且时间也不够，还是在网上找找看吧，花了一些时间，还是找到了一个自认为比较好的解决办法，写出来同大家分享。 &lt;br /&gt;下面通过两部分来说明实现以及应用。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;一．使用MSScriptControl &lt;br /&gt;&lt;br /&gt;到微软的网站上下载Windows Script Control，它是一个ActiveX(R) 控件，所以在.NET中使用我Interop了一下。下载安装完成后，新建一个C#的Windows应用程序项目，在解决方案资源管理器中选中引用节点，右键点击选择添加引用菜单，弹出添加引用对话框，单击浏览找到安装Windows Script Control的目录，选取msscript.ocx文件确定。那么在引用节点下会增加一个MSScriptControl组件，下面是他Interop后的所有对象。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ScriptControl 对支持 ActiveX(TM) Script 的宿主 Script 引擎提供简单接口。接下来我们对被转化成ScriptControlClass类的ScriptControl的属性和方法进行一些说明。 &lt;br /&gt;&lt;br /&gt;属性 &lt;br /&gt;&lt;br /&gt;AllowUI 属性：应用于 ScriptControl 本身或 Scirpt 引擎显示的用户界面元素，可读写。 &lt;br /&gt;&lt;br /&gt;CodeObject 属性：返回对象，该对象用于调用指定模块的公用成员。只读。 &lt;br /&gt;&lt;br /&gt;Error 属性：返回 Error 对象，其中包含所发生的最后一个错误的相关详细信息。只读。 &lt;br /&gt;&lt;br /&gt;Language 属性：设置或返回正在使用的 Script 语言名称。可读写。 &lt;br /&gt;&lt;br /&gt;Modules 属性：为 ScriptControl 对象返回模块集合。只读。 &lt;br /&gt;&lt;br /&gt;Procedures 属性：返回在指定模块中定义的过程集合。只读。 &lt;br /&gt;&lt;br /&gt;SitehWnd 属性：设置或返回窗口的 hWnd，通过执行 Script 代码，此窗口用于显示对话框和其他用户界面元素。可读写。 &lt;br /&gt;&lt;br /&gt;State 属性：设置或返回 ScriptControl 对象的模式。可读写。 &lt;br /&gt;&lt;br /&gt;Timeout 属性：设置或返回时间（毫秒），此时间后用户可选择中止 Script 代码的执行或允许代码继续执行。可读写。 &lt;br /&gt;&lt;br /&gt;UseSafeSubset 属性：设置或返回 Boolean 值，指明宿主应用程序是否有保密性要求。如果宿主应用程序需要安全控制，则 UseSafeSubset 为 True，否则为 False。可读写。 &lt;br /&gt;&lt;br /&gt;方法 &lt;br /&gt;&lt;br /&gt;AddCode 方法：向模块添加指定代码。可多次调用 AddCode 方法。 &lt;br /&gt;&lt;br /&gt;AddObject 方法：使主机对象模型对 Script 引擎可用。 &lt;br /&gt;&lt;br /&gt;Eval 方法：计算表达式并返回结果。 &lt;br /&gt;&lt;br /&gt;ExecuteStatement 方法：执行指定的语句。 &lt;br /&gt;&lt;br /&gt;Reset 方法：放弃所有已经添加到 ScriptControl 中的 Script 代码和对象。 &lt;br /&gt;&lt;br /&gt;Run 方法：运行指定过程。 &lt;br /&gt;&lt;br /&gt;事件 &lt;br /&gt;&lt;br /&gt;Error 事件：出现运行时错误时，发生此事件。 &lt;br /&gt;&lt;br /&gt;Timeout 事件：当超出了 Timeout 属性指定的时间且用户在结果对话框中选定了 End 时，发生此事件。 &lt;br /&gt;&lt;br /&gt;补充几点 &lt;br /&gt;&lt;br /&gt;AllowUI 属性如果设置为false，则显示对话框之类的语句不起作用，如在 VBScript 中MsgBox 语句，javascript中的alert等，并且如果执行的脚本超出TimeOut设置的毫秒数，也不会跳出超出时间提醒的对话框，反之则相反；重新设置 Language 属性会清空AddCode加载的代码；对于TimeOut属性，发生超时时，ScriptControl 检查对象的 AllowUI 属性，确定是否允许显示用户界面元素。 &lt;br /&gt;&lt;br /&gt;如果读者需要更详细的了解，可以查看MSDN文档。 &lt;br /&gt;&lt;br /&gt;为了使控件更容易使用，我用一个ScriptEngine类包装了一下，下面是完整代码： &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;using System; &lt;br /&gt;&lt;br /&gt;using MSScriptControl; &lt;br /&gt;&lt;br /&gt;using System.Text; &lt;br /&gt;&lt;br /&gt;namespace ZZ &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;&lt;br /&gt;/// 脚本类型 &lt;br /&gt;&lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;&lt;br /&gt;public enum ScriptLanguage &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;&lt;br /&gt;/// JScript脚本语言 &lt;br /&gt;&lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;&lt;br /&gt;JScript, &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;&lt;br /&gt;/// VBscript脚本语言 &lt;br /&gt;&lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;&lt;br /&gt;VBscript, &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;&lt;br /&gt;/// javascript脚本语言 &lt;br /&gt;&lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;&lt;br /&gt;javascript &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;&lt;br /&gt;/// 脚本运行错误代理 &lt;br /&gt;&lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;&lt;br /&gt;public delegate void RunErrorHandler(); &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;&lt;br /&gt;/// 脚本运行超时代理 &lt;br /&gt;&lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;&lt;br /&gt;public delegate void RunTimeoutHandler(); &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;&lt;br /&gt;/// ScriptEngine类 &lt;br /&gt;&lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;&lt;br /&gt;public class ScriptEngine &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;private ScriptControl msc; &lt;br /&gt;&lt;br /&gt;//定义脚本运行错误事件 &lt;br /&gt;&lt;br /&gt;public event RunErrorHandler RunError; &lt;br /&gt;&lt;br /&gt;//定义脚本运行超时事件 &lt;br /&gt;&lt;br /&gt;public event RunTimeoutHandler RunTimeout; &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;&lt;br /&gt;///构造函数 &lt;br /&gt;&lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;&lt;br /&gt;public ScriptEngine():this(ScriptLanguage.VBscript) &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;&lt;br /&gt;/// 构造函数 &lt;br /&gt;&lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;&lt;br /&gt;/// &lt;param name="language"&gt;脚本类型&lt;/param&gt; &lt;br /&gt;&lt;br /&gt;public ScriptEngine(ScriptLanguage language) &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;this.msc = new ScriptControlClass(); &lt;br /&gt;&lt;br /&gt;this.msc.UseSafeSubset = true; &lt;br /&gt;&lt;br /&gt;this.msc.Language = language.ToString(); &lt;br /&gt;&lt;br /&gt;((DScriptControlSource_Event)this.msc).Error += new DScriptControlSource_ErrorEventHandler(ScriptEngine_Error); &lt;br /&gt;&lt;br /&gt;((DScriptControlSource_Event)this.msc).Timeout += new DScriptControlSource_TimeoutEventHandler(ScriptEngine_Timeout); &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;&lt;br /&gt;/// 运行Eval方法 &lt;br /&gt;&lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;&lt;br /&gt;/// &lt;param name="expression"&gt;表达式&lt;/param&gt; &lt;br /&gt;&lt;br /&gt;/// &lt;param name="codeBody"&gt;函数体&lt;/param&gt; &lt;br /&gt;&lt;br /&gt;/// &lt;returns&gt;返回值object&lt;/returns&gt; &lt;br /&gt;&lt;br /&gt;public object Eval(string expression,string codeBody) &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;msc.AddCode(codeBody); &lt;br /&gt;&lt;br /&gt;return msc.Eval(expression); &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;&lt;br /&gt;/// 运行Eval方法 &lt;br /&gt;&lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;&lt;br /&gt;/// &lt;param name="language"&gt;脚本语言&lt;/param&gt; &lt;br /&gt;&lt;br /&gt;/// &lt;param name="expression"&gt;表达式&lt;/param&gt; &lt;br /&gt;&lt;br /&gt;/// &lt;param name="codeBody"&gt;函数体&lt;/param&gt; &lt;br /&gt;&lt;br /&gt;/// &lt;returns&gt;返回值object&lt;/returns&gt; &lt;br /&gt;&lt;br /&gt;public object Eval(ScriptLanguage language,string expression,string codeBody) &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;if(this.Language != language) &lt;br /&gt;&lt;br /&gt;this.Language = language; &lt;br /&gt;&lt;br /&gt;return Eval(expression,codeBody); &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt; &lt;br /&gt;&lt;br /&gt;/// 运行Run方法 &lt;br /&gt;&lt;br /&gt;/// &lt;/summary&gt; &lt;br /&gt;&lt;br /&gt;/// &lt;param name="mainFunctionName"&gt;入口函数名称&lt;/param&gt; &lt;br /&gt;&lt;br /&gt;/// &lt;param name="parameters"&gt;参数&lt;/param&gt; &lt;br /&gt;&lt;br /&gt;/// &lt;param name="codeBody"&gt;函数体&lt;/param&gt; &lt;br /&gt;&lt;br /&gt;/// &lt;returns&gt;返回值object&lt;/returns&gt; &lt;br /&gt;&lt;br /&gt;public object Run(string mainFunctionName,object[] parameters,string codeBody) &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;this.msc.AddCode(codeBody); &lt;br /&gt;&lt;br /&gt;return msc.Run(mainFunctionName,ref para&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-108049500193373240?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/108049500193373240/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=108049500193373240' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/108049500193373240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/108049500193373240'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/cvbscriptjavascript.html' title='在C#中调用VBScript、javascript等脚本的实现'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-4435029757334377916</id><published>2008-10-21T04:53:00.003-07:00</published><updated>2008-10-21T04:53:59.531-07:00</updated><title type='text'>c#数据库连接字符串集合</title><content type='html'>(一)常用连接:&lt;br /&gt;1.使用SqlConnection对象:&lt;br /&gt;public void SqlConnectionOpen()&lt;br /&gt;{&lt;br /&gt;SqlConnection conn= new SqlConnection();&lt;br /&gt;conn.ConnectionString = "user id=sa;password=;initial catalog=northwind;datasource=localhost;connect Timeout=20";&lt;br /&gt;conn.Open();&lt;br /&gt;}&lt;br /&gt;2.使用OleDbConnection对象:&lt;br /&gt;public void OleDBConnectionOpen()&lt;br /&gt;{&lt;br /&gt;OleDBConnection conn = new OleDbconnection();&lt;br /&gt;conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:\Customer.mdb";&lt;br /&gt;conn.Open();&lt;br /&gt;}&lt;br /&gt;(二)其它:&lt;br /&gt;1.ODBC连接Access本地数据库&lt;br /&gt;conGoodDay.Open("Driver={Microsoft Access Driver(*.mdb)};"+"Dbq=C:\a.mdb;"+&lt;br /&gt;"Uid=Admin;"+"Pwd=;");&lt;br /&gt;2.ODBC连接Access系统数据库&lt;br /&gt;conGoodDay.Open("Driver={Microsoft Access Driver(*.mdb)};"+"Dbq=C:\a.mdb;"+&lt;br /&gt;"SystemDB=Admin;"+"Pwd=;");&lt;br /&gt;3.ODBC连接Access系统数据库&lt;br /&gt;conGoodDay.Open("Driver={Microsoft Access Driver(*.mdb)};"+"Dbq=\\server\share\a.mdb;");&lt;br /&gt;4.ODBC连接Excel系统数据库&lt;br /&gt;conGoodDay.Open("Driver={Microsoft Access Driver(*.xls)};"+"DriverId=790;"+&lt;br /&gt;"Dbq=C:\a.xls;"+"DefaultDir=c:\somepath;");&lt;br /&gt;5.ODBC连接Oracle系统数据库&lt;br /&gt;conGoodDay.Open("Driver={Microsoft ODBC for oracle};"+"Server=OracleServer.world;"+&lt;br /&gt;"Uid=Admin;"+"Pwd=password;");&lt;br /&gt;6.ODBC连接Sql Servr&lt;br /&gt;conGoodDay.Open("Driver={Sql Server};"+"Server=myServer;"+"Database=myDatabaseName;"&lt;br /&gt;"Uid=Admin;"+"Pwd=password;");&lt;br /&gt;7.ODBC连接Visual FoxPro&lt;br /&gt;conGoodDay.Open("Driver={Microsoft Visual FoxPro Driver};"+&lt;br /&gt;"SourceType=DBC;"+"SourceDB=c:a.dbc;"+"Exclusive=No;");&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-4435029757334377916?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/4435029757334377916/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=4435029757334377916' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4435029757334377916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4435029757334377916'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_29.html' title='c#数据库连接字符串集合'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-8829589193380986221</id><published>2008-10-21T04:53:00.001-07:00</published><updated>2008-10-21T04:53:33.554-07:00</updated><title type='text'>数据库连接字符串大全</title><content type='html'>SQL Server &lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard Security:&lt;br /&gt;&lt;br /&gt;"Driver={SQL Server};Server=Aron1;Database=pubs;Uid=sa;Pwd=asdasd;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Trusted connection:&lt;br /&gt;&lt;br /&gt;"Driver={SQL Server};Server=Aron1;Database=pubs;Trusted_Connection=yes;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Prompt for username and password:&lt;br /&gt;&lt;br /&gt;oConn.Properties("Prompt") = adPromptAlways&lt;br /&gt;oConn.Open "Driver={SQL Server};Server=Aron1;DataBase=pubs;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; OLE DB, OleDbConnection (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard Security:&lt;br /&gt;&lt;br /&gt;"Provider=sqloledb;Data Source=Aron1;Initial Catalog=pubs;User Id=sa;Password=asdasd;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Trusted Connection:&lt;br /&gt;&lt;br /&gt;"Provider=sqloledb;Data Source=Aron1;Initial Catalog=pubs;Integrated Security=SSPI;" &lt;br /&gt;(use serverName\instanceName as Data Source to use an specifik SQLServer instance, only SQLServer2000)&lt;br /&gt; Prompt for username and password:&lt;br /&gt;&lt;br /&gt;oConn.Provider = "sqloledb"&lt;br /&gt;oConn.Properties("Prompt") = adPromptAlways&lt;br /&gt;oConn.Open "Data Source=Aron1;Initial Catalog=pubs;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Connect via an IP address:&lt;br /&gt;&lt;br /&gt;"Provider=sqloledb;Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog= pubs;UserID=sa;Password=asdasd;" &lt;br /&gt;(DBMSSOCN=TCP/IP instead of Named Pipes, at the end of the Data Source is the port to use (1433 is the default))&lt;br /&gt; SqlConnection (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard Security:&lt;br /&gt;&lt;br /&gt;"Data Source=Aron1;Initial Catalog= pubs;UserId=sa;Password=asdasd;" &lt;br /&gt;   - or - &lt;br /&gt;"Server=Aron1;Database=pubs;UserID=sa;Password=asdasd;Trusted_Connection=False" &lt;br /&gt;   (booth connection strings produces the same result)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Trusted Connection:&lt;br /&gt;&lt;br /&gt;"Data Source=Aron1;Initial Catalog=pubs;Integrated Security=SSPI;" &lt;br /&gt;   - or -&lt; BR&gt;"Server=Aron1;Database=pubs;Trusted_Connection=True;" &lt;br /&gt;   (booth connection strings produces the same result)&lt;br /&gt;&lt;br /&gt;(use serverName\instanceName as Data Source to use an specifik SQLServer instance, only SQLServer2000)&lt;br /&gt; Connect via an IP address:&lt;br /&gt;&lt;br /&gt;"Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog= pubs;UserID=sa;Password=asdasd;" &lt;br /&gt;(DBMSSOCN=TCP/IP instead of Named Pipes, at the end of the Data Source is the port to use (1433 is the default))&lt;br /&gt; Declare the SqlConnection:&lt;br /&gt;&lt;br /&gt;C#:&lt;br /&gt;using System.Data.SqlClient;&lt;br /&gt;SqlConnection oSQLConn = new SqlConnection();&lt;br /&gt;oSQLConn.ConnectionString="my connectionstring";&lt;br /&gt;oSQLConn.Open();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;VB.NET:&lt;br /&gt;Imports System.Data.SqlClient&lt;br /&gt;Dim oSQLConn As SqlConnection = New SqlConnection()&lt;br /&gt;oSQLConn.ConnectionString="my connectionstring"&lt;br /&gt;oSQLConn.Open() &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Data Shape &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; MS Data Shape&lt;br /&gt;"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=Aron1;Initial Catalog= pubs;UserID=sa;Password=asdasd;" &lt;br /&gt;Want to learn data shaping? Check out 4GuyfFromRolla's great article about Data Shaping &gt;&gt;&lt;br /&gt; Read more &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; How to define wich network protocol to use&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;"Provider=sqloledb;Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog= pubs;UserID=sa;Password=asdasd;" &lt;br /&gt;&lt;br /&gt;Name Network library &lt;br /&gt;dbnmpntw Win32 Named Pipes &lt;br /&gt;dbmssocn Win32 Winsock TCP/IP &lt;br /&gt;dbmsspxn Win32 SPX/IPX &lt;br /&gt;dbmsvinn Win32 Banyan Vines &lt;br /&gt;dbmsrpcn Win32 Multi-Protocol (Windows RPC) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Important note! &lt;br /&gt;When connecting through the SQLOLEDB provider use the syntax Network Library=dbmssocn&lt;br /&gt;and when connecting through MSDASQL provider use the syntax Network=dbmssocn &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; All SqlConnection connectionstring properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This table shows all connectionstring properties for the ADO.NET SqlConnection object. Most of the properties are also used in ADO. All properties and descriptions is from msdn. &lt;br /&gt;&lt;br /&gt;Name Default Description &lt;br /&gt;Application Name   The name of the application, or '.Net SqlClient Data Provider' if no application name is provided. &lt;br /&gt;AttachDBFilename&lt;br /&gt;-or-&lt;br /&gt;extended properties&lt;br /&gt;-or-&lt;br /&gt;Initial File Name   The name of the primary file, including the full path name, of an attachable database. The database name must be specified with the keyword 'database'. &lt;br /&gt;Connect Timeout&lt;br /&gt;-or-&lt;br /&gt;Connection Timeout 15 The length of time (in seconds) to wait for a connection to the server before terminating the attempt and generating an error. &lt;br /&gt;Connection Lifetime 0 When a connection is returned to the pool, its creation time is compared with the current time, and the connection is destroyed if that time span (in seconds) exceeds the value specified by connection lifetime. Useful in clustered configurations to force load balancing between a running server and a server just brought on-line. &lt;br /&gt;Connection Reset 'true' Determines whether the database connection is reset when being removed from the pool. Setting to 'false' avoids making an additional server round-trip when obtaining a connection, but the programmer must be aware that the connection state is not being reset. &lt;br /&gt;Current Language   The SQL Server Language record name. &lt;br /&gt;Data Source&lt;br /&gt;-or-&lt;br /&gt;Server&lt;br /&gt;-or-&lt;br /&gt;Address&lt;br /&gt;-or-&lt;br /&gt;Addr&lt;br /&gt;-or-&lt;br /&gt;Network Address   The name or network address of the instance of SQL Server to which to connect. &lt;br /&gt;Enlist 'true' When true, the pooler automatically enlists the connection in the creation thread's current transaction context. &lt;br /&gt;Initial Catalog&lt;br /&gt;-or-&lt;br /&gt;Database   The name of the database. &lt;br /&gt;Integrated Security&lt;br /&gt;-or-&lt;br /&gt;Trusted_Connection 'false' Whether the connection is to be a secure connection or not. Recognized values are 'true', 'false', and 'sspi', which is equivalent to 'true'. &lt;br /&gt;Max Pool Size 100 The maximum number of connections allowed in the pool. &lt;br /&gt;Min Pool Size 0 The minimum number of connections allowed in the pool. &lt;br /&gt;Network Library&lt;br /&gt;-or-&lt;br /&gt;Net 'dbmssocn' The network library used to establish a connection to an instance of SQL Server. Supported values include dbnmpntw (Named Pipes), dbmsrpcn (Multiprotocol), dbmsadsn (Apple Talk), dbmsgnet (VIA), dbmsipcn (Shared Memory) and dbmsspxn (IPX/SPX), and dbmssocn (TCP/IP). &lt;br /&gt;The corresponding network DLL must be installed on the system to which you connect. If you do not specify a network and you use a local server (for example, "." or "(local)"), shared memory is used. &lt;br /&gt;Packet Size 8192 Size in bytes of the network packets used to communicate with an instance of SQL Server. &lt;br /&gt;Password&lt;br /&gt;-or-&lt;br /&gt;Pwd   The password for the SQL Server account logging on. &lt;br /&gt;Persist Security Info 'false' When set to 'false', security-sensitive information, such as the password, is not returned as part of the connection if the connection is open or has ever been in an open state. Resetting the connection string resets all connection string values including the password. &lt;br /&gt;Pooling 'true' When true, the SQLConnection object is drawn from the appropriate pool, or if necessary, is created and added to the appropriate pool. &lt;br /&gt;User ID   The SQL Server login account. &lt;br /&gt;Workstation ID the local computer name The name of the workstation connecting to SQL Server. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note &lt;br /&gt;Use ; to separate each property.&lt;br /&gt;If a name occurs more than once, the value from the last one in the connectionstring will be used.&lt;br /&gt;If you are building your connectionstring in your app using values from user input fields, make sure the user can't change the connectionstring by inserting an additional property with another value within the user value. &lt;br /&gt; Access &lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard Security:&lt;br /&gt;&lt;br /&gt;"Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\mydatabase.mdb;Uid=Admin;Pwd=;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Workgroup:&lt;br /&gt;&lt;br /&gt;"Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\mydatabase.mdb;SystemDB=C:\mydatabase.mdw;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Exclusive:&lt;br /&gt;&lt;br /&gt;"Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\mydatabase.mdb;Exclusive=1;Uid=admin;Pwd=" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; OLE DB, OleDbConnection (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard security:&lt;br /&gt;&lt;br /&gt;"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\somepath\mydb.mdb;User Id=admin;Password=;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Workgroup (system database):&lt;br /&gt;&lt;br /&gt;"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\somepath\mydb.mdb;Jet OLEDB:System Database=system.mdw;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; With password:&lt;br /&gt;&lt;br /&gt;"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\somepath\mydb.mdb;Jet OLEDB:Database Password=MyDbPassword;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Oracle &lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; New version:&lt;br /&gt;&lt;br /&gt;"Driver={Microsoft ODBC for Oracle};Server=OracleServer.world;Uid=Username;Pwd=asdasd;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Old version:&lt;br /&gt;&lt;br /&gt;"Driver={Microsoft ODBC Driver for Oracle};ConnectString=OracleServer.world;Uid=myUsername;Pwd=myPassword;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; OLE DB, OleDbConnection (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard security:&lt;br /&gt;&lt;br /&gt;"Provider=msdaora;Data Source= MyOracleDB;UserId=UserName;Password=asdasd;" &lt;br /&gt;This one's from Microsoft, the following are from Oracle&lt;br /&gt; Standard Security:&lt;br /&gt;&lt;br /&gt;"Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=Username;Password=asdasd;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Trusted Connection:&lt;br /&gt;&lt;br /&gt;"Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;OSAuthent=1;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; OracleConnection (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;&lt;br /&gt;"Data Source=Oracle8i;Integrated Security=yes"; &lt;br /&gt;This one works only with Oracle 8i release 3 or later&lt;br /&gt; Declare the OracleConnection:&lt;br /&gt;&lt;br /&gt;C#:&lt;br /&gt;using System.Data.OracleClient;&lt;br /&gt;OracleConnection oOracleConn = new OracleConnection();&lt;br /&gt;oOracleConn.ConnectionString = "my connectionstring";&lt;br /&gt;oOracleConn.Open();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;VB.NET:&lt;br /&gt;Imports System.Data.OracleClient&lt;br /&gt;Dim oOracleConn As OracleConnection = New OracleConnection()&lt;br /&gt;oOracleConn.ConnectionString = "my connectionstring"&lt;br /&gt;oOracleConn.Open() &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Core Labs OraDirect (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;"User ID=scott; Password=tiger; Host=ora; Pooling=true; Min Pool Size=0;Max Pool Size=100; Connection Lifetime=0" &lt;br /&gt;Read more at Core Lab and the product page.&lt;br /&gt; Data Shape &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; MS Data Shape:&lt;br /&gt;"Provider=MSDataShape.1;Persist Security Info=False;Data Provider=MSDAORA;Data Source= orac;userid=username;password=mypw" &lt;br /&gt;Want to learn data shaping? Check out 4GuyfFromRolla's great article about Data Shaping &gt;&gt;&lt;br /&gt; MySQL &lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Local database:&lt;br /&gt;&lt;br /&gt;"Driver={mySQL};Server=mySrvName;Option=16834;Database=mydatabase;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Remote database:&lt;br /&gt;&lt;br /&gt;"Driver={mySQL};Server=data.domain.com;Port=3306;Option=131072;Stmt=;Database=my-database;Uid=username;Pwd=password;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; OLE DB, OleDbConnection (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;&lt;br /&gt;"Provider=MySQLProv;Data Source=mydb;User Id=UserName;Password=asdasd;"&lt;br /&gt; MySqlConnection (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; eInfoDesigns.dbProvider:&lt;br /&gt;&lt;br /&gt;"DataSource=server;Database= mydb;UserID=username;Password=pwd;Command Logging=false" &lt;br /&gt;This one is used with eInfoDesigns dbProvider, an add-on to .NET&lt;br /&gt; Declare the MySqlConnection:&lt;br /&gt;&lt;br /&gt;C#:&lt;br /&gt;using eInfoDesigns.dbProvider.MySqlClient;&lt;br /&gt;MySqlConnection oMySqlConn = new MySqlConnection();&lt;br /&gt;oMySqlConn.ConnectionString = "my connectionstring";&lt;br /&gt;oMySqlConn.Open();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;VB.NET:&lt;br /&gt;Imports eInfoDesigns.dbProvider.MySqlClient&lt;br /&gt;Dim oMySqlConn As MySqlConnection = New MySqlConnection()&lt;br /&gt;oMySqlConn.ConnectionString = "my connectionstring"&lt;br /&gt;oMySqlConn.Open() &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; SevenObjects MySqlClient (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;&lt;br /&gt;"Host=server; UserName= myusername;Password=mypassword;Database=mydb;" &lt;br /&gt;This is a freeware ADO.Net data provider from SevenObjects&lt;br /&gt; Core Labs MySQLDirect (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;&lt;br /&gt;"User ID=root; Password=pwd; Host=localhost; Port= 3306;Database=test;Direct=true; Protocol=TCP; Compress=false; Pooling=true; Min Pool Size=0;Max Pool Size=100; Connection Lifetime=0" &lt;br /&gt;Read more at Core Lab and the product page.&lt;br /&gt; Interbase &lt;br /&gt; ODBC, Easysoft &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Local computer:&lt;br /&gt;&lt;br /&gt;"Driver={Easysoft IB6 ODBC};Server=localhost;Database=localhost:C:\mydatabase.gdb;Uid=username;Pwd=password" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Remote Computer:&lt;br /&gt;&lt; DIV&gt; "Driver={EasysoftIB6ODBC};Server=ComputerName;Database=ComputerName:C:\mydatabase.gdb;Uid=username;Pwd=password" &lt;br /&gt;Read more about this driver: Easysoft ODBC-Interbase driver &gt;&gt;&lt;br /&gt;&lt;br /&gt; ODBC, Intersolv &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Local computer:&lt;br /&gt;&lt;br /&gt;"Driver={INTERSOLV InterBase ODBC Driver (*.gdb)};Server=localhost;Database=localhost:C:\mydatabase.gdb;Uid=username;Pwd=password" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Remote Computer:&lt;br /&gt;&lt;br /&gt;"Driver= {INTERSOLV InterBaseODBCDriver(*.gdb)};Server=ComputerName;Database=ComputerName:C:\mydatabase.gdb;Uid=username;Pwd=password" &lt;br /&gt;This driver are provided by DataDirect Technologies &gt;&gt; (formerly Intersolv) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; OLE DB, SIBPROvider &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;&lt;br /&gt;"provider=sibprovider;location=localhost:;data source=c:\databases\gdbs\mygdb.gdb;user id=SYSDBA;password=masterkey" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Specifying character set:&lt;br /&gt;&lt;br /&gt;"provider=sibprovider;location=localhost:;data source=c:\databases\gdbs\mygdb.gdb;user id=SYSDBA;password=masterkey;character set=ISO8859_1" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Specifying role:&lt;br /&gt;&lt;br /&gt;"provider=sibprovider;location=localhost:;data source=c:\databases\gdbs\mygdb.gdb;userid=SYSDBA;password=masterkey;role=DIGITADORES" &lt;br /&gt;Read more about SIBPROvider &gt;&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Read more about connecting to Interbase in this Borland Developer Network article http://community.borland.com/article/0,1410,27152,00.html &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; IBM DB2 &lt;br /&gt; OLE DB, OleDbConnection (.NET) from ms &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; TCP/IP:&lt;br /&gt;&lt;br /&gt;"Provider=DB2OLEDB;Network Transport Library=TCPIP;Network Address=XXX.XXX.XXX.XXX;Initial Catalog=MyCtlg;Package Collection=MyPkgCol;Default Schema=Schema;User ID=MyUser;Password=MyPW" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; APPC:&lt;br /&gt;&lt;br /&gt;"Provider=DB2OLEDB;APPC Local LU Alias=MyAlias;APPC Remote LU Alias=MyRemote;Initial Catalog=MyCtlg;Package Collection=MyPkgCol;Default Schema=Schema;User ID=MyUser;Password=MyPW" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Sybase &lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard Sybase System 12 (or 12.5) Enterprise Open Client:&lt;br /&gt;&lt;br /&gt;"Driver={SYBASE ASE ODBC Driver};Srvr=Aron1;Uid=username;Pwd=password" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard Sybase System 11:&lt;br /&gt;&lt;br /&gt;"Driver= {SYBASESYSTEM11};Srvr=Aron1;Uid=username;Pwd=password;" &lt;br /&gt;Do you know a userguide for Sybase System 11, 12, 12.5? E-mail the URL to connectionstrings.com now!! &gt;&gt; &lt;br /&gt; Intersolv 3.10:&lt;br /&gt;&lt;br /&gt;"Driver={INTERSOLV 3.10 32-BIT Sybase};Srvr=Aron1;Uid=username;Pwd=password;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Sybase SQL Anywhere (former Watcom SQL ODBC driver):&lt;br /&gt;&lt;br /&gt;"ODBC; Driver= SybaseSQLAnywhere5.0;DefaultDir=c:\dbfolder\;Dbf=c:\mydatabase.db;Uid=username;Pwd=password;Dsn=""""" &lt;br /&gt;Note! The two double quota following the DSN parameter at the end are escaped quotas (VB syntax), you may have to change this to your language specific escape syntax. The empty DSN parameter is indeed critical as not including it will result in error 7778.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Read more in the Sybase SQL Anywhere User Guide &gt;&gt; &lt;br /&gt; OLE DB &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Adaptive Server Anywhere (ASA):&lt;br /&gt;&lt;br /&gt;"Provider=ASAProv;Data source=myASA" &lt;br /&gt;Read more in the ASA User Guide &gt;&gt; &lt;br /&gt; Adaptive Server Enterprise (ASE) with Data Source .IDS file:&lt;br /&gt;&lt;br /&gt;"Provider=Sybase ASE OLE DB Provider; Data source=myASE" &lt;br /&gt;Note that you must create a Data Source .IDS file using the Sybase Data Administrator. These .IDS files resemble ODBC DSNs. &lt;br /&gt; Adaptive Server Enterprise (ASE):&lt;br /&gt;&lt; DIV&gt;"Provider=Sybase.ASEOLEDBProvider;Srvr=myASEserver,5000;Catalog= myDBname;UserId=username;Password=password" &lt;br /&gt;   - some reports on problem using the above one, try the following as an alternative -&lt;br /&gt;&lt;br /&gt;"Provider=Sybase.ASEOLEDBProvider;Server Name=myASEserver,5000;Initial Catalog= myDBname;UserId=username;Password=password" &lt;br /&gt;This one works only from Open Client 12.5 where the server port number feature works,燼llowing fully qualified connection strings to be used without defining燼ny .IDS Data Source files. &lt;br /&gt; Informix &lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Informix 3.30:&lt;br /&gt;&lt;br /&gt;"Dsn='';Driver={INFORMIX 3.30 32 BIT};Host=hostname;Server=myserver;Service=service-name;Protocol=olsoctcp;Database=mydb;UID=username;PWD=myPwd &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Informix-CLI 2.5:&lt;br /&gt;&lt;br /&gt;"Driver={Informix-CLI 2.5 (32 Bit)};Server=myserver;Database=mydb;Uid=username;Pwd=myPwd" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; OLE DB &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; IBM Informix OLE DB Provider:&lt;br /&gt;&lt;br /&gt;"Provider=Ifxoledbc.2;password=myPw;User ID=myUser;Data Source=dbName@serverName;Persist Security Info=true" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Mimer SQL &lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard Security:&lt;br /&gt;&lt;br /&gt;"Driver={MIMER};Database=mydb;Uid=myuser;Pwd=mypw;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Prompt for username and password:&lt;br /&gt;&lt;br /&gt;"Driver={MIMER};Database=mydb;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; PostgreSQL &lt;br /&gt; Core Labs PostgreSQLDirect (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;&lt;br /&gt;"User ID=root; Password=pwd; Host=localhost; Port= 5432;Database=testdb;Pooling=true; Min Pool Size=0; Max Pool Size=100; Connection Lifetime=0" &lt;br /&gt;Read more at Core Lab and the product page.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; DSN &lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; DSN:&lt;br /&gt;&lt;br /&gt;"DSN=myDsn;Uid=username;Pwd=;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; File DSN:&lt;br /&gt;&lt;br /&gt;"FILEDSN=c:\myData.dsn;Uid=username;Pwd=;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Excel &lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;&lt;br /&gt;"Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=C:\MyExcel.xls;DefaultDir=c:\mypath;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; OLE DB &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;&lt;br /&gt;"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""" &lt;br /&gt;"HDR=Yes;" indicates that the first row contains columnnames, not data&lt;br /&gt;"IMEX=1;" tells the driver to always read "intermixed" data columns as text&lt;br /&gt;TIP! SQL syntax: "SELECT * FROM [sheet1$]" - i.e. worksheet name followed by a "$" and wrapped in "[" "]" brackets.&lt;br /&gt; Text &lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;&lt;br /&gt;"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=c:\txtFilesFolder\;Extensions=asc,csv,tab,txt;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; OLE DB &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;&lt; DIV&gt; "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\txtFilesFolder\;ExtendedProperties=""text;HDR=Yes;FMT=Delimited""" &lt;br /&gt;"HDR=Yes;" indicates that the first row contains columnnames, not data&lt;br /&gt; DBF / FoxPro &lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; standard:&lt;br /&gt;&lt;br /&gt;"Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\mydbpath;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; OLE DB, OleDbConnection (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; standard:&lt;br /&gt;&lt;br /&gt;"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\folder;Extended Properties=dBASE IV;User ID=Admin;Password=" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Visual FoxPro &lt;br /&gt; OLE DB, OleDbConnection (.NET) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Database container (.DBC):&lt;br /&gt;&lt;br /&gt;"Provider=vfpoledb.1;Data Source=C:\MyDbFolder\MyDbContainer.dbc;Password=MyPassWord;Collating Sequence=machine" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Free table directory:&lt;br /&gt;&lt;br /&gt;"Provider=vfpoledb.1;Data Source=C:\MyDataDirectory\;Password=MyPassWord;Collating Sequence=general" &lt;br /&gt;Read more (Microsoft msdn) &gt;&gt;&lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Database container (.DBC):&lt;br /&gt;&lt;br /&gt;"Driver={Microsoft Visual FoxPro Driver};SourceType=DBC;SourceDB=c:\myvfpdb.dbc;Exclusive=No;Collate=Machine;" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Free Table directory:&lt;br /&gt;&lt;br /&gt;"Driver= {MicrosoftVisualFoxProDriver};SourceType=DBF;SourceDB=c:\myvfpdbfolder;Exclusive=No;Collate=Machine;" &lt;br /&gt;"Collate=Machine" is the default setting, for other settings check the list of supported collating sequences &gt;&gt;&lt;br /&gt;&lt;br /&gt;Microsoft Visual Foxpro site: http://msdn.microsoft.com/vfoxpro &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Pervasive &lt;br /&gt; ODBC &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;&lt;br /&gt;"Driver= {Pervasive ODBC ClientInterface};ServerName=srvname;dbq=@dbname" &lt;br /&gt;Pervasive ODBC info &gt;&gt;&lt;br /&gt; OLE DB &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Standard:&lt;br /&gt;&lt;br /&gt;"Provider=PervasiveOLEDB;Data Source=C:\path" &lt;br /&gt;Pervasive OLE DB info &gt;&gt;&lt;br /&gt; UDL &lt;br /&gt; UDL &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; UDL:&lt;br /&gt;&lt;br /&gt;"File Name=c:\myDataLink.udl;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-8829589193380986221?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/8829589193380986221/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=8829589193380986221' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8829589193380986221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8829589193380986221'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/blog-post.html' title='数据库连接字符串大全'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-8889879138927615231</id><published>2008-10-21T04:52:00.002-07:00</published><updated>2008-10-21T04:53:04.355-07:00</updated><title type='text'>C#连接ACCESS和SQL2000</title><content type='html'>using System;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.SqlClient;&lt;br /&gt;using System.Data.OleDb;&lt;br /&gt;namespace ConsoleApplication1&lt;br /&gt;{&lt;br /&gt; /// &lt;summary&gt;&lt;br /&gt; /// Class1 的摘要说明。&lt;br /&gt; /// &lt;/summary&gt;&lt;br /&gt; class Class1&lt;br /&gt; {&lt;br /&gt;  /// &lt;summary&gt;&lt;br /&gt;  /// 应用程序的主入口点。&lt;br /&gt;  /// &lt;/summary&gt;&lt;br /&gt;  [STAThread]&lt;br /&gt;  static void Main(string[] args)&lt;br /&gt;  {&lt;br /&gt;&lt;br /&gt;//以下是连接Access&lt;br /&gt;   OleDbConnection dbconn=new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data                      source=c:\a.mdb");&lt;br /&gt;   dbconn.Open();&lt;br /&gt;   //OleDbCommand cmd=new OleDbCommand("select * from test1",dbconn);&lt;br /&gt;&lt;br /&gt;    OleDbCommand cmd=dbconn.CreateCommand();&lt;br /&gt;   cmd.CommandText="select * from test1";&lt;br /&gt;   cmd.CommandType=CommandType.Text;&lt;br /&gt;   OleDbDataReader reader=cmd.ExecuteReader();&lt;br /&gt;&lt;br /&gt;//以下是连接SQL2000&lt;br /&gt;   /*SqlConnection conn=new SqlConnection("server=localhost;Initial catalog=NorthWind;user  ID=sa;password=;");&lt;br /&gt;   conn.Open();&lt;br /&gt;   SqlCommand cmd=conn.CreateCommand();&lt;br /&gt;   cmd.CommandText="select * from Customers";&lt;br /&gt;   cmd.CommandType=CommandType.Text;&lt;br /&gt;   SqlDataReader reader=cmd.ExecuteReader(CommandBehavior.CloseConnection);*/&lt;br /&gt;&lt;br /&gt;   string output;&lt;br /&gt;   while(reader.Read())&lt;br /&gt;   {&lt;br /&gt;    output=string.Format("custormer {0}:{1} works for {2}",reader.GetString(1),reader.GetString(2),reader.GetString(3));&lt;br /&gt;    Console.WriteLine(output);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-8889879138927615231?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/8889879138927615231/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=8889879138927615231' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8889879138927615231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8889879138927615231'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/caccesssql2000.html' title='C#连接ACCESS和SQL2000'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-8276913106826809827</id><published>2008-10-21T04:52:00.001-07:00</published><updated>2008-10-21T04:52:38.843-07:00</updated><title type='text'>C#执行ACCESS中的存储过程是这样简单</title><content type='html'>//假设：“连接”，“ACCESS中的存储过程”都已存在&lt;br /&gt;&lt;br /&gt;OleDbCommand   命令 = new OleDbCommand("ACCESS中的存储过程", 连接);&lt;br /&gt;&lt;br /&gt;命令.CommandType = CommandType.StoredProcedure;&lt;br /&gt;&lt;br /&gt;连接.Open();&lt;br /&gt;&lt;br /&gt;try{&lt;br /&gt;&lt;br /&gt;     命令.ExecuteNonQuery();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;catch (Exception ex)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;     MessageBox.Show(ex.Message, "执行存储过程出错");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;连接.Close();&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-8276913106826809827?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/8276913106826809827/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=8276913106826809827' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8276913106826809827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/8276913106826809827'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/caccess.html' title='C#执行ACCESS中的存储过程是这样简单'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-4996688501444765946</id><published>2008-10-21T04:51:00.004-07:00</published><updated>2008-10-21T04:52:14.214-07:00</updated><title type='text'>用c#压缩和修复access数据库_c#应用</title><content type='html'>下面这段C# 代码能够用来压缩和修复Access数据库,不管他是个简单的".mdb"ACCESS数据库还是个".mdw"网络共享数据库,这个过程和您在用MS Access应用程式中使用的"工具-数据库实用工具-压缩和修复"时执行的操作完全相同.实例代码使用了"迟绑定"(运行中在内存中建立COM对象),这样就无需在工程中加入COM引用了,也无需在PC上安装MS Access应用程式.只需要一个Jet引擎(Jet引擎包含在MDAC安装包中,在Windows NT4以后的版本中,系统已自带了这个引擎).&lt;br /&gt;&lt;br /&gt;C#操作ACCESS数据库的背景&lt;br /&gt;不知您是否也厌烦了在工程中加入复杂的COM库引用,但我相信这个纯.NET代码将省去额外的交互操作, RCWs和COM引用.基本上,由于系统中安装的Microsoft类库的不同(例如:MS Office Object Library 9,10,11等等),我们也不知道用户PC中安装的Office版本,所以我们要通过ProgID来访问COM对象,而不能用CLSID.例如,当调用"Excel.Application",时,得到的是Excel,而不管系统中安装MS Office的版本,当在代码中加入"MS Excel 10 Object library"引用时,其实只是给应用程式加入了一个很受限制的功能.所以我们使用System.Reflection和迟绑定.&lt;br /&gt;1. 实例代码&lt;br /&gt;只需调用CompactAccessDB函数即可压缩和修复目标数据库.&lt;br /&gt;&lt;br /&gt;2. 参数:&lt;br /&gt;connectionString ? 用来连接到Access数据库. &lt;br /&gt;mdwfilename ?要压缩的MDB文档的全名(路径+文档名). &lt;br /&gt;由于Jet引擎的限制,执行此方法压缩Access数据库会把结果生成为一个新文档,所以我们要还需要把这个新的Access文档拷贝到目的位置覆盖原来未压缩文档.&lt;br /&gt;&lt;br /&gt;当调用此方法时请确认被压缩数据库无打开的连接.&lt;br /&gt;/**//// MBD compact method (c) 2004 Alexander Youmashev&lt;br /&gt;/// !!IMPORTANT!!&lt;br /&gt;/// !make sure theres no open connections&lt;br /&gt;/// to your db before calling this method!&lt;br /&gt;/// !!IMPORTANT!!&lt;br /&gt;/// &lt;br /&gt;/// &lt;br /&gt;connection string to your db&lt;br /&gt;/**//// &lt;br /&gt;FULL name&lt;br /&gt;/**//// of an MDB file you want to compress.&lt;br /&gt;public static void CompactAccessDB(string connectionString, string mdwfilename)&lt;br /&gt;{&lt;br /&gt;object[] oParams;&lt;br /&gt;&lt;br /&gt;//create an inctance of a Jet Replication Object&lt;br /&gt;object objJRO = &lt;br /&gt;Activator.CreateInstance(Type.GetTypeFromProgID("JRO.JetEngine"));&lt;br /&gt;&lt;br /&gt;//filling Parameters array&lt;br /&gt;//cnahge "Jet OLEDB:Engine Type=5" to an appropriate value&lt;br /&gt;// or leave it as is if you db is JET4X format (access 2000,2002)&lt;br /&gt;//(yes, jetengine5 is for JET4X, no misprint here)&lt;br /&gt;&lt;br /&gt;oParams = new object[] { &lt;br /&gt;connectionString,&lt;br /&gt;"Provider=Microsoft.Jet.OLEDB.4.0;Data" + &lt;br /&gt;" Source=C:＼＼tempdb.mdb;Jet OLEDB:Engine Type=5"};&lt;br /&gt;&lt;br /&gt;//invoke a CompactDatabase method of a JRO object&lt;br /&gt;//pass Parameters array&lt;br /&gt;&lt;br /&gt;objJRO.GetType().InvokeMember("CompactDatabase", &lt;br /&gt;System.Reflection.BindingFlags.InvokeMethod,&lt;br /&gt;null,&lt;br /&gt;objJRO,&lt;br /&gt;oParams);&lt;br /&gt;&lt;br /&gt;//database is compacted now&lt;br /&gt;//to a new file C:＼＼tempdb.mdw&lt;br /&gt;//lets copy it over an old one and delete it&lt;br /&gt;&lt;br /&gt;System.IO.File.Delete(mdwfilename);&lt;br /&gt;System.IO.File.Move("C:＼＼tempdb.mdb", mdwfilename);&lt;br /&gt;//clean up (just in case)&lt;br /&gt;System.Runtime.InteropServices.Marshal.ReleaseComObject(objJRO);&lt;br /&gt;objJRO=null;&lt;br /&gt;}&lt;br /&gt;http://www.cnblogs.com/maxianghui/archive/2006/08/20/481886.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-4996688501444765946?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/4996688501444765946/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=4996688501444765946' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4996688501444765946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4996688501444765946'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/caccessc.html' title='用c#压缩和修复access数据库_c#应用'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-7753312548755085804</id><published>2008-10-21T04:51:00.003-07:00</published><updated>2008-10-21T04:51:51.008-07:00</updated><title type='text'>C#动态生成Word文档并填充数据</title><content type='html'>using Word;&lt;br /&gt;下面的例子中包括C#对Word文档的创建、插入表格、设置样式等操作：&lt;br /&gt;&lt;br /&gt;（例子中代码有些涉及数据信息部分被省略，重要是介绍一些C#操作word文档的方法）&lt;br /&gt;&lt;br /&gt;        public string CreateWordFile(string CheckedInfo)&lt;br /&gt;        ...{&lt;br /&gt;            string message = "";&lt;br /&gt;            try&lt;br /&gt;            ...{&lt;br /&gt;                Object Nothing = System.Reflection.Missing.Value;&lt;br /&gt;                Directory.CreateDirectory("C:/CNSI");  //创建文件所在目录&lt;br /&gt;                string name = "CNSI_" + DateTime.Now.ToShortString()+".doc";&lt;br /&gt;                object filename = "C://CNSI//" + name;  //文件保存路径&lt;br /&gt;                //创建Word文档&lt;br /&gt;                Word.Application WordApp = new Word.ApplicationClass();&lt;br /&gt;                Word.Document WordDoc = WordApp.Documents.Add(ref Nothing, ref Nothing, ref Nothing, ref Nothing);&lt;br /&gt;&lt;br /&gt;                //添加页眉&lt;br /&gt;                WordApp.ActiveWindow.View.Type = WdViewType.wdOutlineView;&lt;br /&gt;                WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekPrimaryHeader;&lt;br /&gt;                WordApp.ActiveWindow.ActivePane.Selection.InsertAfter("[页眉内容]");&lt;br /&gt;                WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;//设置右对齐&lt;br /&gt;                WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekMainDocument;//跳出页眉设置&lt;br /&gt;&lt;br /&gt;                WordApp.Selection.ParagraphFormat.LineSpacing = 15f;//设置文档的行间距&lt;br /&gt;&lt;br /&gt;                //移动焦点并换行&lt;br /&gt;                object count = 14;&lt;br /&gt;                object WdLine = Word.WdUnits.wdLine;//换一行;&lt;br /&gt;                 WordApp.Selection.MoveDown(ref WdLine, ref count, ref Nothing);//移动焦点&lt;br /&gt;                 WordApp.Selection.TypeParagraph();//插入段落&lt;br /&gt;&lt;br /&gt;                 //文档中创建表格&lt;br /&gt;                 Word.Table newTable = WordDoc.Tables.Add(WordApp.Selection.Range, 12, 3, ref Nothing, ref Nothing);&lt;br /&gt;                 //设置表格样式&lt;br /&gt;                 newTable.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleThickThinLargeGap;&lt;br /&gt;                 newTable.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;&lt;br /&gt;                 newTable.Columns[1].Width = 100f;&lt;br /&gt;                 newTable.Columns[2].Width = 220f;&lt;br /&gt;                 newTable.Columns[3].Width = 105f;&lt;br /&gt;&lt;br /&gt;                 //填充表格内容&lt;br /&gt;                 newTable.Cell(1, 1).Range.Text = "产品详细信息表";&lt;br /&gt;                 newTable.Cell(1, 1).Range.Bold = 2;//设置单元格中字体为粗体&lt;br /&gt;                 //合并单元格&lt;br /&gt;                 newTable.Cell(1, 1).Merge(newTable.Cell(1, 3));&lt;br /&gt;                 WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;//垂直居中&lt;br /&gt;                 WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;//水平居中&lt;br /&gt;                        &lt;br /&gt;                 //填充表格内容&lt;br /&gt;                 newTable.Cell(2, 1).Range.Text = "产品基本信息";&lt;br /&gt;                 newTable.Cell(2, 1).Range.Font.Color = Word.WdColor.wdColorDarkBlue;//设置单元格内字体颜色&lt;br /&gt;                 //合并单元格&lt;br /&gt;                 newTable.Cell(2, 1).Merge(newTable.Cell(2, 3));&lt;br /&gt;                 WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;&lt;br /&gt;&lt;br /&gt;                  //填充表格内容&lt;br /&gt;                  newTable.Cell(3, 1).Range.Text = "品牌名称：";&lt;br /&gt;                  newTable.Cell(3, 2).Range.Text = BrandName;&lt;br /&gt;                  //纵向合并单元格&lt;br /&gt;                  newTable.Cell(3, 3).Select();//选中一行&lt;br /&gt;                  object moveUnit = Word.WdUnits.wdLine;&lt;br /&gt;                  object moveCount = 5;&lt;br /&gt;                  object moveExtend = Word.WdMovementType.wdExtend;&lt;br /&gt;                   WordApp.Selection.MoveDown(ref moveUnit, ref moveCount, ref moveExtend);&lt;br /&gt;                   WordApp.Selection.Cells.Merge();&lt;br /&gt;                   //插入图片&lt;br /&gt;                   string FileName = Picture;//图片所在路径&lt;br /&gt;                   object LinkToFile = false;&lt;br /&gt;                   object SaveWithDocument = true;&lt;br /&gt;                   object Anchor = WordDoc.Application.Selection.Range;&lt;br /&gt;                   WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Anchor);&lt;br /&gt;                    WordDoc.Application.ActiveDocument.InlineShapes[1].Width = 100f;//图片宽度&lt;br /&gt;                    WordDoc.Application.ActiveDocument.InlineShapes[1].Height = 100f;//图片高度&lt;br /&gt;                    //将图片设置为四周环绕型&lt;br /&gt;                    Word.Shape s = WordDoc.Application.ActiveDocument.InlineShapes[1].ConvertToShape();&lt;br /&gt;                    s.WrapFormat.Type = Word.WdWrapType.wdWrapSquare;&lt;br /&gt;                        &lt;br /&gt;                    newTable.Cell(12, 1).Range.Text = "产品特殊属性";&lt;br /&gt;                    newTable.Cell(12, 1).Merge(newTable.Cell(12, 3));&lt;br /&gt;                     //在表格中增加行&lt;br /&gt;                     WordDoc.Content.Tables[1].Rows.Add(ref Nothing);&lt;br /&gt;                      &lt;br /&gt;                     WordDoc.Paragraphs.Last.Range.Text = "文档创建时间：" + DateTime.Now.ToString();//“落款”&lt;br /&gt;                     WordDoc.Paragraphs.Last.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;&lt;br /&gt;&lt;br /&gt;                    //文件保存&lt;br /&gt;                    WordDoc.SaveAs(ref filename, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing);&lt;br /&gt;                    WordDoc.Close(ref Nothing, ref Nothing, ref Nothing);&lt;br /&gt;                    WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);&lt;br /&gt;                    message=name+"文档生成成功，以保存到C:CNSI下";&lt;br /&gt;            }&lt;br /&gt;            catch&lt;br /&gt;            ...{&lt;br /&gt;                message = "文件导出异常！";&lt;br /&gt;            }&lt;br /&gt;            return message;&lt;br /&gt;        }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-7753312548755085804?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/7753312548755085804/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=7753312548755085804' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/7753312548755085804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/7753312548755085804'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/cword.html' title='C#动态生成Word文档并填充数据'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-1304453973663839033</id><published>2008-10-21T04:51:00.001-07:00</published><updated>2008-10-21T04:51:27.484-07:00</updated><title type='text'>C#操作技巧的数据类型之间的转换</title><content type='html'>我现在感到学好C#就是就是要知道，C#的基本语法，C#的新的特点，C#能干什么！ &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;其中我感到不管如何，NAMESPACE都是很关键的，可以说不是只对C#而言，而是整个。NET都是由NAMESPACE组成的，所以我在看了C#的基本语法后，就直奔NAMESPACE来了，在这里写下自己的一些感觉，希望能对后面学习的人有所帮助。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NAMESPACE在新的NET环境下编程可以说是无所不在，总之，给我的感觉就是MS的新一代的语言的核心就是NAMESPACE，我们可以通过已经有的NAMESPACE，做我们想做的和愿意做的，当然如果你感觉现有的还不够你的使用的话，你也可以自己来使用现有的来扩展，创建自己的NAMESPACE！（感觉怎么很象以前的COM、DCOM呢？） &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;下面我门说说如何建立一个NAMESPACE！ &lt;br /&gt;&lt;br /&gt;定义一个NAMESPACE首先需要包含关键词：namespace &lt;br /&gt;&lt;br /&gt;格式如下： &lt;br /&gt;&lt;br /&gt;namespace Your_nsname &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;//namespase主体内容； &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;呵呵，给我的感觉就好象和Class或Struct一样。不过他们除了形式有类似外，确实在很多方面都不相同，具体我们以后会慢慢说到！先往下看。。。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在一个NAMESPACE的主体内，可以引用其他的NAMESPACE！例如： &lt;br /&gt;&lt;br /&gt;namespace Your_nsname{ &lt;br /&gt;&lt;br /&gt;//下面引用System和System.Xml着两个NAMESPACE； &lt;br /&gt;&lt;br /&gt;using System; &lt;br /&gt;&lt;br /&gt;using System.Xml; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//namespase主体内容； &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;在上面有一个需要注意的就是，如果要引用NAMESPACE的话，那么应该在申明其它类型前引用，如下是错误的： &lt;br /&gt;&lt;br /&gt;namespace Your_nsname{ &lt;br /&gt;&lt;br /&gt;//其它一些内容； &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//由于引用System和System.Xml放到了其它语句之后，所以。。。 &lt;br /&gt;&lt;br /&gt;using System; &lt;br /&gt;&lt;br /&gt;using System.Xml; &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;另外对于NAMESPACE还有一个有趣的地方，就是。。。 &lt;br /&gt;&lt;br /&gt;我们先看一下下面的的两个方式： &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;方式一、 &lt;br /&gt;&lt;br /&gt;namespace N1.N2 &lt;br /&gt;&lt;br /&gt;{ class A {} &lt;br /&gt;&lt;br /&gt;class B {} &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;方式二、 &lt;br /&gt;&lt;br /&gt;namespace N1 &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;namespace N2 &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;class A {} &lt;br /&gt;&lt;br /&gt;class B {} &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在上面的良种方式中，第二种很容易就能看懂，是在NAMESPACE N1中再创建一个NAMESPACE N2，而N2中有两个类（class）A、B！那么第一种呢？其实上面两个方式定义的其实是一模一样的。NAMESPACE是可以嵌套定义的，我们可以使用第二种方式，层次感觉比较清楚，也可以使用第一种方式，所不同的是，第一中方式中，在N1和N2之间必须用分隔符“.”来表明他们两者之间的层次关系！ &lt;br /&gt;&lt;br /&gt;在使用的时候用如下的方式： &lt;br /&gt;&lt;br /&gt;N1.N2.A; &lt;br /&gt;&lt;br /&gt;N1.N2.B; &lt;br /&gt;&lt;br /&gt;在一个NAMESPACE中，我们也可以用一个别名指代现有的NAMESPACE或是一些其他类型数据。 &lt;br /&gt;&lt;br /&gt;别名的使用格式如下： &lt;br /&gt;&lt;br /&gt;using 别名 = 一个已经存在的类型； &lt;br /&gt;&lt;br /&gt;例如：using soholife = System; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;下面我们通过几个例子来加深一下理解： &lt;br /&gt;&lt;br /&gt;namespace N1.N2 &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;class A {} &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;namespace N3 &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;using A = N1.N2.A; &lt;br /&gt;&lt;br /&gt;class B: A {} &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;这里，在N3中，A是N1.N2.A的别名，而N3.B则继承于N1.N2.A!同样的我们也可以用下面的方式来取得同样的效果： &lt;br /&gt;&lt;br /&gt;namespace N3 &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;using R = N1.N2; &lt;br /&gt;&lt;br /&gt;class B: R.A {} &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;说道这里，我想提个问题，先看下面的例子： &lt;br /&gt;&lt;br /&gt;namespace N1.N2 &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;class A {} &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;namespace N3 &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;class A {} &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;namespace N3 &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;using A = N1.N2.A; &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果我们这样写，会有问题吗？ &lt;br /&gt;&lt;br /&gt;答案当然是肯定的了，错！因为一个别名必须是在NAMESPACE中唯一的，而上面由于已经有了 &lt;br /&gt;&lt;br /&gt;class a{}，我们在用using A =N1.NE.A;就所以肯定要出错了！不过如果我们该成: &lt;br /&gt;&lt;br /&gt;using B =N1.N2.A;那么结果如何呢？朋友门自己想想吧！我就不多说了！ &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;本来以为可以结束了，突然发现还有一个地方还没有说清楚，可以说是就没有说，呵呵，看来只能晚些回家了，我门还是从问题看起吧： &lt;br /&gt;&lt;br /&gt;namespace N1.N2 &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;class A {} &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;namespace N3 &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;using R = N1.N2; &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;namespace N3 &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;class B: R.A {} &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;上面的例子中，不知道大家觉得如何，正确？错误？ &lt;br /&gt;&lt;br /&gt;如果我来回答的话，错！（呵呵，以前做选择题养成的习惯，凡是这样问的答案就是错！不过原因是说不出来的了！） &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;真的上面这个程序，先开始看我也以为是正确的，后来才知道。。。，唉，看来还是要多看书的！ &lt;br /&gt;&lt;br /&gt;原来在一个分开的单元中使用别名的时候，别名只是在它所在的单元中（NAMESPACE或其它）可以使用，而在其他单元中是不能够用的，所以上面的那个例子中，在第二个N3中使用R的时候，会提示R未知！当然了，如果我们想使用这样的方式，我们还是有办法的，就是把别名R写到N3的外面：如下 &lt;br /&gt;&lt;br /&gt;using R = N1.N2; &lt;br /&gt;&lt;br /&gt;namespace N3 &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;class B: R.A {} &lt;br /&gt;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-1304453973663839033?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/1304453973663839033/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=1304453973663839033' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1304453973663839033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/1304453973663839033'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_6301.html' title='C#操作技巧的数据类型之间的转换'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-781948073391582813</id><published>2008-10-21T04:50:00.002-07:00</published><updated>2008-10-21T04:51:04.876-07:00</updated><title type='text'>C#中的Load事件</title><content type='html'>Load（加载）事件发生于Form窗体的加载时候，其设置步骤如下。 &lt;br /&gt;&lt;br /&gt;（1）打开VS2008，新建一个Windows窗体应用程序，并命名为FormEventTest。 &lt;br /&gt;&lt;br /&gt;（2）打开其Form1的属性窗口。 &lt;br /&gt;&lt;br /&gt;（3）找到Load事件项，然后双击进入该事件代码编辑文件Form1.cs，为其编写如下代码。 &lt;br /&gt;&lt;br /&gt;using System; &lt;br /&gt;&lt;br /&gt;using System.Collections.Generic; &lt;br /&gt;&lt;br /&gt;using System.ComponentModel; &lt;br /&gt;&lt;br /&gt;using System.Data; &lt;br /&gt;&lt;br /&gt;using System.Drawing; &lt;br /&gt;&lt;br /&gt;using System.Text; &lt;br /&gt;&lt;br /&gt;using System.Windows.Forms; &lt;br /&gt;&lt;br /&gt;namespace FormEventTest &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;public partial class Form1 : Form &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;public Form1() &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;InitializeComponent(); &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;//定义窗体加载事件处理 &lt;br /&gt;&lt;br /&gt;private void Form1_Load(object sender, EventArgs e) &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;MessageBox.Show("Form Loaded!"); &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;下面的代码便是窗体加载事件的处理函数。 &lt;br /&gt;&lt;br /&gt;private void Form1_Load(object sender, EventArgs e) &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;MessageBox.Show(e.ToString()); &lt;br /&gt;&lt;br /&gt;MessageBox.Show("Form Loaded!"); &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;其中的参数sender表示引发事件的对象，此处代表Form1窗体。参数e代表事件包含的数据。Windows就是利用这两个参数引导正确的处理函数。其中的如下语句， &lt;br /&gt;&lt;br /&gt;MessageBox.Show(e.ToString()); &lt;br /&gt;&lt;br /&gt;其参数e.ToString()表示返回当前对象的System.String。 &lt;br /&gt;&lt;br /&gt;（4）运行程序，可以看出程序在加载窗体时，先后便会弹出两个消息提示框。这便是上面的处理函数在响应该消息。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-781948073391582813?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/781948073391582813/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=781948073391582813' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/781948073391582813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/781948073391582813'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/cload.html' title='C#中的Load事件'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-4664461895572833689</id><published>2008-10-21T04:50:00.001-07:00</published><updated>2008-10-21T04:50:43.173-07:00</updated><title type='text'>C#单据录入方法</title><content type='html'>1,界面包含3个部门, 工具栏, 单据头, 单据体. &lt;br /&gt;&lt;br /&gt;工具兰控件 主要用ToolStripMenu,ToolStripButton来做. &lt;br /&gt;&lt;br /&gt;单据头 用combobox 和textbox来做 &lt;br /&gt;&lt;br /&gt;单据体用 datagridview &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2,对用户输入的数据验证,必须输入有效的数据,这些通过定义一些事件来实现. &lt;br /&gt;&lt;br /&gt;单据头的Combobox不需要验证. &lt;br /&gt;&lt;br /&gt;datagridview中的也可以定义复杂事件。 &lt;br /&gt;&lt;br /&gt;当从一个单元格移动至另一单元格(在同一行内)： &lt;br /&gt;&lt;br /&gt;1) Cell Leave (原来的单元格) &lt;br /&gt;&lt;br /&gt;2) Cell Validating/ed (原来的单元格) &lt;br /&gt;&lt;br /&gt;3) Cell EndEdit (原来的单元格) &lt;br /&gt;&lt;br /&gt;4) Cell Enter (新的单元格) &lt;br /&gt;&lt;br /&gt;5) Cell BeginEdit (新的单元格) &lt;br /&gt;&lt;br /&gt;当从一行移动到另一行： &lt;br /&gt;&lt;br /&gt;1) Cell Leave (原来的单元格)，Row leave (原来的行) &lt;br /&gt;&lt;br /&gt;2) Cell Validating/ed (原来的单元格) &lt;br /&gt;&lt;br /&gt;3) Cell EndEdit (原来的单元格) &lt;br /&gt;&lt;br /&gt;4) Row Validating/ed (原来的行) &lt;br /&gt;&lt;br /&gt;5) Row Enter (新的行) &lt;br /&gt;&lt;br /&gt;6) Cell Enter (新的单元格) &lt;br /&gt;&lt;br /&gt;7) Cell BeginEdit (新的单元格) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3，数据的保存，修改，单据的新增功能 &lt;br /&gt;&lt;br /&gt;保存button中的事件有2个：1，验证单据的完整性。2，将界面数据写入数据库或更新数据库。 &lt;br /&gt;&lt;br /&gt;新增button中的事件也2个：1， 清除当前界面已经输入的所有数据。2，使流水号+1。 &lt;br /&gt;&lt;br /&gt;删除button中的事件1个：清空当前界面上选定的一条分录内容。 &lt;br /&gt;&lt;br /&gt;修改button提供单据查询，用主从表实现，可以修改从表内容，并且保存到数据库。 &lt;br /&gt;&lt;br /&gt;关闭button中有2个事件：1，清空当前单据界面上的所有数据，2，关闭当前窗体。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-4664461895572833689?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/4664461895572833689/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=4664461895572833689' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4664461895572833689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/4664461895572833689'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c_1779.html' title='C#单据录入方法'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-3269177940557774113</id><published>2008-10-21T04:49:00.002-07:00</published><updated>2008-10-21T04:50:19.010-07:00</updated><title type='text'>C# 开发和使用中的23个技巧</title><content type='html'>1.怎样定制VDataGrid列标题？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　DataGridTableStyle dgts = new DataGridTableStyle();  &lt;br /&gt;&lt;br /&gt;　　dgts.MappingName = "myTable"; //myTable为要载入数据的DataTable &lt;br /&gt;&lt;br /&gt;　　 &lt;br /&gt;&lt;br /&gt;　　DataGridTextBoxColumn dgcs = new DataGridTextBoxColumn();  &lt;br /&gt;&lt;br /&gt;　　dgcs.MappingName = "title_id";  &lt;br /&gt;&lt;br /&gt;　　dgcs.HeaderText = "标题ID";  &lt;br /&gt;&lt;br /&gt;　　dgts.GridColumnStyles.Add(dgcs);  &lt;br /&gt;&lt;br /&gt;　　。。。 &lt;br /&gt;&lt;br /&gt;　　dataGrid1.TableStyles.Add(dgts);    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 　　2.检索某个字段为空的所有记录的条件语句怎么写？ &lt;br /&gt;&lt;br /&gt;　　...where col_name is null  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　3.如何在c# Winform应用中接收回车键输入？ &lt;br /&gt;&lt;br /&gt;　　设一下form的AcceptButton. &lt;br /&gt;&lt;br /&gt;　　4.比如中的NUMBER(15)，在Sql Server中应是什么？ &lt;br /&gt;&lt;br /&gt;　　NUMBER(15):用numeric，精度15试试。 &lt;br /&gt;&lt;br /&gt;　　5.sql server的应用like语句的过程怎样写? &lt;br /&gt;&lt;br /&gt;　　select * from mytable where haoma like ‘%’ + @hao + ‘%’ &lt;br /&gt;&lt;br /&gt;　　6.vc# winform中如何让textBox接受回车键消息（假没没有按钮的情况下）？&lt;br /&gt;&lt;br /&gt;　　private void textBox1_KeyPress(object sender, System..Forms.KeyPressEventArgs e) &lt;br /&gt;&lt;br /&gt;　　{ &lt;br /&gt;&lt;br /&gt;　　if(e.KeyChar != (char)13) &lt;br /&gt;&lt;br /&gt;　　return;  &lt;br /&gt;&lt;br /&gt;　　else &lt;br /&gt;&lt;br /&gt;　　//do something;  &lt;br /&gt;&lt;br /&gt;　　}  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　7.为什么(Int32)cmd.ExecuteScalar()赋值给Int32变量时提示转换无效? &lt;br /&gt;&lt;br /&gt;　　Int32.Parse(cmd.ExecuteScalar().ToString());   &lt;br /&gt;&lt;br /&gt;8.DataSource为子表的DataGrid里怎样增加一个列以显示母表中的某个字段？ &lt;br /&gt;　　在子表里手动添加一个列。&lt;br /&gt;&lt;br /&gt;　　DataColumn dc = new DataColumn("newCol", Type.GetType("System.String"));  &lt;br /&gt;&lt;br /&gt;　　dc.Expression = "Parent.parentColumnName";  &lt;br /&gt;&lt;br /&gt;　　dt.Columns.Add(dc); //dt为子表  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 　　9.怎样使DataGrid显示DataTable中某列的数据时只显示某一部分？ &lt;br /&gt;&lt;br /&gt;　　select ..., SUBSTR(string, start_index, end_index) as ***, *** from ***   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　10.如何让winform的combobox只能选不能输入？ &lt;br /&gt;&lt;br /&gt;　　DropDownStyle 属性确定用户能否在文本部分中输入新值以及列表部分是否总显示。 &lt;br /&gt;&lt;br /&gt;　　值: &lt;br /&gt;&lt;br /&gt;　　DropDown --- 文本部分可编辑。用户必须单击箭头按钮来显示列表部分。 &lt;br /&gt;&lt;br /&gt;　　DropDownList --- 用户不能直接编辑文本部分。用户必须单击箭头按钮来显示列表部分。 &lt;br /&gt;&lt;br /&gt;　　Simple --- 文本部分可编辑。列表部分总可见。 &lt;br /&gt;&lt;br /&gt;　　11.怎样使winform的DataGrid里显示的日期只显示年月日部分，去掉时间？ &lt;br /&gt;&lt;br /&gt;　　sql语句里加上to_date(日期字段,'yyyy-mm-dd') &lt;br /&gt;&lt;br /&gt;　　12.怎样把数据库表的二个列合并成一个列Fill进DataSet里？ &lt;br /&gt;&lt;br /&gt;　　dcChehao = new DataColumn("newColumnName", typeof(string));  &lt;br /&gt;&lt;br /&gt;　　dcChehao.Expression = "columnName1+columnName2";  &lt;br /&gt;&lt;br /&gt;　　dt.Columns.Add(dcChehao);  &lt;br /&gt;&lt;br /&gt;　　： &lt;br /&gt;&lt;br /&gt;　　select col1||col2 from table &lt;br /&gt;&lt;br /&gt;　　sql server： &lt;br /&gt;&lt;br /&gt;　　select col1+col2 from table   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　13.如何从合并后的字段里提取出括号内的文字作为DataGrid或其它绑定控件的显示内容？即把合并后的字段内容里的左括号（和右括号）之间的文字提取出来。&lt;br /&gt;&lt;br /&gt;　　Select COL1,COL2, case &lt;br /&gt;&lt;br /&gt;　　when COL3 like ‘%（%’ THEN substr(COL3, INSTR(COL3, ‘（’ )+1, INSTR(COL3,‘）’)-INSTR(COL3,‘（’)-1) &lt;br /&gt;&lt;br /&gt;　　end as COL3 &lt;br /&gt;&lt;br /&gt;　　from MY_TABLE   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　14.当用鼠标滚轮浏览DataGrid数据超过一定范围DataGrid会失去焦点。怎样解决？ &lt;br /&gt;&lt;br /&gt;　　this.dataGrid1.MouseWheel+=new MouseEventHandler(dataGrid1_MouseWheel);  &lt;br /&gt;&lt;br /&gt;　　private void dataGrid1_MouseWheel(object sender, MouseEventArgs e) &lt;br /&gt;&lt;br /&gt;　　{ &lt;br /&gt;&lt;br /&gt;　　this.dataGrid1.Select();  &lt;br /&gt;&lt;br /&gt;　　}   &lt;br /&gt;&lt;br /&gt;15.怎样把键盘输入的‘+’符号变成‘A’？ &lt;br /&gt;　　textBox的KeyPress事件中 &lt;br /&gt;&lt;br /&gt;　　if(e.KeyChar == '+') &lt;br /&gt;&lt;br /&gt;　　{ &lt;br /&gt;&lt;br /&gt;　　SendKeys.Send("A");  &lt;br /&gt;&lt;br /&gt;　　e.Handled = true;  &lt;br /&gt;&lt;br /&gt;　　}  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　16.怎样使Winform启动时直接最大化？&lt;br /&gt;&lt;br /&gt;　　this.WindowState = FormWindowState.Maximized;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;　　17.c#怎样获取当前日期及时间，在sql语句里又是什么？ &lt;br /&gt;&lt;br /&gt;　　c#: DateTime.Now &lt;br /&gt;&lt;br /&gt;　　sql server: GetDate() &lt;br /&gt;&lt;br /&gt;　　18.怎样访问winform DataGrid的某一行某一列，或每一行每一列？ &lt;br /&gt;&lt;br /&gt;　　dataGrid[row,col] &lt;br /&gt;&lt;br /&gt;　　19.怎样为DataTable进行汇总，比如DataTable的某列值‘延吉'的列为多少？ &lt;br /&gt;&lt;br /&gt;　　dt.Select("城市='延吉'").Length;  &lt;br /&gt;&lt;br /&gt;　　20.DataGrid数据导出到Excel后0212等会变成212。怎样使它导出后继续显示为0212? &lt;br /&gt;&lt;br /&gt;　　range.NumberFormat = "0000";  &lt;br /&gt;&lt;br /&gt;　　21. &lt;br /&gt;&lt;br /&gt;　　① 怎样把DataGrid的数据导出到Excel以供打印？ &lt;br /&gt;&lt;br /&gt;　　② 之前已经为DataGrid设置了TableStyle，即自定义了列标题和要显示的列，如果想以自定义的视图导出数据该怎么办？ &lt;br /&gt;&lt;br /&gt;　　③ 把数据导出到Excel后，怎样为它设置边框啊？ &lt;br /&gt;&lt;br /&gt;　　④ 怎样使从DataGrid导出到Excel的某个列居中对齐？ &lt;br /&gt;&lt;br /&gt;　　⑤ 数据从DataGrid导出到Excel后，怎样使标题行在打印时出现在每一页？ &lt;br /&gt;&lt;br /&gt;　　⑥ DataGrid数据导出到Excel后打印时每一页显示’当前页/共几页’，怎样实现？ &lt;br /&gt;&lt;br /&gt;　　① &lt;br /&gt;&lt;br /&gt;　　private void button1_Click(object sender, System.EventArgs e) &lt;br /&gt;　　{ &lt;br /&gt;　　int row_index, col_index;  &lt;br /&gt;　　row_index = 1;  &lt;br /&gt;　　col_index = 1;  &lt;br /&gt;　　Excel.ApplicationClass excel = new Excel.ApplicationClass();  &lt;br /&gt;　　excel.Workbooks.Add(true);  &lt;br /&gt;　　DataTable dt = ds.Tables["table"];  &lt;br /&gt;　　foreach(DataColumn dcHeader in dt.Columns) &lt;br /&gt;　　excel.Cells[row_index, col_index++] = dcHeader.ColumnName;  &lt;br /&gt;　　foreach(DataRow dr in dt.Rows) &lt;br /&gt;　　{ &lt;br /&gt;　　col_index = 0;  &lt;br /&gt;　　foreach(DataColumn dc in dt.Columns) &lt;br /&gt;　　{ &lt;br /&gt;　　excel.Cells[row_index+1, col_index+1] = dr[dc];  &lt;br /&gt;　　col_index++;  &lt;br /&gt;　　} &lt;br /&gt;　　row_index++;  &lt;br /&gt;　　} &lt;br /&gt;　　excel.Visible = true;  &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;　　private void Form1_Load(object sender, System.EventArgs e) &lt;br /&gt;　　{ &lt;br /&gt;　　SqlConnection conn = new SqlConnection("server=tao; uid=sa; pwd=; database=pubs");  &lt;br /&gt;　　conn.Open();  &lt;br /&gt;&lt;br /&gt;　　SqlDataAdapter da = new SqlDataAdapter("select * from authors", conn);  &lt;br /&gt;　　ds = new DataSet();  &lt;br /&gt;　　da.Fill(ds, "table");  &lt;br /&gt;　　dataGrid1.DataSource = ds;  &lt;br /&gt;　　dataGrid1.DataMember = "table";  &lt;br /&gt;　　}   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　②dataGrid1.TableStyles[0].GridColumnStyles[index].HeaderText; //index可以从0~dataGrid1.TableStyles[0].GridColumnStyles.Count遍历。 &lt;br /&gt;&lt;br /&gt;　　③ Excel.Range range;  &lt;br /&gt;&lt;br /&gt;　　range=worksheet.get_Range(worksheet.Cells[1,1],xSt.Cells[ds.Tables[0].Rows.Count+1,ds.Tables[0].Columns.Count]);  &lt;br /&gt;&lt;br /&gt;　　range.BorderAround(Excel.XlLineStyle.xlContinuous,Excel.XlBorderWeight.xlThin,Excel.XlColorIndex.xlColorIndexAutomatic,null);  &lt;br /&gt;&lt;br /&gt;　　range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic;  &lt;br /&gt;&lt;br /&gt;　　range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle =Excel.XlLineStyle.xlContinuous;  &lt;br /&gt;&lt;br /&gt;　　range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight =Excel.XlBorderWeight.xlThin;  &lt;br /&gt;&lt;br /&gt;　　range.Borders[Excel.XlBordersIndex.xlInsideVertical].ColorIndex =Excel.XlColorIndex.xlColorIndexAutomatic;  &lt;br /&gt;&lt;br /&gt;　　range.Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous;  &lt;br /&gt;&lt;br /&gt;　　range.Borders[Excel.XlBordersIndex.xlInsideVertical].Weight = Excel.XlBorderWeight.xlThin;  &lt;br /&gt;&lt;br /&gt;　　④ range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter &lt;br /&gt;&lt;br /&gt;　　⑤ worksheet.PageSetup.PrintTitleRows = "$1:$1";  &lt;br /&gt;&lt;br /&gt;　　⑥ worksheet.PageSetup.CenterFooter = "第&amp;P页 / 共&amp;N页";  &lt;br /&gt;22.当把DataGrid的Cell内容赋值到Excel的过程中想在DataGrid的CaptionText上显示进度，但不显示。WHY？ &lt;br /&gt;&lt;br /&gt;　　... &lt;br /&gt;&lt;br /&gt;　　dataGrid1.CaptionText = "正在导出：" + (row + 1) + "/" + row_cnt;  &lt;br /&gt;&lt;br /&gt;　　System..Forms.Application.DoEvents();  &lt;br /&gt;&lt;br /&gt;　　... &lt;br /&gt;&lt;br /&gt;　　 &lt;br /&gt;　　处理当前在消息队列中的所有Windows消息。 &lt;br /&gt;&lt;br /&gt;　　当运行Windows窗体时，它将创建新窗体，然后该窗体等待处理事件。该窗体在每次处理事件时，均将处理与该事件关联的所有代码。所有其他事件在队列中等待。在代码处理事件时，应用程序并不响应。如果在代码中调用DoEvents,则应用程序可以处理其他事件。 &lt;br /&gt;&lt;br /&gt;　　如果从代码中移除DoEvents，那么在按钮的单机事件处理程序执行结束以前，窗体不会重新绘制。通常在循环中使用该方法来处理消息。 &lt;br /&gt;&lt;br /&gt;　　23.怎样从调用外部程序，如一个编译后生成的.exe? &lt;br /&gt;&lt;br /&gt;　　fscommand("exec", "应用程序.exe");  &lt;br /&gt;&lt;br /&gt;　　① 必须把flash发布为.exe &lt;br /&gt;&lt;br /&gt;　　② 必须在flash生成的.exe文件所在目录建一个名为fscommand的子目录，并把要调用的可执行程序拷贝到那里。 &lt;br /&gt;&lt;br /&gt;　　24.有没有办法用代码控制DataGrid的上下、左右的滚动？ &lt;br /&gt;&lt;br /&gt;　　dataGrid1.Select();  &lt;br /&gt;&lt;br /&gt;　　SendKeys.Send("{PGUP}");  &lt;br /&gt;&lt;br /&gt;　　SendKeys.Send("{PGDN}");  &lt;br /&gt;&lt;br /&gt;　　SendKeys.Send("{^{LEFT}"); // Ctrl+左方向键 &lt;br /&gt;&lt;br /&gt;　　SendKeys.Send("{^{RIGHT}"); // Ctrl+右方向键  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　25.怎样使两个DataGrid绑定两个主从关系的表？ &lt;br /&gt;&lt;br /&gt;　　DataGrid1.DataSource = ds;  &lt;br /&gt;&lt;br /&gt;　　DataGrid1.DataMember = "母表";  &lt;br /&gt;&lt;br /&gt;　　... &lt;br /&gt;&lt;br /&gt;　　DataGrid2.DataSouce = ds;  &lt;br /&gt;&lt;br /&gt;　　DataGrid2.DataMember = "母表.关系名";    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　26.assembly的版本号怎样才能自动生成？特别是在Console下没有通过VStudio环境编写程序时。 &lt;br /&gt;&lt;br /&gt;　　关键是AssemblyInfo.cs里的[assembly: AssemblyVersion("1.0.*")]，命令行编译时包含AssemblyInfo.cs &lt;br /&gt;&lt;br /&gt;　　27.怎样建立一个Shared Assembly？ &lt;br /&gt;&lt;br /&gt;　　用sn.exe生成一个Strong Name：keyfile.sn，放在源程序目录下 &lt;br /&gt;&lt;br /&gt;　　在项目的AssemblyInfo.cs里[assembly: AssemblyKeyFile("..\\..\\keyfile.sn")] &lt;br /&gt;&lt;br /&gt;　　生成dll后，用gacutil /i myDll.dll放进Global Assembly Cach. &lt;br /&gt;&lt;br /&gt;　　28.在Oracle里如何取得某字段第一个字母为大写英文A~Z之间的记录？ &lt;br /&gt;&lt;br /&gt;　　select * from table where ascii(substr(字段,1,1)) between ascii('A') and ascii('Z') &lt;br /&gt;&lt;br /&gt;　　29.怎样取得当前Assembly的版本号？&lt;br /&gt;&lt;br /&gt;　　Process current = Process.GetCurrentProcess();  &lt;br /&gt;&lt;br /&gt;　　FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(current.MainModule.FileName);  &lt;br /&gt;&lt;br /&gt;　　Console.WriteLine(myFileVersionInfo.FileVersion);   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;　　30.怎样制作一个简单的winform安装程序？ &lt;br /&gt;&lt;br /&gt;　　① 建一个WinForm应用程序，最最简单的那种。运行。 &lt;br /&gt;&lt;br /&gt;　　② 添加新项目-&gt;安装和部署项目，‘模板’选择‘安装向导’。 &lt;br /&gt;&lt;br /&gt;　　③ 连续二个‘下一步’，在‘选择包括的项目输出’步骤打勾‘主输出来自’，连续两个‘下一步’，‘完成’。 &lt;br /&gt;&lt;br /&gt;　　④ 生成。 &lt;br /&gt;&lt;br /&gt;　　⑤ 到项目目录下找到Setup.exe（还有一个.msi和.ini文件），执行。 &lt;br /&gt;&lt;br /&gt;31.怎样通过winform安装程序在Sql Server数据库上建表？ &lt;br /&gt;&lt;br /&gt;　　① [项目]—[添加新项] &lt;br /&gt;&lt;br /&gt;　　类别：代码；模板：安装程序类。 &lt;br /&gt;&lt;br /&gt;　　名称：MyInstaller.cs &lt;br /&gt;&lt;br /&gt;　　② 在SQL Server建立一个表，再[所有任务]—[生成SQL脚本]。 &lt;br /&gt;&lt;br /&gt;　　生成类似如下脚本（注意：把所有GO语句去掉）：&lt;br /&gt;&lt;br /&gt;　　if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MyTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) &lt;br /&gt;　　drop table [dbo].[MyTable] &lt;br /&gt;　　CREATE TABLE [dbo].[MyTable] ( &lt;br /&gt;　　[ID] [int] NOT NULL , &lt;br /&gt;　　[NAME] [nchar] (4) COLLATE Chinese_PRC_CI_AS NOT NULL &lt;br /&gt;　　) ON [PRIMARY] &lt;br /&gt;&lt;br /&gt;　　ALTER TABLE [dbo].[MyTable] WITH NOCHECK ADD &lt;br /&gt;　　CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED &lt;br /&gt;　　( &lt;br /&gt;　　[ID] &lt;br /&gt;　　) ON [PRIMARY]  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;　　③ [项目]—[添加现有项]。mytable.sql—[生成操作]-[嵌入的资源]。 &lt;br /&gt;&lt;br /&gt;　　④ 将MyInstaller.cs切换到代码视图,添加下列代码： &lt;br /&gt;&lt;br /&gt;　　先增加：&lt;br /&gt;&lt;br /&gt;　　using System.Reflection;  &lt;br /&gt;　　using System.IO;  &lt;br /&gt;　　然后： &lt;br /&gt;&lt;br /&gt;　　private string GetSql(string Name) &lt;br /&gt;　　{ &lt;br /&gt;　　try &lt;br /&gt;　　{ &lt;br /&gt;　　　　Assembly Asm = Assembly.GetExecutingAssembly();  &lt;br /&gt;　　　　Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + Name);  &lt;br /&gt;　　　　StreamReader reader = new StreamReader(strm);  &lt;br /&gt;　　　　return reader.ReadToEnd();  &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;　　catch (Exception ex) &lt;br /&gt;　　{ &lt;br /&gt;　　　　Console.Write("In GetSql:"+ex.Message);  &lt;br /&gt;　　　　throw ex;  &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;　　private void ExecuteSql(string DataBaseName,string Sql) &lt;br /&gt;　　{ &lt;br /&gt;　　System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection();  &lt;br /&gt;　　sqlConn.ConnectionString = "server=myserver; uid=sa; password=; database=master";  &lt;br /&gt;　　System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(Sql,sqlConn);  &lt;br /&gt;&lt;br /&gt;　　Command.Connection.Open();  &lt;br /&gt;　　Command.Connection.ChangeDatabase(DataBaseName);  &lt;br /&gt;&lt;br /&gt;　　try &lt;br /&gt;　　{ &lt;br /&gt;　　Command.ExecuteNonQuery();  &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;　　finally &lt;br /&gt;　　{ &lt;br /&gt;　　Command.Connection.Close();  &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;　　protected void AddDBTable(string strDBName) &lt;br /&gt;　　{ &lt;br /&gt;　　try &lt;br /&gt;　　{ &lt;br /&gt;　　ExecuteSql("master","create DATABASE "+ strDBName);  &lt;br /&gt;　　ExecuteSql(strDBName,GetSql("mytable.sql"));  &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;　　catch(Exception ex) &lt;br /&gt;　　{ &lt;br /&gt;　　Console.Write("In exception handler :"+ex.Message);  &lt;br /&gt;　　} &lt;br /&gt;　　} &lt;br /&gt;&lt;br /&gt;　　public override void Install(System.Collections.IDictionary stateSaver) &lt;br /&gt;　　{ &lt;br /&gt;　　base.Install(stateSaver);  &lt;br /&gt;　　AddDBTable("MyDB"); //建一个名为MyDB的DataBase &lt;br /&gt;　　}  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　⑤ [添加新项目]—[项目类型：安装和部署项目]—[模板：安装项目]—[名称：MySetup]。 &lt;br /&gt;&lt;br /&gt;　　⑥ [应用程序文件夹]—[添加]—[项目输出]—[主输出]。 &lt;br /&gt;&lt;br /&gt;　　⑦ 解决方案资源管理器—右键—[安装项目(MySetup)]—[视图]—[自定义操作]。[安装]—[添加自定义操作]—[双击：应用程序文件夹]的[主输出来自***(活动)]。 &lt;br /&gt;32.怎样用TreeView显示父子关系的数据库表（winform）？ &lt;br /&gt;&lt;br /&gt;　　三个表a1,a2,a3, a1为a2看母表,a2为a3的母表。 &lt;br /&gt;&lt;br /&gt;　　a1: id, name &lt;br /&gt;&lt;br /&gt;　　a2: id, parent_id, name &lt;br /&gt;&lt;br /&gt;　　a3: id, parent_id, name &lt;br /&gt;&lt;br /&gt;　　用三个DataAdapter把三个表各自Fill进DataSet的三个表。 &lt;br /&gt;&lt;br /&gt;　　用DataRelation设置好三个表之间的关系。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　foreach(DataRow drA1 in ds.Tables["a1"].Rows) &lt;br /&gt;　　{ &lt;br /&gt;　　　tn1 = new TreeNode(drA1["name"].ToString());  &lt;br /&gt;　　　treeView1.Nodes.Add(tn1);  &lt;br /&gt;　　　foreach(DataRow drA2 in drA1.GetChildRows("a1a2")) &lt;br /&gt;　　　{ &lt;br /&gt;　　tn2 = new TreeNode(drA2["name"].ToString());  &lt;br /&gt;　　tn1.Nodes.Add(tn2);  &lt;br /&gt;&lt;br /&gt;　　foreach(DataRow drA3 in drA2.GetChildRows("a2a3")) &lt;br /&gt;　　{ &lt;br /&gt;　　　tn3 = new TreeNode(drA3["name"].ToString());  &lt;br /&gt;　　　tn2.Nodes.Add(tn3);  &lt;br /&gt;　　} &lt;br /&gt;　　　} &lt;br /&gt;　　}  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 　　33.怎样从一个form传递数据到另一个form？ &lt;br /&gt;&lt;br /&gt;　　假设Form2的数据要传到Form1的TextBox。 &lt;br /&gt;&lt;br /&gt;　　在Form2：&lt;br /&gt;&lt;br /&gt;　　// Define delegate &lt;br /&gt;　　public delegate void SendData(object sender);  &lt;br /&gt;　　// Create instance &lt;br /&gt;　　public SendData sendData;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　在Form2的按钮单击事件或其它事件代码中：&lt;br /&gt;&lt;br /&gt;　　if(sendData != null) &lt;br /&gt;　　{ &lt;br /&gt;　　　sendData(txtBoxAtForm2);  &lt;br /&gt;　　} &lt;br /&gt;　　this.Close(); //关闭Form2 &lt;br /&gt;&lt;br /&gt;　　在Form1的弹出Form2的代码中： &lt;br /&gt;　　Form2 form2 = new Form2();  &lt;br /&gt;　　form2.sendData = new Form2.SendData(MyFunction);  &lt;br /&gt;　　form2.ShowDialog();  &lt;br /&gt;&lt;br /&gt;　　==================== &lt;br /&gt;&lt;br /&gt;　　private void MyFunction(object sender) &lt;br /&gt;　　{ &lt;br /&gt;　　textBox1.Text = ((TextBox)sender).Text;  &lt;br /&gt;　　}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18523442759850498-3269177940557774113?l=fjh777.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjh777.blogspot.com/feeds/3269177940557774113/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18523442759850498&amp;postID=3269177940557774113' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/3269177940557774113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18523442759850498/posts/default/3269177940557774113'/><link rel='alternate' type='text/html' href='http://fjh777.blogspot.com/2008/10/c-23.html' title='C# 开发和使用中的23个技巧'/><author><name>fjh222777123@163.com</name><uri>http://www.blogger.com/profile/15939799481425928172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18523442759850498.post-1663390235318542091</id><published>2008-10-21T04:49:00.001-07:00</published><updated>2008-10-21T04:49:53.873-07:00</updated><title type='text'>c#连接MDB,SQL数据库代码</title><content type='html'>c#数据库连接代码&lt;br /&gt;&lt;br /&gt;///系统引用&lt;br /&gt;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Data.OleDb;&lt;br /&gt;using System.Data.SqlClient;&lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// 必需的设计器变量。&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;private System.ComponentModel.Container components = null;&lt;br /&gt;private System.Data.DataSet myDataSet;&lt;br /&gt;&lt;br /&gt;c#本地MDB数据库连接&lt;br /&gt;private void menuItem2_Click(object sender, System.EventArgs e)&lt;br /&gt;  {&lt;br /&gt;   try&lt;br /&gt;   { &lt;br /&gt;    //创建一个 OleDbConnection对象 &lt;br /&gt;    string strCon = \" Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = ../../database/MDB数据库名称.mdb\" ; &lt;br /&gt;    OleDbConnection myConn = new OleDbConnection ( strCon ) ; &lt;br /&gt;    string strCom = \" SELECT * FROM 数据表名称\" ; &lt;br /&gt;    //创建一个 DataSet对象 &lt;br /&gt;    myDataSet = new DataSet ( ) ; &lt;br /&gt;    myConn.Open ( ) ; &lt;br /&gt;    OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; &lt;br /&gt;    myCommand.Fill ( myDataSet , \"数据表名称\" ) ; &lt;br /&gt;    myConn.Close ( ) ; &lt;br /&gt;    //关闭连接&lt;br /&gt;    statusBar1.Text=\"本地MDB数据库连接成功\";&lt;br /&gt;   } &lt;br /&gt;   catch ( Exception ex ) &lt;br /&gt;   { &lt;br /&gt;    statusBar1.Text=\"本地MDB数据库连接失败\";&lt;br /&gt;    MessageBox.Show ( \"连接本地MDB数据库发生错误：\" + ex.ToString ( ) , \"错误！\" ) ; &lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;c#远程MDB数据库连接&lt;br /&gt;c#本地SQL数据库连接&lt;br /&gt;private void menuItem3_Click(object sender, System.EventArgs e)&lt;br /&gt;  {&lt;br /&gt;   try&lt;br /&gt;   { &lt;br /&gt;    //创建一个 SqlConnection对象 &lt;br /&gt;    string strCon = \"Integrated Security=SSPI;Initial Catalog=\'数据库名称\';Data Source=\'本地计算机名\';User ID=\'登录用户名\';Password=\'登录用户密码\';Connect Timeout=30\"; &lt;br /&gt;    SqlConnection myConn = new SqlConnection ( strCon ) ;     &lt;br /&gt;    string strCom = \" SELECT * FROM 数据表名称\" ; &lt;br /&gt;    //创建一个 DataSet对象 &lt;br /&gt;    myDataSet = new DataSet ( ) ; &lt;br /&gt;    myConn.Open ( ) ; &lt;br /&gt;    SqlDataAdapter myCommand = new SqlDataAdapter ( strCom , myConn ) ; &lt;br /&gt;    myCommand.Fill ( myDataSet , \"数据表名称\" ) ; &lt;br /&gt;    myConn.Close ( ) ; &lt;br /&gt;    //关闭连接&lt;br /&gt;    statusBar1.Text=\"本地SQL数据库连接成功\";&lt;br /&gt;   } &lt;br /&gt;   catch ( Exception ex1 ) &lt;br /&gt;   { &lt;br /&gt;    statusBar1.Text=\"本地SQL数据库连接失败\";&lt;br /&gt;    MessageBox.Show ( \"连接本地SQL数据库发生错误：\" + ex1.ToString ( ) , \"错误！\" ) ; [Page]&lt;br /&gt;   }&lt
