‘.NET’ 分类下的所有文章
2010九月30

线程

C#语法 评论关闭
    Thread mouseThread = new Thread(new ThreadStart(Run));//两个线程共同做一件事情
            mouseThread.Name = "mouneClick";
            mouseThread.Start();

       public void Run()
    {
        int dx = 40;
        int dy = 40;
        while (true)
        {
            if (IsMouseStart)
            {
                //WriteLog(IsMouseStart.ToString());
                mouse_event((int)(MouseEventFlags.LeftDown | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero);
                mouse_event((int)(MouseEventFlags.LeftUp | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero);
                Thread.Sleep(100);

            }

        }
    }

//在最后要去掉线程
 if (mouseThread != null)
            {
                mouseThread.Abort();
            }
2010九月30

反射

C#语法 评论关闭

1,//调用Type类的静态方法GetType,并将Type对象引用返回给tp变量
Type tp = Type.GetType(“ClassA”, false, false);
//tp对象调用GetMethods方法,返回对象中所有公共方法数组,并赋值给ma数组
MethodInfo[] ma = tp.GetMethods();
Console.WriteLine(“\n\t=================ClassA类所含的方法=================”);
//遍历ma数组中的所有MethodInfo类型子项
foreach (MethodInfo s in ma){
//依次输出MethodInfo类型子项的属性值
Console.WriteLine(“\n\t【{0}方法】”, s.Name);
Console.Write(“方法所属类名称:【{0}】”, s.DeclaringType);
Console.WriteLine(“\t方法是否为构造函数:【{0}】”, s.IsConstructor);
Console.Write(“方法是否为public成员:【{0}】”, s.IsPublic);
Console.WriteLine(“\t方法是否为internal成员:【{0}】”, s.IsAssembly);
Console.Write(“方法是否为protected成员:【{0}】”, s.IsFamily);
Console.WriteLine(“\t方法是否为private成员:【{0}】”, s.IsPrivate);
Console.Write(“方法是否为泛型方法:【{0}】”, s.IsGenericMethod);
Console.WriteLine(“\t方法是否为静态方法:【{0}】”, s.IsStatic);
Console.Write(“方法是否为virtual方法:【{0}】”, s.IsVirtual);
Console.WriteLine(“\t方法返回类型为:【{0}】”, s.ReturnType);

//调用s的GetParameters方法,返回ParameterInfo类型数组//遍历数组的ParameterInfo类型子项
foreach (ParameterInfo pms in s.GetParameters()){//输出ParameterInfo类型子项的属性
Console.WriteLine(“\n\t——【{0}参数】——”, pms.Name);
Console.Write(“参数类型:【{0}】”, pms.ParameterType);
Console.WriteLine(“\t参数位置:【{0}】”, pms.Position);
}
}??

注:当跨项目引用dll时要采用如下形式:
Assembly asmb = Assembly.LoadFrom(“EnterpriseServerBase.dll”) ;
Type supType = asmb.GetType(“EnterpriseServerBase.DataAccess.IDBAccesser”) ;
?
或者在当前项目已经引用目标dll的情况下采用:
Type supType = typeof(BNameSpace.SubSpace.Class);

2,得到所有属性
? Type type = typeof(T);???? System.Reflection.PropertyInfo[] properties = type.GetProperties();
//可用 properties[i].SetValue(t, dr[properties[i].Name], null); 赋值

3,创建对象实例
?T t = Activator.CreateInstance<T>();??
或者:Type type = typeof(T);????? T t = Activator.CreateInstance(type);

4,调用方法:
Assembly asmb = Assembly.LoadFrom(“LvShouSecurity.dll”);
//Type supType = asmb.GetType(“LvShouSecurity.SecurityMan”);
MethodInfo m = asmb.GetType(“LvShouSecurity.SecurityMan”).GetMethod(“Encrypto”);
Object ret = m.Invoke(null, new object[]{“hello”});

2010九月30

文件操作

C#语法 评论关闭

1,遍历
C#遍历指定文件夹中的所有文件
DirectoryInfo TheFolder=new DirectoryInfo(folderFullName);
//遍历文件夹
foreach(DirectoryInfo NextFolder in TheFolder.GetDirectories())
this.listBox1.Items.Add(NextFolder.Name);
//遍历文件
foreach(FileInfo NextFile in TheFolder.GetFiles()) //foreach(FileInfo NextFile in TheFolder.GetFiles(“*.cs”)) 找类文件
this.listBox2.Items.Add(NextFile.Name);

FileInfo.Exists:获取指定文件是否存在;
FileInfo.Name,FileInfo.Extensioin:获取文件的名称和扩展名;
FileInfo.FullName:获取文件的全限定名称(完整路径);
FileInfo.Directory:获取文件所在目录,返回类型为DirectoryInfo;
FileInfo.DirectoryName:获取文件所在目录的路径(完整路径);
FileInfo.Length:获取文件的大小(字节数);
FileInfo.IsReadOnly:获取文件是否只读;
FileInfo.Attributes:获取或设置指定文件的属性,返回类型为FileAttributes枚举,可以是多个值的组合
FileInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime:分别用于获取文件的创建时间、访问时间、修改时间;

2,读写


 //创建并写入(将覆盖已有文件)
      if (!File.Exists(path))
      {
         using (StreamWriter sw = File.CreateText(path))
         {
            sw.WriteLine("Hello");
         }
      }
      //读取文件
      using (StreamReader sr = File.OpenText(path))
      {
        string s = "";
        while ((s = sr.ReadLine()) != null)
        {
           Console.WriteLine(s);
             if (s.IndexOf("aaa") != -1)
                {
                   //.... 搜索文件是否包含某关键字
                }
        }
     }
     //删除/拷贝
     try
     {
        File.Delete(path);
        File.Copy(path, @"f:\tt.txt");
     }
     catch (Exception e)
     {
        Console.WriteLine("The process failed: {0}", e.ToString());
     }
   }

//查找关键字是否存在于指定目标所有文件中的任一
    private void SearchKeyWordListInDirectroyFiles(string DirectoryPath, IList KeyWordsList,string filePattern ) {
        //KeyWordsList,关键字集合,filePattern指定搜索哪些文件,notFile指定不搜索哪个文件
        try
        {
            DirectoryInfo di = new DirectoryInfo(DirectoryPath);
            foreach (FileInfo NextFile in di.GetFiles(filePattern))
            {
                using (StreamReader sr = NextFile.OpenText())
                    {
                        string s = "";
                        while ((s = sr.ReadLine()) != null)
                        {
                            for (int i = 0; i < KeyWordsList.Count; i++)
                            {
                                if (s.IndexOf(KeyWordsList[i].ToString()) != -1)
                                {
                                    KeyWordsList.RemoveAt(i);
                                }
                            }
                        }
                    }

            }

            foreach (DirectoryInfo NextFolder in di.GetDirectories())
            {
                SearchKeyWordListInDirectroyFiles(NextFolder.FullName, KeyWordsList, filePattern);
            }

        }
        catch (Exception e) { 

        }
    }
2010九月30

.NET 中的数字格式化,日期格式化

C#语法 评论关闭

1,基本内容是:可以在 Console.WriteLine(以及 String.Format,它被 Console.WriteLine 调用)中的格式字符串内的括号中放入非索引数字的内容。
格式规范的完整形式如下:
{index [, width][:formatstring]}
其中,index 是此格式程序引用的格式字符串之后的参数,从零开始计数;width(如果有的话)是要设置格式的字段的宽度(以空格计)。width 取正数表示结果右对齐,取负数则意味着数字在字段中左对齐。formatstring 是可选项,其中包含有关设置类型格式的格式说明.
2,数字格式
请注意,数字的格式是区分语言的:分隔符以及分隔符之间的空格,还有货币符号,都是由语言决定的 ? 默认情况下,是您计算机上的默认语言。默认语言与执行线程相关,可以通过 Thread.CurrentThread.CurrentCulture 了解和设置语言。有几种方法,可以不必仅为一种给定的格式操作就立即更改语言。
内置类型的字母格式
有一种格式命令以单个字母开头,表示下列设置:
G?常规,E 或 F 中较短的
F?浮点数,常规表示法
E?用 E 表示法表示的浮点数(其中,E 代表 10 的次幂)
N?带有分隔符的浮点数(在美国为逗号)? 如:N4 代表取四位小数
C?货币,带有货币符号和分隔符(在美国为逗号)
D?十进制数,仅用于整型
X?十六进制数,仅用于整型

double pi = Math.PI;
double p0 = pi * 10000;
int i = 123;

Console.WriteLine(“pi, G4?? {0, 25:G4}”, pi); //???????????????????? 3.142

Console.WriteLine(“pi, G4?? {0, 25:G4}”, pi); //???????????????????? 3.142

Console.WriteLine(“i,? D7?? {0, 25:D7}”, i ); //?????????????????? 0000123

2010九月30

字符串操作

C#语法 评论关闭

1.字符串拼接:

string msg = ” Hello, ” + thisUser.Name + “.Today is ” + DateTime.Now.ToString( ));

