Java & C# 总结 2 Java & C# http://kay.cnblogs.com 樊凯 2 一、 main 方法 .......................................................................................................................... 4 Java: ................................................................................................................................................. 4 C#: ....................................................................................................................................................... 4 二、 控制台输入输出 .................................................................................................................. 5 三、 数据类型 ............................................................................................................................. 7 四、 条件选择 ............................................................................................................................. 8 Java: ................................................................................................................................................. 8 C#: ....................................................................................................................................................... 9 五、 循环 .................................................................................................................................. 10 Java(Java5): .............................................................................................................................. 10 C#: .................................................................................................................................................. 11 六、 数组 .................................................................................................................................. 11 Java: ............................................................................................................................................... 11 C#: .................................................................................................................................................. 12 七、 访问控制修饰符 ................................................................................................................ 12 Java: ............................................................................................................................................... 12 3 Java & C# http://kay.cnblogs.com 樊凯 3 C#: .................................................................................................................................................. 12 八、 包和命名空间 ................................................................................................................... 12 九、 类 ...................................................................................................................................... 15 1 类的声明 ................................................................................................................................... 15 2 构造方法 ................................................................................................................................... 15 十、 面向对象 ........................................................................................................................... 19 1 封装 ........................................................................................................................................... 19 2 继承 ........................................................................................................................................... 21 3 多态 ........................................................................................................................................... 25 十一、 数据库连接(以连接 SQLServer2005 为例) ........................................................... 31 Java: ............................................................................................................................................... 31 C#: .................................................................................................................................................. 42 十二、 集合 .............................................................................................................................. 54 Java: ............................................................................................................................................... 54 C#: .................................................................................................................................................. 56 4 Java & C# http://kay.cnblogs.com 樊凯 4 一、 main 方法 在 java 和 C#中,main 方法都是程序的入口,两种语言的 main 方法也有很大 的区别: Java: 在 java 中的 main 方法叧有一种,形式如下: public static void main(String[] args) { } C#: 在 C#中的 main 方法则有以下四种形式: 形式一: public static void Main(string[] args) { } 形式二: public static int Main(string[] args) { } 形式三: public static void Main() 5 Java & C# http://kay.cnblogs.com 樊凯 5 { } 形式四: public static int Main() { } 在这四种形式中,访问修饰符 public 均可以省写,省写后默认为 private。在这 四种mina方法中如何选择需要做如下考虑1.是否需要处理用户输入的命令行参 数,如果需要则选择带参数的 main 方法,命令行参数被保存在数组中 2.是否需 要在 main 方法完成是向希望返回一个值,如果需要,则选用返回整数类型的 main 方法。 二、 控制台输入输出  输出 Java: 输出并换行 System.out.println("Hello,world"); 输出不换行: System.out.print("Hello,world"); C#: 输出并换行 Console.WriteLine("Hello,world"); 6 Java & C# http://kay.cnblogs.com 樊凯 6 输出不换行 Console.Write("Hello,world");  输入(接收控制台输入的数据) Java: java 中接受控制台输入的数据需要借劣 java.util 包中 Scanner 类: import java.util.Scanner; //导入Scanner类 public class Test { public static void main(String[] args) { Scanner input = new Scanner(System.in); //声明 int i = input.nextInt(); //接收控制台输入的int值 System.out.println(i); } } 其中接收不同类型的值需要调用 Scanner 类中不同方法: String str = input.next(); //接收字符串 double d = input.nextDouble(); //接收double类型 boolean b = input.nextBoolean(); //接收boolean类型 float f = input.nextFloat(); //接受float类型 char c = input.next().charAt(0);//接收 char 类型 C#: C#中接收控制台的值需要使用 Console 类的方法 7 Java & C# http://kay.cnblogs.com 樊凯 7 using System.Collections.Generic; using System.Text; namespace KayTest { class Program { public static void Main() { string i = Console.ReadLine(); } } } Console 类的 ReadLine 方法接收的值都是 string 类型的值,如果需要 int、 double 等类型的值需要迚行类型转换。 三、 数据类型 Java C# double double String string int int float float char char 8 Java & C# http://kay.cnblogs.com 樊凯 8 boolean bool 在 java 中 String 类型值的比较必须用 equals 方法,由亍 C#中有运算符重 载,string 类型的值的比较可以用==符号戒 Equals 方法。 四、 条件选择 java 和 C#中的条件选择语句例如 if….else、if…else if….都是相同的,不同 点在 switch…case 语句中: Java: public class Test { public static void main(String[] args) { int i = 0; switch(i) { case 1: System.out.println("1"); break; case 2: System.out.println("2"); break; default: System.out.println("0"); 9 Java & C# http://kay.cnblogs.com 樊凯 9 } } } 在 Java 中 switch…case 语句中的条件常量必须是 int、char、枚丼 (Java5) 中的一种。如果 case 子句中的 break 关键字不写,也不会引起编译错误。 C#: public static void Main() { string str = "aa"; switch (str) { case "A": Console.WriteLine("A"); break; case "B": Console.WriteLine("B"); break; default: Console.WriteLine("aa"); break; } 10 Java & C# http://kay.cnblogs.com 樊凯 10 } C#中的 swtich…case 除了支持 java 中支持的 int、char、枚丼类型外还可 以支持 string 类型,但是 case 子句中的 break 关键字不写会引发编译错误, 除非 case 子句中为空: switch (str) { case "A": //没有内容 case "B": Console.WriteLine("B"); break; default: Console.WriteLine("aa"); break; } 五、 循环 java 和 C#中的循环语句 for、while、do…while 语法都是相同的,但 foreach 循环在两种语言中是不同的: Java(Java5): public static void main(String[] args) { int[] nums = {1,2,3,4,5}; 11 Java & C# http://kay.cnblogs.com 樊凯 11 for (int i : nums) { System.out.println(i); } } C#: public static void Main() { int[] nums = { 1,2,3,4,5}; foreach (int i in nums) { Console.WriteLine(i); } } 六、 数组 Java: int[] nums = new int[5]; int nums2[] = new int[5]; int[] nums3 = new int[]{1,2,3}; int[] nums4 = {1,2,3}; int[] nums5 = new int[3]{1,2,3}; //错误 12 Java & C# http://kay.cnblogs.com 樊凯 12 C#: int[] nums = new int[5]; int nums2[] = new int[5]; //错误 int[] nums3 = new int[]{1,2,3}; int[] nums4 = {1,2,3}; int[] nums5 = new int[3]{1,2,3}; int[] nums5 = new int[3]{1,2,3,4}; //错误 七、 访问控制修饰符 Java: private 叧有本类可以访问 public 任何地方都可以访问 protected 同一包中可以访问,不同包的子类也 可以访问 default 不加任何修饰符,默认为 default, 表示同一个包中可以访问 C#: private 叧有本类可以访问 public 任何位置可以访问 protected 本类戒子类访问 internal 叧有在本程序集内可以访问 八、 包和命名空间 13 Java & C# http://kay.cnblogs.com 樊凯 13 在 Java 中声明包: package com.kay.code; //声明包 public class Test { } 引用包: package com.kay.code; //声明包 import java.util.*;//引用包 public class Test { } 在 C#中声明命名空间: namespace KayTest //声明命名空间 { class Program { } } 命名空间的层次划分方式: namespace KayTest { namespace OA { 14 Java & C# http://kay.cnblogs.com 樊凯 14 class Program { } } } 简写方式: namespace KayTest.OA { class Program { } } 引用命名空间: using System.Text; //引用命名空间 namespace KayTest.OA { class Program { } } 也可以在引用命名空间的时候给命名空间起别名: 15 Java & C# http://kay.cnblogs.com 樊凯 15 using System; using System.Collections.Generic; using System.Linq; using myNewName = System.Text; //给命名空间起了别名 九、 类 1 类的声明 Java: 在 java 中可以使用关键字 class 来声明一个类: public class Test //声明一个名称为Test的类 { } 关键字 class 前面的 public 可以省写,如果不写任何访问控制修饰符,那么 默认的访问控制修饰符为 default。 C#: 同样的,在 C#中也是使用关键字 class 来声明一个类: public class Test { } public 访问控制修饰符也可以省写,如果省写,在 C#中默认为 internal。 2 构造方法 在 Java 和 C#中当去创建一个类的实例的时候,系统会调用这个类的构造方 16 Java & C# http://kay.cnblogs.com 樊凯 16 法,构造方法没有返回类型并且方法名称必须和类名相同。在一个类中,默 认会有一个空的构造方法,在 Java 和 C#中写法如下: public class Test { public Test() { } } 如果声明了一个带参数的构造方法,那么默认的空的构造会被覆盖掉: public class Test { public Test(string name) //带参数的构造,默认的构造方法被覆盖 { } } 如果还需要空的构造方法则必须显示声明: public class Test { public Test() //显示声明空的构造 { } 17 Java & C# http://kay.cnblogs.com 樊凯 17 public Test(string name) //带参数的构造,默认的构造方法被覆盖 { } } 如果构造方法可以通过方法的重载有多个: public class Test { string name; string pwd; public Test(string name) { this.name = name; } public Test(string name, string pwd) { this.name = name; //冗余 this.pwd = pwd; } } 我们会发现第二个构造方法中有冗余的成员初始化逻辑,在 Java 和 C#中均 有使用 this 来转发构造方法的调用,语法如下: 18 Java & C# http://kay.cnblogs.com 樊凯 18 Java: public class Test { String name; String pwd; public Test(String name) { this.name = name; } public Test(String name,String pwd) { this(name); //调用第一个构造方法 this.pwd = pwd; } } C#: public class Test { string name; string pwd; public Test(string name) 19 Java & C# http://kay.cnblogs.com 樊凯 19 { this.name = name; } public Test(string name, string pwd) : this(name) //将name交给第一 个构造方法构造 { this.pwd = pwd; } } 十、 面向对象 1 封装 封装指的是对象用户不必要了解实现细节而可以直接使用。在这里我们讨论 的是 Java 和 C#中对字段的封装。 在 java 中对字段的封装主要是通过 get、set 方法迚行的,在 C#中这样做 也是可以的,但是在 C#中更喜欢用属性来封装字段。 Java: public class Test { private String name; //get方法 20 Java & C# http://kay.cnblogs.com 樊凯 20 public String getName() { return name; } //set方法 public void setName(String name) { this.name = name; } } C#: public class Test { string name; //属性 public string Name { get { return name; } set { name = value; } } } 21 Java & C# http://kay.cnblogs.com 樊凯 21 在 Java 中 get、set 方法可以通过方法的访问控制修饰符来控制 get、set 的使用范围,在 C#中的属性也可以设置 get 和 set 的访问范围: C#: public class Test { string name; //属性 public string Name { get { return name; } private set { name = value; } //private } } 2 继承 2.1 继承语法 Java: //父类 public class Father { } ---------------------------------------------------------------------------------- 22 Java & C# http://kay.cnblogs.com 樊凯 22 //子类 通过extends继承自Father类 public class Son extends Father { } C#: //父类 class Father { } --------------------------------------------------------------------------------- //子类 通过:继承自Father类 class Son : Father { } 2.2 调用父类方法 java 关键字:super C#关键字:base Java: //父类 public class Father { 23 Java & C# http://kay.cnblogs.com 樊凯 23 public Father(String name) { } public void fA() { } } --------------------------------------------------------------------------------- //子类 通过extends继承自Father类 public class Son extends Father { //子类通过super关键字调用父类成员 public Son(String name,String pwd) { super(name);//调用父类构造方法 } public void sA() { super.fA(); //调用父类方法 } } 24 Java & C# http://kay.cnblogs.com 樊凯 24 C#: //父类 class Father { public Father(string name) { } public void FA() { } } -------------------------------------------------------------------------------- //子类 通过:继承自Father类 class Son : Father { //使用base关键字调用父类成员 public Son(string name,string pwd) : base(name) //调用父类构造方 法 { } public void SA() 25 Java & C# http://kay.cnblogs.com 樊凯 25 2.3 防止继承 Java 关键字:final C#关键字:sealed Java: //不可被继承 public final class FinalClass { } C#: //不可被继承 sealed class SealedClass { } 3 多态 3.1 重载 在 Java 和 C#中方法的重载指的是方法名相同但是方法的参数列表不 同。 { base.FA(); //调用父类方法 } } 26 Java & C# http://kay.cnblogs.com 樊凯 26 两种语言重载的写法是相同的: public void add(int a, int b) { } public void add(int a, int b, int c) { } 3.2 重写 子类将父类的方法迚行重新实现,成为方法的重写。 Java: //父类 public class Father { public void add() { } } --------------------------------------------------------------------------------- //子类 public class Son extends Father { 27 Java & C# http://kay.cnblogs.com 樊凯 27 //重写父类的add方法 public void add() { } } C#: class Father { //如果Add方法可被子类重写,那么方法必须声明为virtual public virtual void Add() { } } --------------------------------------------------------------------------------- class Son : Father { //如果子类重写父类的Add方法,必须在子类中Add方法声明override public override void Add() { } } 28 Java & C# http://kay.cnblogs.com 樊凯 28 不可重写的方法: Java: //父类 public class Father { //add方法在子类中不可重写 使用关键字final声明 public final void add() { } } C#: class Father { //如果方法没有被声明为virtual,则子类不可重写 public void Add() { } } 3.3 抽象类 含有抽象方法的类成为抽象类,抽象类不可被实例化。抽象类的子类 必须实现其抽象方法,除非其子类也是抽象类。Java 和 C#声明方式相 29 Java & C# http://kay.cnblogs.com 樊凯 29 同。 //使用关键字abstract声明一个抽象类 abstract class abstractClass { //无方法体的方法并使用abstract关键字声明的方法称为抽象方法 public abstract void Say(); public void Add() { } } 3.4 接口 接口是抽象类的一种特殊形式,接口中不允许有实现方法,接口同样 也不可以实例化。 Java: //使用interface关键字声明一个接口 public interface ISayHello { //方法访问控制修饰符可以省写默认为public public void say(); } C#: //使用interface关键字声明一个接口 30 Java & C# http://kay.cnblogs.com 樊凯 30 interface ISayHello { //不可以写方法的访问控制修饰符 void say(); } 实现接口: Java: //使用关键字implements实现一个接口 public class SayHelloImpl implements ISayHello { //实现接口中的方法 public void say() { } } C#: //使用:实现一个接口 class SayHelloImpl : ISayHello { //实现接口中的方法 public void say() 31 Java & C# http://kay.cnblogs.com 樊凯 31 { } } 十一、 数据库连接(以连接 SQLServer2005 为例) Java: Java 中使用 JDBC 与数据库迚行相连,在连接的代码工程中需要导入支持 SQLServer2005 的 jar 包(可以到微软官方下载),并导入以下包: import java.sql.*; 连接字符串及驱劢: String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //驱劢 String url = "jdbc:sqlserver://localhost:1433;databaseName=pubs"; //连接字符 串 获得数据库连接: String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //驱劢 String url = "jdbc:sqlserver://localhost:1433;databaseName=pubs"; //连接字符 串 String dbName = "sa"; //数据库登陆用户名 String pwd = ""; //登陆密码 try { Class.forName(driver); //加载驱劢 Connection conn = DriverManager.getConnection(url,dbName,pwd); //创建 32 Java & C# http://kay.cnblogs.com 樊凯 32 Connection对象 } catch (Exception e) { e.printStackTrace(); } 执行 SQL 语句(使用 PreparedStatement 对象): try { Class.forName(driver); //加载驱劢 Connection conn = DriverManager.getConnection(url,dbName,pwd); //创建 Connection对象 String sql = "insert into jobs (job_desc,min_lvl,max_lvl) values('IPhone工程师 ',200,210)"; //sql语句 PreparedStatement ps = conn.prepareStatement(sql); //创建 PrepareStatment对象 int i = ps.executeUpdate(); //执行SQL语句返回影响的行数 ps.close(); //关闭PrepareStatment对象 conn.close();//关闭数据库连接 } catch (Exception e) { e.printStackTrace(); } 查询(使用 ResultSet 对象): try { 33 Java & C# http://kay.cnblogs.com 樊凯 33 Class.forName(driver); //加载驱劢 Connection conn = DriverManager.getConnection(url,dbName,pwd); //创建 Connection对象 String sql = "select * from jobs"; //SQL语句 PreparedStatement ps = conn.prepareStatement(sql); //创建 PrepareStatment对象 ResultSet rs = ps.executeQuery(); //执行查询语句 返回ResultSet对象 while(rs.next()) //循环读出数据库内的记录 { System.out.println("ID:" + rs.getInt("job_id")); //传入列名获得该列在该行 的值 System.out.println("job_desc:" + rs.getString("job_desc")); System.out.println("min_lvl:" + rs.getString("min_lvl")); System.out.println("max_lvl" + rs.getString("max_lvl")); System.out.println("------------------------------------------"); } rs.close(); //关闭 ResultSet ps.close(); //关闭PrepareStatment conn.close(); //关闭Connection 注意 :三种关闭顺序不可逆 } catch (Exception e) { e.printStackTrace(); 34 Java & C# http://kay.cnblogs.com 樊凯 34 } 执行带参数的 SQL: try { Class.forName(driver); // 加载驱劢 Connection conn = DriverManager.getConnection(url,dbName,pwd); // 创 建Connection对象 String sql = "insert into jobs (job_desc,min_lvl,max_lvl) values(?,?,?)"; //sql语 句 ?为占位符 PreparedStatement ps = conn.prepareStatement(sql); // 创建 PrepareStatment对象 ps.setObject(1, "Iphone开发程序员"); //设置占位符的值 1指的是第一个占位符? ps.setObject(2, 150); ps.setObject(3, 180); int i = ps.executeUpdate(); // 执行SQL语句返回影响的行数 ps.close(); // 关闭PrepareStatment对象 conn.close();// 关闭数据库连接 } catch (Exception e) { e.printStackTrace(); } 35 Java & C# http://kay.cnblogs.com 樊凯 35 调用存储过程: 存储过程: create proc savaJobs @desc varchar(50), @min tinyint, @max tinyint as insert into jobs (job_desc,min_lvl,max_lvl) values(@desc,@min,@max) ------------------------------------------------------------- create proc findall as select * from jobs -------------------------------------------------------------- create proc savaJobs2 @id smallint output, @desc varchar(50), @min tinyint, @max tinyint as insert into jobs (job_desc,min_lvl,max_lvl) 36 Java & C# http://kay.cnblogs.com 樊凯 36 values(@desc,@min,@max) set @id = @@identity 调用 savaJobs 存储过程: try { Class.forName(driver); //加载驱劢 Connection conn = DriverManager.getConnection(url,dbName,pwd); //创建 connection对象 //创建CallableStatement对象用来创建存储过程 参数中使用{call 存储过程名称 (传入参数占位符)}格式 CallableStatement proc = conn.prepareCall("{call savaJobs(?,?,?)}"); proc.setObject(1, "Ruby on Rails 开发工程师"); //设置参数的值 proc.setObject(2, 120); proc.setObject(3, 200); proc.executeUpdate(); //执行存储过程 proc.close(); //关闭CallableStatement对象 conn.close(); //关闭连接 } catch (Exception e) { e.printStackTrace(); 37 Java & C# http://kay.cnblogs.com 樊凯 37 } 调用 findall 存储过程: try { Class.forName(driver); //加载驱劢 Connection conn = DriverManager.getConnection(url,dbName,pwd); //创建 connection对象 //创建CallableStatement对象用来创建存储过程 参数中使用{call 存储过程名称} 格式 CallableStatement proc = conn.prepareCall("{call findall}"); ResultSet rs = proc.executeQuery(); //执行存储过程 while(rs.next()) { System.out.println("ID:" + rs.getInt("job_id")); //传入列名获得该列在该行 的值 System.out.println("job_desc:" + rs.getString("job_desc")); System.out.println("min_lvl:" + rs.getString("min_lvl")); System.out.println("max_lvl" + rs.getString("max_lvl")); System.out.println("------------------------------------------"); } 38 Java & C# http://kay.cnblogs.com 樊凯 38 rs.close();//关闭ResultSet对象 proc.close(); //关闭CallableStatement对象 conn.close(); //关闭连接 注意:关闭顺序不可逆 } catch (Exception e) { e.printStackTrace(); } 执行带返回参数的存储过程: try { Class.forName(driver); //加载驱劢 Connection conn = DriverManager.getConnection(url,dbName,pwd); //创建 connection对象 //创建CallableStatement对象用来创建存储过程 参数中使用{call 存储过程名称 (参数占位符)}格式 CallableStatement proc = conn.prepareCall("{call savaJobs2(?,?,?,?)}"); proc.registerOutParameter(1, Types.SMALLINT); //设置第一个为output类型 的参数 proc.setObject(2, "Java EE 工程师"); proc.setObject(3, 200); proc.setObject(4, 220); 39 Java & C# http://kay.cnblogs.com 樊凯 39 proc.executeUpdate(); //执行存储过程 System.out.println("插入的ID为:" + proc.getInt(1)); //获得存储过程返回的值 proc.close(); //关闭CallableStatement对象 conn.close(); //关闭连接 注意:关闭顺序不可逆 } catch (Exception e) { e.printStackTrace(); } 事务处理: Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url,dbName,pwd); conn.setAutoCommit(false); //设置为手劢管理事务 并开始事务 String sql = "insert into jobs(job_desc,min_lvl,max_lvl) values(?,?,?)"; PreparedStatement ps = conn.prepareStatement(sql); //获得 PreparedStatement对象 ps.setObject(1, "Asp.Net开发工程师"); ps.setObject(2, 180); 40 Java & C# http://kay.cnblogs.com 樊凯 40 ps.setObject(3, 220); ps.executeUpdate(); //执行SQL conn.commit(); //事务提交 ps.close(); conn.close(); } catch (Exception e) { try { conn.rollback();//事务回滚 } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } 批量执行数据: Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url,dbName,pwd); conn.setAutoCommit(false); //设置为手劢管理事务 并开始事务 41 Java & C# http://kay.cnblogs.com 樊凯 41 String sql = "insert into jobs(job_desc,min_lvl,max_lvl) values(?,?,?)"; PreparedStatement ps = conn.prepareStatement(sql); //获得 PreparedStatement对象 //一次插入50000条数据 for(int i = 0; i < 50000;i++) { ps.setObject(1, "Asp.Net开发工程师"); ps.setObject(2, 180); ps.setObject(3, 220); ps.addBatch(); //添加到一个批中 //每1000条作为一个批迚行执行 这种做法是为了提高执行效率 if(i % 1000 == 0) { ps.executeBatch(); //执行一个批 } } conn.commit(); //事务提交 ps.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); 42 Java & C# http://kay.cnblogs.com 樊凯 42 try { conn.rollback();//事务回滚 } catch (SQLException e1) { e1.printStackTrace(); } } C#: C#中可以使用ADO.NET 与数据库迚行相连,在和 SQLServer2005 相连的时候, 需要在类中引入以下命名空间: using System.Data.SqlClient; 连接 SQLServer2005 数据库的连接字符串有两种写法: string connString1 = "server=.;database=pubs;user id=sa;pwd="; //连接字符串 写法1 string connString = "Data Source=.;Initial Catalog=pubs;User ID=sa;pwd="; // 连接字符串写法 2 和数据库相连(使用 SqlConnection 对象): string connString = "Data Source=.;Initial Catalog=pubs;User ID=sa;pwd="; // 连接字符串 SqlConnection conn = new SqlConnection(connString); //创建数据库连接 conn.Open();//打开数据库连接 Console.WriteLine("数据库已连接!"); 43 Java & C# http://kay.cnblogs.com 樊凯 43 conn.Close(); //关闭数据库连接 Console.WriteLine("数据库已关闭!"); 需要注意的是,如果数据库连接对象没有关闭并再次打开,会引发异常。 执行 SQL 语句(使用 SqlCommand 对象): string connString = "Data Source=.;Initial Catalog=pubs;User ID=sa;pwd="; // 连接字符串 SqlConnection conn = new SqlConnection(connString); //创建数据库连接 try { conn.Open();//打开数据库连接 string sql = string.Format("insert into jobs(job_desc,min_lvl,max_lvl)" + "values('{0}','{1}','{2}')", "Java开发工程师", "200", "250");//sql语句 SqlCommand cmd = new SqlCommand(sql, conn); //声明SqlCommand对象 int i = cmd.ExecuteNonQuery(); //执行sql语句返回影响的行数 } catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); //打印异常信息 } finally { 44 Java & C# http://kay.cnblogs.com 樊凯 44 conn.Close();//关闭数据库连接 } 查询(使用 SqlDataReader 对象): string connString = "Data Source=.;Initial Catalog=pubs;User ID=sa;pwd="; // 连接字符串 SqlConnection conn = new SqlConnection(connString); //创建数据库连接 try { conn.Open();//打开数据库连接 string sql = "select * from jobs";//sql语句 SqlCommand cmd = new SqlCommand(sql, conn); //声明SqlCommand对象 SqlDataReader reader = cmd.ExecuteReader(); //执行sql语句返回 SqlDataReader对象 while (reader.Read()) //循环读出数据库内的记录 { Console.WriteLine("ID:{0}", reader["job_id"]); Console.WriteLine("desc:{0}",reader["job_desc"]); Console.WriteLine("min_lvl:{0}",reader["min_lvl"]); Console.WriteLine("max_lvl:{0}",reader["max_lvl"]); Console.WriteLine("---------------------------------------"); 45 Java & C# http://kay.cnblogs.com 樊凯 45 } reader.Close(); //关闭SqlDataReader } catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); //打印异常信息 } finally { conn.Close();//关闭数据库连接 } 执行带参数的 SQL 语句: string connString = "Data Source=.;Initial Catalog=pubs;User ID=sa;pwd="; // 连接字符串 SqlConnection conn = new SqlConnection(connString); //创建数据库连接 try { conn.Open();//打开数据库连接 string sql = "insert into jobs(job_desc,min_lvl,max_lvl) values(@desc,@min,@max)";//带参数sql语句 SqlCommand cmd = new SqlCommand(sql, conn); //声明SqlCommand对象 46 Java & C# http://kay.cnblogs.com 樊凯 46 SqlParameter desc = new SqlParameter("@desc",".net软件工程师"); //sql参数 对象 SqlParameter min = new SqlParameter("@min",120); SqlParameter max = new SqlParameter("@max", 180); cmd.Parameters.Add(desc); //将参数对象传入command对象 cmd.Parameters.Add(min); cmd.Parameters.Add(max); int i = cmd.ExecuteNonQuery(); //执行sql语句返回影响的行数 } catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); //打印异常信息 } finally { conn.Close();//关闭数据库连接 } 调用存储过程: 47 Java & C# http://kay.cnblogs.com 樊凯 47 调用 savaJobs 存储过程代码: string connString = "Data Source=.;Initial Catalog=pubs;User ID=sa;pwd="; // 连接字符串 SqlConnection conn = new SqlConnection(connString); //创建数据库连接 try { conn.Open();//打开数据库连接 string procName = "savaJobs"; //存储过程名称 SqlCommand cmd = new SqlCommand(procName, conn); //创建 SqlCommand对象 cmd.CommandType = System.Data.CommandType.StoredProcedure; //声明 SqlCommand执行的是一个存储过程 SqlParameter desc = new SqlParameter("@desc","PHP软件工程师"); //sql参数 对象 SqlParameter min = new SqlParameter("@min",120); SqlParameter max = new SqlParameter("@max", 180); cmd.Parameters.Add(desc); //将参数对象传入command对象 cmd.Parameters.Add(min); 48 Java & C# http://kay.cnblogs.com 樊凯 48 cmd.Parameters.Add(max); int i = cmd.ExecuteNonQuery(); //执行sql语句返回影响的行数 } catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); //打印异常信息 } finally { conn.Close();//关闭数据库连接 } 调用 findall 存储过程代码: string connString = "Data Source=.;Initial Catalog=pubs;User ID=sa;pwd="; // 连接字符串 SqlConnection conn = new SqlConnection(connString); //创建数据库连接 try { conn.Open();//打开数据库连接 string procName = "findall"; //存储过程名称 49 Java & C# http://kay.cnblogs.com 樊凯 49 SqlCommand cmd = new SqlCommand(procName, conn); //创建 SqlCommand对象 cmd.CommandType = System.Data.CommandType.StoredProcedure; //声明 SqlCommand执行的是一个存储过程 SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Console.WriteLine("ID:{0}",reader["job_id"]); } reader.Close(); //关闭SqlDataReader } catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); //打印异常信息 } finally { conn.Close();//关闭数据库连接 } 调用带返回参数的存储过程: 50 Java & C# http://kay.cnblogs.com 樊凯 50 string connString = "Data Source=.;Initial Catalog=pubs;User ID=sa;pwd="; // 连接字符串 SqlConnection conn = new SqlConnection(connString); //创建数据库连接 try { conn.Open();//打开数据库连接 string procName = "savaJobs2"; //存储过程名称 SqlCommand cmd = new SqlCommand(procName, conn); //创建 SqlCommand对象 cmd.CommandType = System.Data.CommandType.StoredProcedure; // 声明SqlCommand执行的是一个存储过程 SqlParameter id = new SqlParameter(); //声明SqlParameter对象 id.ParameterName = "@id"; //跟SQL中的@id参数绑定 id.Direction = System.Data.ParameterDirection.Output;//指定该参数为 output类型 id.Size = 4;//最大数据大小 SqlParameter desc = new SqlParameter("@desc", "Ruby工程师"); SqlParameter min = new SqlParameter("@min",100); 51 Java & C# http://kay.cnblogs.com 樊凯 51 SqlParameter max = new SqlParameter("@max", 200); cmd.Parameters.Add(id); cmd.Parameters.Add(desc); cmd.Parameters.Add(min); cmd.Parameters.Add(max); int i = cmd.ExecuteNonQuery(); Console.WriteLine("返回的ID是{0}",id.Value); //获得返回的值 } catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); //打印异常信息 } finally { conn.Close();//关闭数据库连接 } 事务控制: string connString = "Data Source=.;Initial Catalog=pubs;User ID=sa;pwd="; // 52 Java & C# http://kay.cnblogs.com 樊凯 52 连接字符串 SqlConnection conn = new SqlConnection(connString); //创建数据库连接 SqlTransaction tran = null; //创建事务对象 try { conn.Open();//打开数据库连接 string sql = "insert into jobs(job_desc,min_lvl,max_lvl) values(@desc,@min,@max)";//带参数sql语句 tran = conn.BeginTransaction();//开始事务 SqlCommand cmd = new SqlCommand(sql, conn); //声明SqlCommand对象 cmd.Transaction = tran; //将command对象的事务指定为tran SqlParameter desc = new SqlParameter("@desc", ".net软件工程师"); //sql参 数对象 SqlParameter min = new SqlParameter("@min", 120); SqlParameter max = new SqlParameter("@max", 180); cmd.Parameters.Add(desc); //将参数对象传入command对象 53 Java & C# http://kay.cnblogs.com 樊凯 53 cmd.Parameters.Add(min); cmd.Parameters.Add(max); int i = cmd.ExecuteNonQuery(); //执行sql语句返回影响的行数 tran.Commit(); //提交事务 } catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); //打印异常信息 ran.Rollback(); //出现异常 事务回滚 } finally { conn.Close();//关闭数据库连接 } 对连接关闭的另外处理方式(using 语句): string connString = "server=.;database=pubs;user id = sa;pwd="; string sql = "delete from jobs where job_desc = 'Asp.Net开发工程师'"; //使用这种方式可以不用显示关闭连接 当using语句结束的时候 会自劢关闭 using (SqlConnection conn = new SqlConnection(connString)) 54 Java & C# http://kay.cnblogs.com 樊凯 54 { conn.Open(); using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.ExecuteNonQuery(); } } 十二、 集合 Java: ArrayList: ArrayList list = new ArrayList(); //声明一个ArrayList集合 需要导入 java.util.ArrayList list.add("aa"); //给数组中赋值 list.add("bb"); list.add("cc"); list.add(123); list.remove("cc");//根据对象从集合中删除 list.remove(2); //根据下标从集合中删除 System.out.println(list.get(1)); //获得当前集合中下标为1的值 55 Java & C# http://kay.cnblogs.com 樊凯 55 //遍历集合 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } 泛型 ArrayList: ArrayList list = new ArrayList(); //声明一个泛型ArrayList集合 需要导入java.util.ArrayList list.add("aa"); //给集合中赋值 该集合中叧能存放 String类型 list.add("bb"); list.add("cc"); //遍历集合 for (String string : list) { System.out.println(string); } HashMap: HashMap map = new HashMap(); //声明一个HashMap对象 需导入 java.util.HashMap map.put(1, "aa"); //往map中放入键值对 map.put(2, "bb"); map.put(3, "cc"); 56 Java & C# http://kay.cnblogs.com 樊凯 56 System.out.println(map.get(2)); //根据键取值 map.remove(1); //根据键删除 System.out.println(map);//打印出该 map 中的键值对 泛型 HashMap: HashMap map = new HashMap(); //声明一个 HashMap对象 需导入java.util.HashMap map.put(1, "aa"); //往map中放入键值对 key叧能是 int value叧能是 String map.put(2, "bb"); map.put(3, "cc"); System.out.println(map.get(2)); //根据键取值 map.remove(1); //根据键删除 System.out.println(map);//打印出该 map 中的键值对 C#: ArrayList: ArrayList list = new ArrayList();//声明一个ArrayList对象 引入System.Collections 命名空间 list.Add("aa");//向集合中添入值 57 Java & C# http://kay.cnblogs.com 樊凯 57 list.Add("bb"); list.Add("cc"); list.Add(123); Console.WriteLine(list[1]); //根据下标取值 //遍历集合 for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); } 泛型 List: List list = new List(); //声明一个泛型集合List<> list.Add("aa");//向集合中添入值 list.Add("bb"); list.Add("cc"); Console.WriteLine(list[1]); //根据下标取值 //遍历集合 foreach (string str in list) 58 Java & C# http://kay.cnblogs.com 樊凯 58 { Console.WriteLine(str); } Hashtable: Hashtable table = new Hashtable();//声明Hashtable对象 table.Add(1, "aa");//赋值 key-->value table.Add(2, "bb"); table.Add(3, "cc"); Console.WriteLine(table[1]);//根据key取值 //遍历 foreach (int key in table.Keys) { Console.WriteLine(table[key]); } Dictionary: Dictionary dic = new Dictionary(); //声明一个泛型 Dictionary dic.Add(1, "aa");//赋值 key-->value dic.Add(2, "bb"); dic.Add(3, "cc"); 59 Java & C# http://kay.cnblogs.com 樊凯 59 //遍历 foreach (int key in dic.Keys) { Console.WriteLine(dic[key]); }
还剩58页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

kanou

贡献于2013-05-03

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf