整理了下C#语言和数据库技术基础,作为复习资料

                             第一章

一、c#和JAVA对比:1.c#用命名空间(namespace)java用包(package)

             2.引入命名空间或包的关键字C#用using,JAVA用import

     3.程序入口:C#的Main()有四种形式static void Main(string[] args)

                                     static int Main(string[] args)

     static void Main()

     static int Main()

                         JAVA的MAIN()有一种形式

             4.变量命名规则:C#以字母和下划线开头,JAVA以字母下划线和$开头

     5.数据类型对比:int,float,double,两者相同,

      字符串型JAVA用String

      C#用string.布尔JAVA用boolean C#用bool

     5.行注释和块注释一样,都是//和/*...*/文档注释不同,C#用///,每行都以///开头

二、常量定义:const 数据类型 常量名称=值;

三、用占位符输出信息:console.WriteLine("{0}{1}",name,age);

四、console.ReadLine();返回字符串型,转换用parse   int age=int.parse(console.ReadLine());

五、方法命名用Pascal方法,每个单词开头字母大写;变量命名驼峰法,第一个字母小写,后单词首字母大写;

六、调试程序:F5:开始调试

             Shift+F5:停止调试

     F9:设置或取消断点

     Ctrl+F9:取消断点

     F10:单步执行

     F2:转到所调用过程或变量的定义

     ctrl+F2:将焦点转移到类的下拉列表框

             第二章 C#语法快速热身

一、JAVA和C#选择结构对比:1.大括号写法规范 C#if和else各占一行如:if

                                                                  {


  }

                                           JAVA 左边大括号紧跟IF或else之后,右括号另起一行

                         2.switch选择结构中 C#要求每个case和default都要有break语句,除非2个case之间

                     没有其他语句,同时执行一个结果。

                    JAVA不强求,没有break继续执行下行。


                         3.switch选择结构中,在c#中switch括号里可以用string 变量 int ,char

                     JAVA不能用string,只能用int 或char

二、数组JAVA和C#对比:1.声明方式不同 JAVA声明数组有2种方式:数据类型[] 数组名;

                                                           数据类型 数组名[];

                                    C#只有一种:数据类型[] 数组名;

     2.初始化:JAVA初始化数组时候,直接给数组赋值时如:int names[]=new int[]{1,2,3};

                                                       int[] names=new int[]{1,2,3};

int[] names=new int [3];

names[0]=1;

names[1]=2;

...

int[] names={1,2,3};

但是不能用int[] names=new int[3]{1,2,3};

也就是说不能给数组长度的同时赋值

                               C#给数组赋值时:int[] names=new int[3]{1,2,3};这样可以

               也可以int [] names=new int[]{1,2,3};

也可以int[] names={1,2,3};

三、给对象数组元素赋值时要先实例化对象,再为每个对象的字段赋值,如:

//定义对象数组

Student[] stu=new Student[3];

//为对象数组元素赋值

stu[0]=new Student();

stu[0].name="";

stu[0].age="";

四、循环结构:C#和JAVA中都有while循环、do-while循环、for循环,语法结构一样,但C#多了一种循环foreach结构

语法:foreach(元素类型 元素变量名 in 数组)如://输出数组array中的数字

                                             int[] array=new int[5]{0,1,2,3,4};

                                             foreach(int item in array)

     {

     console.WriteLine(item+"");

     }

foreach结构不能改变数组中各元素的值,只是对各个数据执行指定的操作,用于遍历给定数组的所有值。

                                            如输出字符串中的每个字:

                                            string str="飞翔吧,小鸟";

    //循环输出字符

    foreach(char c in str)

    {

    Console.WriteLine(c);

    }

五、除了在switch中用break,也可以用在循环结构中,使程序跳出当前循环结构,继续执行循环后面的语句

   continue和break类似,出现在循环结构中。作用是退出当前循环结构的本次循环,开始执行当前循环的

   下一次循环,并不是退出当前循环结构。

六、冒泡排序:(升序口诀)

N个数字来排队,两两相比小靠前;外层循环N-1,内层循环N-1-i;

如果要降序排序,只要把程序中的大于号换成小于号就行了;

如://冒泡排序输出成绩

int[] scores=new int[5];

for(int i=0;i<scores.Length-1;i++)

{

  for(int j=0;j<scores.Length-1-i;j++)

  {

   if(scores[j]>scores[j+1])

   {

      int temp=scores[j];

      scores[j]=scores[j+1];

      scores[j+1]=temp;

     }

  }

}

//排序后输出

Console.WriteLine("排序后成绩为");

for(int i=0;i<scores.Length;i++)

{

Console.WriteLine("{0}",scores[i]);

}


                              第三章 使用属性升级MyBank

一、C#中成员的默认访问修饰符是private,类的默认为internal.

二、this关键字是指当前对象本身,可以解决成员变量和局部变量名称冲突问题。

this代表调用方法的对象引用,即谁调用本方法,this就指向哪个对象。this是非静态的,不能在静态方法中使用

class Student

{

private string _name;

public void SetName(string _name)

{

this._name=_name;

}

}

三、用属性封装字段

pivate string _name;

public string Name

{

get{return _name;}

set{_name=value;

}

}

属性访问类型:1.只读属性,只包含get访问器

             2.只写属性,只包含set访问器

     3.读写属性,包含get和set访问器

封装字段快捷键:Ctrl+R,E

C#为类的私有字段和属性命名会采用不同方法:1.为类的私有字段命名时,要以下划线“_”开头,用驼峰法命名

                                         2.为类的属性命名采用Pascal法,首字母大写

四、字段和属性的区别:通常将字段指定为private,在类的内部使用,将属性指定为public,对外部公开,

通过get或set访问器对字段提供安全,有效范围的保护。

五、属性和方法的区别:属性set访问器和get访问器后不使用(),因为访问器没有返回值,所以也不需要指定void.

六、引用传递和值传递区别:值传递是将变量的值复制一份传递给方法,使该方法的形参和实参的值相同。在调用的

                         方法中修改形参也只是对实参复制品的数据做更新,并没有真正改变实参的值。

                         引用传递是将要传递的对象的引用复制给方法的形参,使得被调用的方法直接对引用对象

 进行更改,会影响实参原来的值。在方法定义和方法调用时都要使用ref修饰参数,而且

 使用ref修饰的参数必须在调用的方法中赋值。


                            第三章 深入C#的String类

一、常用字符串处理方法P99

二、Format格式化 string name="张三";

                int age=23;

string str="姓名{0}年龄{1}";

str=string.Format(str,name,age);

Console.WriteLine(str);

三、数值类型与字符串的转换

1,。//将字符串转换成数值类型

int.parse(string str);

double.parse(string str);

float.parse(string str);

2.//数值转换为字符串用ToString()方法

string str=num.ToString();

3.使用Convert转换

Convert.ToInt32() 转换为×××int

Convert.ToSingle()转换为单精度float

Convert.ToDouble()转换为双精度double

Convert.ToString()转换为字符串类型string

用Convert转换成int时,进行了四舍五入,而用parse直接将小数点后的值舍弃了。

四、转换的使用情况

1.隐式转换:常用于数值型之间,将取值范围小的数值类型转换为取值范围大的数值类型

2.显示转换:常用于数值型之间,将取值范围大的数值类型转换为取值范围小的数值类型

3.Parse()方法:将字符串转换为其他类型

4.Convert类:任何基本类型之间的相互转换


                            第八章 用SQL语句操作数据

一、SQL全称是“结构化查询语言”(Structured Query Language)

二、SQL中的运算符:1.算数运算符+,-,*,%,/

                  2.赋值运算符=

  3.比较运算符=,>,<,<>,>=,<=,!=(非SQL-92标准)

  4.逻辑运算符 AND,OR,NOT

三、插入数据

1.插入单行数据

INSERT INTO 表名 (列名) VALUES(值)

INSERT INTO Student(name,age,email) VALUES("张三",23,"1233@qq.com");

2.一次插入多行数据(提前建好新表)

INSERT INTO Student(姓名,地址,邮箱)

SELECT name,address,email