更有效率的写法:

string msg = string .Format ( ” Hello, {0}. Today is {1}” , thisUser.Name, DateTime.Now.ToString( ));

2.大量数据拼接则使用StringBuilder。

3.字符串的比较:

(1)判断是否是空串

if ( str != ” ” )与if ( str == ” ” )

更有效率的写法:

if ( str.Length != 0 )与if ( str.Length ==0 )

有效率且可读性更好的写法:

if ( str != string .Empty )与if( str .Equals( string .Empty)

比较是否是NULL或空字串用:string.IsNullOrEmpty

(2) 字符串之间的比较

?if (string.Compare(s,b,true) ==0)?? s<b 小于0,s==b ,0 s>b 大于0 这种比较用true指定忽略大小写,不用再toUpper()之类

4,截取最后一位之前的数据TrimEnd
string s = “1,2,3,4,5,”;
Console.Write(s.ToString().TrimStart(‘,’));
Console.Read();

5,分割字符串:
1)单个字符:string[] args = str.split(‘,’);
2)字符串切分:string[] arrays = Regex.Splits,”##”,RegexOptions.IgnoreCase); //System.Text.RegularExpressions;

6,转换:

int.Parse:用法,将抛出异常

Convert.ToInt32(s): 当s为空时不抛出异常,当为string.Empty或字符串时”sdfsd”则抛出异常

int.TryParse(s,out i) 不抛出异常,若有异常,返回false,

//性能:int.TryParse > int.Parse > Convert.ToInt32

7,求两个整数的商及余数

int yes; double s = Math.DivRem(5,0,out yes);

8, 返回>=指定数字的最小整数 Math.Ceiling(0.5)

2010九月30

正则表达式

1,资料

2,特殊字母
(1)
. 匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 “\.”

^ 匹配输入字符串的开始位置。要匹配 “^” 字符本身,请使用 “\^”

$ 匹配输入字符串的结尾位置。要匹配 “$” 字符本身,请使用 “\$”

( ) 标记一个子表达式的开始和结束位置。要匹配小括号,请使用 “\(” 和 “\)”

[ ] 用来自定义能够匹配 ‘多种字符’ 的表达式。要匹配中括号,请使用 “\[" 和 "\]”

{ } 修饰匹配次数的符号。要匹配大括号,请使用 “\{” 和 “\}”

? 修饰匹配次数为 0 次或 1 次。要匹配 “?” 字符本身,请使用 “\?”

+ 修饰匹配次数为至少 1 次。要匹配 “+” 字符本身,请使用 “\+”

* 修饰匹配次数为 0 次或任意次。要匹配 “*” 字符本身,请使用 “\*”

| 左右两边表达式之间 “或” 关系。匹配 “|” 本身,请使用 “\|”

(2)“\”
\w 可以匹配任何一个字母或者数字或者下划线

\W W大写,可以匹配任何一个字母或者数字或者下划线以外的字符

\s 可以匹配空格、制表符、换页符等空白字符的其中任意一个

\S S大写,可以匹配任何一个空白字符以外的字符

\d 可以匹配任何一个 0~9 数字字符

\D D大写,可以匹配任何一个非数字字符

(3) {}
{n} 表达式固定重复n次,比如:”\w{2}” 相当于 “\w\w”

{m, n} 表达式尽可能重复n次,至少重复m次:”ba{1,3}”可以匹配 “ba”或”baa”或”baaa”

{m, } 表达式尽可能的多匹配,至少重复m次:”\w\d{2,}”可以匹配 “a12″,”x456″…

2010九月30

基本语法2

C#语法 评论关闭

19, C#的数组