FROM School

3.将现有表中的数据添加到新表中(查询时直接建立新表了)

SELECT Student.name,student.email

INTO Adderss

FROM Student

4.用UNION关键字合并数据进行插入

INSERT Student(name,email)

SELECT '',''UNION

SELECT '',''UNION

SELECT '',''

最后一行不能加UNION

四、更新数据

UPDATE 表名SET 列名=更新值 WHERE 更新条件

如:UPDATE Student

SET name='张三' WHERE id=1

五、删除数据

//删除单行数据

DELETE FROM 表名 WHERE 条件

DELETE FROM Student where name='张三'

//删除表中的所有行

TRUCATE TABLE Student

表结构,列,约束,索引不会改变,不能用于有外键约束的表,要用DELETE


                            第九章 数据查询基础

一、语句查询

语法:SELECT 列名

     FROM 表名

     WHERE 条件

     ORDER BY 排序的列名[ASC或DESC]

1.查询所有数据行和列

SELECT * FROM Student

2.查询部分列或行

SELECT Scode,name,address

FROM Student

WHERE name='张三'

3.在查询中使用列的别名

SELECT name AS 学生姓名,email AS 学生邮箱

FROM Student

WHERE adress='上海'

4.查询空值

SELECT name FROM Student WHERE email is null

5.在查询中使用常量列

SELECT 姓名=name,地址=address,'上海一中' AS 学校名称

FROM Student

6查询返回限制的行数

SELECT TOP 5 name,email

FROM Student WHERE Sex=0

SELECT TOP 20 PERCENT name,email

FROM Student WHERE Sex=0

二、查询中使用函数P223-P224页

1.字符串函数

2.日期函数

3.数学函数

4.系统函数


                            第十章模糊查询和聚合函数

一、通配符

_一个字符

%任意长度字符串

[]括号中所指定范围的一个字符[1-5]

[^]不在括号中所指定范围内的任意一个字符[^1-2]

二、LIKE模糊查询用于匹配字符串或字符串一部分

三、使用BETWEEN在某个范围内进行查询

SELECT * FROM Student WHERE Score BETWEEN 60 AND 80

四、使用IN在列举值内进行查询

SELECT name,email

FROM Student WHERE address IN('北京','上海')

四、SUM()函数

返回表达式中所有数值的总和

SELECT SUM(Scores) FROM Scores WHERE StudentID=23

五、AVG()函数

返回表达式中所有数值的平均值,空值将被忽略,只能用于数字类型的列

六、MAX()函数MIN()函数

返回表达式中的最大值,MIN()返回最小值

七、COUNT()函数

返回提供的组或记录集中的计数,可以用于除去text,p_w_picpath,ntext以外的任何类型的列

SELECT COUNT (*) FROM Student

聚合函数返回一个数



                            第十一章 连接查询和分组查询

一、使用GROUP BY分组查询

SELECT COUNT(*) AS人数,Sex FROM Student

GROUP BY Sex

二、使用GROUP BY时,在SELECT 列表中可以指定的列是有限制的,只允许几项:

1.被分组的列

2.为每个分组返回一个值的表达式,如聚合函数计算出的列

三、使用HACING进行分组筛选

WHERE只能对没有分组统计前的数据进行筛选,对分组后的条件筛选必须使用HAVING,HAVING用来对分组后

的数据进行筛选,将“组”看做“列”来限定条件

四、HAVING 和 WHERE使用的顺序

WHERE---GROUP BY---HAVING

五、GROUP BY后面不能使用别名,HAVING后面也不能使用别名。

   ORDER BY 和WHERE可以使用别名

六、内连接查询

有两种方式:1.在WHERE子句中指定连接条件

           SELECT a.name,s.id,s.score

   FROM student [AS] a,Scores [AS] s

   WHERE a.id=s.id

   2.在FROM中使用INNER JOIN...ON

   SELECT a.name,s.id,s.score

   from student [AS] a

   INNER JOIN Scores [AS] s ON(a.id=s.id)

   WHERE s.Score>=60

   3.三表以上

   SELECT S.name 学生姓名,CS.CourseName 课程名称,C.Score 考试成绩

   FROM Student S

   INNER JOIN Score C ON (S.Scode=C.StudentID)

   INNER JOIN Course CS ON(CS.CourseID=C.CourseID)