C#的数组都是对象,继承自Array类,故都拥有属性及方法,如Rank,数组的维数,equals等。而java中的数组只有一个length属性。 Array intArray1 = Array.CreateInstance(typeof(int), 5); 等同于:int[] intArray1 = new int[5]; int[] intArray2 = (int[])intArray1;

除一般数组外,C#支持不规则数组如: int[][] jagged = new int[3][];
jagged[0] = new int[2] { 1, 2 };
jagged[1] = new int[6] { 3, 4, 5, 6, 7, 8 };
jagged[2] = new int[3] { 9, 10, 11 };
20,操作符:
is 判断左是否是右类型
as 类型转换

21,运算符重载
Vector x = new Vector ( 1,1 ); Vector y = new Vector (2,2)
Vector z = x + y // 或者用point z = x.add( y ); 但显然前者更直观。

实现:方法为public , static 运算符前加operator: public static Vector operator + (Vector lhs, Vector rhs)
{
Vector result = new Vector(lhs);
result.x += rhs.x;
result.y += rhs.y;
result.z += rhs.z;
return result;
} //此时 x + y会执行此方法,实际上,当出现运算符时,c#都先在左,右操作数的方法找是否具有重载此操作符的方法,且此方法参数与给出的操作符左右操作数相同,若相同,执行之。
x = 2 * x public static Vector operator * (int lhs, Vector rhs)
{
Vector result = new Vector(lhs);
result.x = 2 * rhs.x;
result.y += 2 * rhs.y;
return result;
} 若是x = x * 2 则不会执行,因为形参不匹配,此时需要再定义一个 public static Vector operator * (Vector rhs,int lhs )
{
return lhs * rhs;
}
能重载的运算符有: +, *, /, -, %
+, -, ++, –
&, |, ^, <<, >>
!, ~true, false
==, !=,>=, <=>, <, //没有 = 此外: true false;== !=; > <; >= <=; 重载时重载一个,另一个必须重载且返回结果要为boolean ,在重载了 + 之后相当于重载了+= ,+=不能显式重载
22, 委托 --- 类是数据,方法也可当做数据,也能被赋值。
using System;
public partial class AA
{
public delegate string show( string name );

public string list( string name )
{
return "hdello world " + name;
}

public static void Main(){
AA a = new AA();
//show _show = new show(a.list);
show _show = a.list;
Console.Write(_show("123"));
Console.Write(a.go( _show ));

}
public string go( show _show ){
return _show("345");
}
}

委托可当做类来看待,即委托方法就是一个类,可用new来创建,同js,不同js的方法当成类还可以有属性。

委托不要方法体, 前要加关键字 delegate
调用:委托方法 + 括号, 直接用,不用创建对象引用。
方法当做变量来看,在赋值,传参时当然不要用(), 只有在调用时才用()
委托还可以进行 + , - 操作,一次运行多个方法,但方法返回值最好为void,否则后者会将前者覆盖掉

using System;
public partial class AA
{
public delegate void show( string name );

public void list( string name )
{
Console.Write("hdello world " + name);
}

public void list1( string name )
{
Console.Write( "list1 world " + name);
}

public static void Main(){
AA a = new AA();
show _show = a.list;
_show += a.list1;
_show("123");

}

}

23,集合
Hashtable ht = new Hashtable();
foreach (DictionaryEntry de in myHT) {
Console.Write( dr.key + dr.value );
}
取值: ht["name"]
//注意,因为HashTable是按散列排序,不是数据那种位置类的,故它的输出与add的位置不同。
IList接口 List 提供范型 List list = new List(); list[0]
java中接口与范型都是List

2010九月30

基本语法1

C#语法 评论关闭

1,编译类文件:csc Class1.cs ? ? ? ?因编译后直接生成.exe文件,故可直接点击运行??? csc:开始–2008 – tools – 命令行提示

?2,C#的命名空间类似于java中的包的概念

?3,静态成员只能通过类名来访问,不能通过对象实例来访问

?4, 常量定义用const,而不是java中的final,并且const自动为static类型,因java的常量支持构造器初始化故不是自动static类型
?? ? ? 同时常量定义还可以用readonly,它同final一样,在运行时才确定其值,故它的值可以在构造函数中给值,即然如此,那么它就不再自动为
?? ? ? static类型
?? ? ? var : 代表任意类型,在方法内部使用如:var i = 10
?
?5,值类型

  • ??java中的基型在c#称为值类型,如int,并且每个值类型实际上是一个struct,也拥有自己的方法!!! ?
  • ??值类型分为有符号数与无符号数如int?( – 2 31 :2 31 – 1) ?而对应的无符号数uint(0:2 32 – 1)
  • ??int 与 char的转换要强制执行,而不再是默认
  • ??char大小为16位,故可以用来存一个汉字如:char c = ‘中’,同java。从8位上升到16位的原因是ASCII码表示不完所有字符,如汉字,故当出现符号与汉字在一起时,单个截取就不用再担心汉字被一分为二的问题。
  • ??转义字符\ 但字符串中多时如路径就要写很多\\可用@:string filepath = @”C:’ProCSharp\First.cs”; \就会是\而不代表转义。
  • ??switch可以用字符串,而java只能用int以下
6,迭代
?? ? ?迭代多了一个foreach,可以遍历字符串,数组,集合中全部元素,但在遍历时不能改变其值,若想改变用for 如:
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ??String s = “abd雪ad”;?? ? ? ? ?foreach( char d in s ){??Console.WriteLine(d);???}
7,String与string的区别:
?? ??string是c#中的类,String是Framework的类,如果用string,编译器会把它编译成String,所以如果直接用String就可以让编译器少做一点点工作。
类似的还有:

?? ?using?string?=?System.String;?
?? ?using?sbyte?=?System.SByte;?
?? ?using?byte?=?System.Byte;?
?? ?using?short?=?System.Int16;?
?? ?using?ushort?=?System.UInt16;
?? ?using?int?=?System.Int32;?
?? ?using?uint?=?System.UInt32?

7, 输入输出 — Console
????? ?输入:Console.ReadLine();
?? ?? ?输出:Console.WriteLine(s);
?? ? ?格式化输出:Console.WriteLine(“{0} plus {1} equals {2}”, i, j, i + j); (类似于C中的printf)
8, 程序说明文档。java中用javadoc提取,在程序中用@author之类定义
?? ?c#以“///”开头,也要加一些关键字,如:
?? ? ? ?/// <summary>
?? ? ? ?/// The Add method allows us to add two integers.
?? ? ? ?/// </summary>
?? ? ? ?/// <returns> Result of the addition (int) </returns>
?? ? ? ?/// <param name=”x”> First number to add </param>
?? ? ? ?/// <param name=”y”> Second number to add </param>
?? ? ? ?public static int show(int x, int y) {
?? ? ? ? ? ?return 0;
?? ? ? ?}?
?? ? ? 提取时用:csc /doc Test.xml Test.cs ? ? ?生成的是XML文件,而不是HTML文件
9 函数传参
??默认是值传递。同java,不会改变传来的值,但能影响其所指的值,即所指的值改变,原来的实参也会发生相应变化。
  • ?ref :显示指明是引用传递,此时即使传来的基型,在方法中改变,实参也会改变
  • ?out: 也是指明引用传递,不过实参可以不初始化传值,注意的是实参与形参前都要加上out前缀。
10 生成属性:
???public string Account
?? ? ? ?{
?? ? ? ? ? ?get { return _Account; }
?? ? ? ? ? ?set { _Account = value; }
?? ? ? ?}
?或者:?public string Account{ get; set; }
11. 构造函数:与java不同的是多了一个static构造函数,在类第一次创建对象时由系统执行
?? ?static User()
?? ?{
?? ??? ?DateTime now = DateTime.Now;
???? ? ?if (now.DayOfWeek == DayOfWeek.Saturday
?? ?? ??? ??|| now.DayOfWeek == DayOfWeek.Sunday)
?? ?? ??BackColor = Color.Green;
?? ?? ??else
???? ? ?BackColor = Color.Red;
?? ?}
?因由系统调用,故在外部是不能访问的,可以再有一个无参的构造器!

12,结构体与类的区别
struct PhoneCustomerStruct
{
public const string DayOfSendingBill = “Monday”;
public int CustomerID;
public string FirstName;
public string LastName;
public void show(){? }? //方法
}