七、外连接查询

两种方式:1.左外连接

         SELECT S.name,C.CourseID,C.Score

 FROM Student S

 LEFT OUTER JOIN Score C ON S.Scode=C.StudentID

 2.右外连接

 SELECT CS.name,C.StudentID,C.Score

 FROM Course CS

 RIGTH OUTER JOIN Score C ON CS.CoureseID=C.CoureseID

八、内连接和外连接的不同:

内连接查询的结果是从两个或两个以上表的组合中挑选出符合连接条件的数据,如果数据无法满足连接条件则将其忽略

在内连接中,参与连接的表的地位是平等的。

外连接查询中参与连接的表有主从之分以主表的每行数据匹配从表的数据列,将符合连接条件的数据直接返回到结果集

中;对那些不符合连接条件的列,将被填上NULL值(空值)后再返回到结果集中。


                            第十四章 使用ADO.NET访问数据库

一、ADO.NET有一个非常大的优点,当它与数据源断开连接时也可以使用数据。

二、ADO.NET的两个组件:1).NET Framework 数据提供程序是专门为数据处理及快速地只进、只读访问数据而设计的组

                      件。使用它可以连接数据源、执行命令和检索结果,直接对数据源进行操作。

                      2)DataSet是专门为独立于任何数据源的数据访问而设计的。使用它,可以不必直接和数据源

      打交道,大批量的操作数据,也可以将数据绑定在控件上。

三、.NET Framework数据提供程序的四个核心对象

Connection   建立与特定数据源的连接

Command      对数据源执行命令

DataReader   从数据源中读取只进只读的数据流

DataAdapter  用数据源填充DataSet 并解析更新

四、Connetion的属性和方法

属性:ConnectionString

方法:Open();打开数据库连接

     Close();关闭数据库连接

建立连接:sting str="Data Source=服务器名;Initial Catalog=数据库名;User ID=用户名;pwd=密码";

         SqlConnection conn=new SqlConnection(str);

 conn.Open();

关闭连接:conn.Close();

五、异常处理

try{}

catch{}

快捷键:ctrl+K+S

try

{

conn.Open();

}

catch(Exception ex)

{

Console.WriteLine(ex.Message);//Message封装了错误信息

}

finally

{

conn.Close();//无论怎么样都会执行的操作

}

六、用Command 对象执行数据库的操作

string sql="";//执行的操作

SqlCommand comm=new SqlCommand( sql, conn);

七、Command方法

1.int ExecuteNonQuery()执行不返回行的语句,如UPDATE 返回影响的行数

2.SqlDateReader ExecuteReader()或SqlDateReader ExecuteReader(CommandBehavior behavior)

执行查询命令,返回DataReader 对象。后者括号里语句带便关闭此对象时同时关闭数据库

3.object ExecuteScalar()返回单个值,如执行COUNT(*)



                            第十五章 使用ADO.NET查询和操作数据

一、StringBuilder 类

常用方法:1)StringBuilder AppendLine(string str)在结尾追加

         StringBuilder sb=new SrtingBuilder();

 sb.AppendLine("");

 sb.ApeendLine("");

      ...

         2)StringBuilder AppendFormat(string format,object arg0,object arg1)添加特定格式字符串

 3)StringBuilder Insert(int index,string str)在指定位置插入指定字符串

 4)Remove(int starIndex,int length)移除指定字符串

如果要将StringBuilder类对象转换为String类对象,唯一的方式是用ToString()方法

二、dataReader对象的使用

1.创建Command对象,调用Command对象的ExecuteDataReader()方法,返回一个DataReader对象,用DataReader对象

的Read()方法读取一行记录可以用循环逐条读取

SqlDataReader reader=comm.ExecuteReader();

while(reader.Read())

{

Console.WriteLine("{0}\t{1}\t{2}\t",reader["id"],reader["name"],reader["email"]);

}