创建:PhoneCustomerStruct pcs = new PhoneCustomerStruct();
与class相似,不同在于:1,结构体不能被继承,不能定义无参构造器
???????????????????????????????????? 2,结构体是值类型,类是引用类型。结构体存放在栈内,而类存放在堆中。

13,同java一样, C#只能继承自一个类,但可实现多个接口。重载时父类方法前要加virtual, 子类覆盖方法前加override, 而java所有父类方法都是virtual,故可不加此关键字。注:c#中若写上virtual, 子类同名方法前最好加上一个new, 代表这是此类型对象中的一个新的方法。
调用父类方法用base, 类似于java中的super.

14, 抽象类用abstract定义,抽象的类方法自动为virtual类型

15,在java中,final的类不能被继承,final的方法不能被覆盖,c#中用sealed, sealed的类不能被继承,sealed的方法不能被覆盖。其实若不想方法被覆盖的话将方法不声明为virtual即可。 同java一样,c#中的string也是只读的。

16, 修饰符:
? public ? 可以被外部成员调用 ?
? internal ? 可以在当前项目调用 ?
? protected ? 只能在被类的成员和该类的子类调用 ?
? private ? 只能在被类的成员调用
? protected internal ? :程序集及子类中调用都可。

17,c#类文件中可有多个public类,而java只能有一个,且此类的名称要与文件名相同,而C#无此限制。

18, c#的Interface与java的interface相同!接口名称通常以”I“开头, 实现接口但不用implements,而用”:‘, 接口之间继承也是用的号,即类继承,实现接口,接口之间的继承都用冒号。

19, C#的数组

  • C#的数组都是对象,继承自Array类,故都拥有属性及方法,如Rank,数组的维数,equals等。 而java中的数组只有一个length属性。 ? ?? Array intArray1 = Array.CreateInstance(typeof(int), 5);? 等同于:int[] intArray1 = new int[5]; int[] intArray2 = (int[])intArray1; ????????
  • 除一般数组外,C#支持不规则数组如:????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? int[][] jagged = new int[3][];
    jagged[0] = new int[2] { 1, 2 };
    jagged[1] = new int[6] { 3, 4, 5, 6, 7, 8 };
    jagged[2] = new int[3] { 9, 10, 11 };
2010九月29

ADO.NET 总述

1,ado.net微软在.NET中创建分布式和数据共享应用程序的开发接口,它就是一组处理数据的类。

 2, 连接数据库的两种状态 -- 有连接,无连接。
    (1)有连接:用户得到的数据始终与数据源连接,直到应用程序结束。因数据是实时的,故可用连接状态来读取数据,以保持数据的最新。
            好处:得到的数据总是最新的。同步问题易于解决,实时性高
            缺点:必须保持持续的网络连接,扩展性差。
    (2)无连接:从数据源得到数据后,这部分数据存储到内在中,可以进行数据的编辑,与更改。
            好处:可以在任何时间操作,不独占连接。
            缺点:数据不是实时的,要解决同步问题。

 3,有连接的操作:主要用来数据的读取。连接数据步骤:
       (1)声明SqlConnecton对象,并指定连接字符串属性
       (2)声明SqlCommand对象,指定sql命令及SqlConnection
       (3)SqlCommnad执行方法,返回数据集
       (4)关闭数据集,关闭Connection

        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = "Data Source=192.168.16.55;Initial Catalog=BRM;persist security info=False;user id=BRM;password=BRM2009;min pool size=1;max pool size=100;" ;
        conn.Open();
        SqlCommand command = new SqlCommand();
        command.Connection = conn;
        command.CommandText = "SELECT * FROM bdOrder";
        SqlDataReader  dr = command.ExecuteReader();
        GridView1.DataSource = dr;
        GridView1.DataBind();
        dr.Close();
        conn.Close();  //注若在GridView获取数据之前Close关闭,则将收不到数据。但在无连接进可在之前关闭,因为数据已存入在内存中。

       注:利用SqlConnection, SqlCommand, SqlDataReader默认是支持SqlServer的,若想支持MySql,项目中要引入具体的dll文件 如引入MySql.Data.dll, 在程序中using MySql.Data.MySqlClient;利用MySqlConnection,MySqlCommand,MySqlDataReader即可。
SqlCommand 常用方法:
    (1)更新删除操作:ExecuteNonQuery 对连接执行 Transact-SQL 语句并返回受影响的行数, int类型              返回数据集操作: ExecuteReader 已重载。 将 CommandText 发送到 Connection 并生成一个 SqlDataReader。 返回一个数据操作: ExecuteScalar 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。 
         返回一个XML: ExecuteXmlReader 将 CommandText 发送到 Connection 并生成一个 XmlReader 对象。 

  (2) 传参
             1),直接在CommandText写参数;如:command.CommandText = "SELECT * FROM bdOrder WHERE id>" + id;2),利用SqlParameter传参,防止Sql注入
             command.CommandText = "SELECT * FROM mdCustomerType WHERE ORDERBY orderby";
                          SqlParameter sp = new SqlParameter( "@orderby" ,8);
                          command.Parameters.Add(sp);
        注:不同的数据库用的符号是不同的,SqlServer用 “@”, 而MySql 则用 “? 

4, 无连接的操作, 区别在于执行数据操作时用的是SqlDataAdapter,可利用SqlCommand构造Sql语句,并传参。最后是SqlDataAdapter来执行 返回的结果用Fill方法填充DataSet或DataTable
        (1)string ConnectionString = "Data Source=192.168.16.55;Initial Catalog=BRM;persist security info=False;user id=BRM;password=BRM2009;min pool size=1;max pool size=100;";
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = ConnectionString;
        conn.Open();
        SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM bmdCustomer",conn);
        DataSet ds = new DataSet();
        sda.Fill( ds );
        conn.Close();             //conn可提前关闭
        GridView1.DataSource = NoConnection(conn);
        GridView1.DataBind();
//操作也可用:
       SqlDataAdapter sda = new SqlDataAdapter();
        SqlCommand command = new SqlCommand();
        command.Connection = conn;
        command.CommandText = "SELECT * FROM mdCustomerType WHERE ORDERBY >@orderby";
        SqlParameter sp = new SqlParameter("@orderby", 10);
        command.Parameters.Add(sp);
        sda.SelectCommand = command;   //这样就可传参。
       其实SqlDataAdapter就是SqlCommand的适配器,主要内容由SqlCommand完成构建,它只是负责执行。

     (2)SqlDataAdapter 类似于SqlCommand 的Exec方法
               查询:  sda.SelectCommand;
               插入:  sda.InsertCommand;
               更新:  sda.UpdateCommand;
               删除:  sda.DeleteCommand;

5,执行存储过程
      指定SqlCommand的CommandType, CommandText即可
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandType = CommandType.StoredProcedure;   //默认执行的是Sql语句
        cmd.CommandText = "bmdCustomer_sel";                      //存储过程名称, 默认是Sql语句
        SqlParameter[] storedParameters = {
                                          new SqlParameter( "@TranType", "ID" ),
                                          new SqlParameter( "@ID", "277" )
                                          };
        foreach (SqlParameter sp in storedParameters) {
            cmd.Parameters.Add( sp );
        }

        SqlDataReader dr = cmd.ExecuteReader();

注:CommandType指定类型:(1)Text :默认,CommandText为Sql命令。
                                            (2)TableDirect CommandText为表的名称。 (3)StoredProcedure CommandText为存储过程的名称。
2010九月29

.net与java不同

ASP.NET 评论关闭

1,J2EE支持多平台,单一语言;.Net支持多语言,单一平台

2,页面数据提交,.net一般写在按纽的onClick事件中,而java要配置from的action

3,Visual Studio比较Eclipse

  • Visual Studio的工具窗口占用了过多的空间,没有Eclipse简洁
  • Eclipse编辑器右侧有个特殊区域代表了整个代码文件,断点、错误、警告、书签都会在这里标识出来,不论代码有多长,点击一下就可以定位,非常的方便。
  • 在Visual Studio里面定位代码,要么用鼠标滚轮上下翻动直到找到内容,要么从成员列表的组合框里选择,不论哪一种,都没有Eclipse来得简洁方便。
  • 重构功能比较初级
  • Visual Studio支持代码重构,Eclipse也支持,但是你比较一下两者的菜单就知道,它们对重构的支持程度完全不是同一个级别的
  • 缺少智能化的快速修复
  • Eclipse不仅找出编译错误,还能够为许多种类型的错误提供修复选项。
  • Eclipse是完全免安装的,Visual Studio要重启两次 阅读全文…