.NET数据访问层ADO.NET学习总结

第九章数据查询基础

※开始学习本章前,你需要回顾和掌握的知识点:

1.SQL语言的定义、作用和组成

SQL语言是结构化查询语言,是一种当今各种数据库中都通用的一种可以对数据库中的数据进行增删改查和对数据库进行操作、管理的一种通用的、执行效率高的、稳定性强的编码语言,使用SQL语言几乎可以代替所有的可以用鼠标操作数据库的操作。SQL语言是建立在数据库的基础上的,两者相辅相成不可分割,因此可以说,掌握了SQL语言就相当于把住了数据库这一大发展方向和趋势的命脉。

SQL语言主要由以下几个部分组成:

DML数据操作语言 DDL数据定义语言 DQL数据查询语言 DCL数据控制语言 TCL事务处理语言

2.SQL语言中的运算符及其作用

算术运算符:进行常见的加减乘除取模运算

赋值运算符:大量运用于给变量赋值和对数据进行更新操作。

比较运算符:大量运用于添加各种检查约束和逻辑条件限定。

逻辑运算符:判断条件,并返回布尔类型结果true/false,是各种条件表达式的重要组成部分,在WHERE子句中使用的较多。

3.熟练运用T-SQL对数据进行增、删、改操作

使用T-SQL插入数据

一次插入一行数据:

INSERT INTO 表名(列名1,列名2…)

VALUES (值1,值2…)

一次插入多行数据(拷贝、复制的过程)

①将已存在表中的数据插入到已存在的表中(两个已建好的表之间的数据拷贝)

INSERT INTO 表名(列名1,列名2)

SELECT 列名1,列名2…

FROM 表名

②将已存在的表中的数据插入到新建的表中(插入的同时系统自动创建新的数据表并自动完成数据插入,也可以理解为将一个已存在的表中的数据拷贝到一个目前没有,但是需要存储数据的一个容器(数据库表)中,需要拷贝的同时创建容器(数据库表))

SELECT 列名1,列名2..

INTO 表名(目标数据表)

FROM 原表名

③一次插入多行数据(使用UNION关键字联合数据行),一般适用于需要大量手动插入数据的情况

INSERT INTO 表名(列名1,列名2…)

SELECT 值1,值2… UNION

SELECT 值1,值2… UNION

…最后一行不需要以UNION关键字结束

T-SQL更新(修改)数据

UPDATE 表名 SET 列名1=值1,列名2=值2

WHERE 更新条件

T-SQL删除数据

删除部分数据:

DELETE FROM 表名

WHERE 删除条件

删除表中全部数据:

DELETE FROM 表名=TRUNCATE TABLE 表名

①使用TRUNCATE TABLE 删除的数据干净利落不能恢复,谨慎使用

②使用TRUNCATE TABLE 删除表中的数据后标识列会重新开始编号

③不能使用TRUNCATE TABLE 删除带有外键约束的引用的表的数据

T-SQL插入标识列

SELECT IDENTITY(int,标识种子,标识增量) AS 标识列名

INTO 表名

FROM 原表名

 

 

※本章的重点学习目标和本章学习需要重点掌握的知识:

1.什么是查询(从实际生活中的运用和数据库中的运用两方面分别举例说明)?查询的机制(实现过程)是什么?查询在数据库中有什么作用?

2.什么是记录集?记录集的组成是什么?

3.T-SQL查询数据的基本语法?

4.使用T-SQL查询语句查询数据有哪些方法?

5.如何对查询结果进行排序(升序、降序)?

6.SQL Server中的常用的内部函数有哪些?内部函数的语法是什么?它们的作用分别是什么?

 

※对照下面的总结看看有没有掌握:

1.查询是一种处理机制,在日常生活中查询的运用几乎无所不在,比如银行内部需要统计大量的账户和系统数据、超市管理员需要实时了解超市商品的库存和销售情况、不同的公司在结算员工薪水和评定业绩时需要对员工的业绩信息进行检索;再比如,各个行业的会计人员需要对大量的财务数据进行分门别类地检索和管理等等…这些都要用到查询。

在数据库中,查询是针对表中已存在的数据行而言的。可以将它简单理解为筛选,将满足条件的数据抽取出来,并且可以根据不同需求指定显示形式的多样化(比如视图),不同用户可以从中检索出需要的信息,并且更直观、更便捷、更容易理解。

查询的机制:通过T-SQL语句执行查询请求后,系统会自动根据T-SQL语句中指定的数据表进行匹配,匹配完成后,数据表会接收到查询请求,数据表在接受查询请求时,可以将它理解为“它将逐行判断”,将符合查询条件的记录抽取出来,并将查询结果根据接收到的T-SQL语言中的输出要求进行筛选,然后实时输出,反馈给用户,用户便可以快捷的得到需要的查询结果。

查询在数据库中的作用:方便快捷的检索需要的数据,并且可以根据需要对数据表中的数据分门别类加以处理,甚至可以多样化显示输出,然后反馈给用户,从而提高了数据表中数据的实用性。对于用户而言,查询大大减少了检索数据的工作量,提高了工作效率。对于管理员而言,使用查询可以更方便地对数据库中的数据进行合理规划和管理。对于数据库而言,查询机制是数据库中不可或缺的一部分,是数据检索的重要组成部分。换句话说,如果数据库中一旦没有查询机制,那么数据库就会几乎处于瘫痪状态,对用户获取数据信息,管理员操作数据而言也会是大大的阻碍。

 

2.记录集的定义:数据库表在接受查询请求后,将符合查询条件的记录抽取出来并结合在一起,形成一个类似于表的结构,也就是记录集。

记录集的组成:记录集是数据库中通过查询机制检索(抽取)出的数据表中符合查询条件的记录的集合。在记录集中依然可以进行再次查询。

 

3.T-SQL查询数据的基础语法

查询所有数据:

SELECT * FROM 表名

注意:*表示表中所有列的集合

查询部分数据(使用条件对查询结果进行限定)

SELECT 列名1,列名2…

FROM 表名

WHERE 查询条件

ORDER BY 排序 ASC升序/DESC降序(如不指定,则默认升序排序ASC)

 

4.

除了可以使用T-SQL查询语句进行基础查询外,有时往往还需要根据实际需求对查询返回的记录集显式地定义不同的输出方式(比如指定返回多少行,升序降序排序等),此时就需要进行稍复杂些的查询,常用的稍复杂些的查询有以下几种处理方式:

  • 查询中使用列的别名:

SELECT 列名 AS 别名

FROM 表名

使用这种方式输出查询结果将会发现在查询结果中列名不是以查询的表中的列的列名显示,而显示的是AS关键字后面指定的列的别名。

T-SQL中,指定列的别名有以下几种方式:

列名AS 别名

别名=列名

列名 别名(空格隔开)

②在查询结果中将多个列合并为一个列显示

SELECT 列名1+列名2+列名3…. AS 别名

FROM 表名

使用这种方式执行查询后,会发现在查询结果的同一列中显示使用”+”连接符合并的多个列的值,并且同样可以为合并之后的列指定列的别名

③在查询结果中添加常量列

有时,还需要在查询结果中显示一列值固定不变的列,而这一列在要查询的表中不存在,此时就可以在查询中插入常量列。

SELECT 列名1,列名2,常量值 AS 列名

FROM 表名

执行完查询结果后,将会发现多了一个常量列,列的值都是固定不变的常量,也就是定义的常量值。

④限制查询结果返回的行数

直接指定返回的行数(必须是整数型)

SELECT TOP 行数 列名1,列名2

FROM 表名

在查询中可以通过使用TOP关键字限制查询返回的行数。查询结果中只会显示TOP关键字后面指定的数量的行。

按一定的比例(百分比)限制返回的行数

SELECT TOP 百分数 PERCENT 列名1,列名2

FROM 表名

在查询中通过使用PERCENT关键字按一定的百分比返回相应的行数。

⑤查询空值

SELECT 列名1,列名2

FROM 表名

WHERE 列名 IS NULL/列名 IS NOT NULL

在WHERE子句中通过使用IS NULL或IS NOT NULL来限定是否为空值。

 

5.

在查询中可以通过ORDER BY子句限定按一个或多个列进行排序的方式(升序/降序)

,语法如下:

  • 指定按某个列进行排序

ORDER BY 列名 ASC(升序)/DESC(降序)

②指定同时按多个列进行排序(分别指定每个列的排序方式,多个列之间使用逗号隔开)

ORDER BY 列名1 ASC(升序)/DESC(降序),列名2 ASC(升序)/DESC(降序)….

注意:ORDER BY子句只能用来按照某个列进行排序,而且只会对查询结果产生效果。

 

6.

SQL Server提供了一些内部函数,主要有以下几种类型的函数:

字符串函数(用来对字符串进行常用的连接、替换等操作)

日期函数(可以对日期、时间类型的数据进行操作,如获取当前日期,计算日期差,获取日期中的某一部分等)

数学函数(可以对数字类型的数据进行常用的数学操作)

系统函数(系统内置的函数,方便获取系统数据,比如可以进行数据类型转换、获取用户名等)

作用及语法:

字符串函数:

CHARINDEX 返回指定字符串在另一指定字符串中的索引位置(起始位置)

CHARINDEX(‘bob’,’hello,bob!’)  返回7

LEN 获取字符串的长度

LEN(‘hello’) 返回5

LTRIM消除字符串左边的空格

LTRIM(‘ HI’) 返回HI

RTRIM消除字符串右边的空格

RTRIM(‘Hello ’) 返回Hello

UPPER 将字符串转换为大写

UPPER(‘how’) 返回HOW

RIGHT从指定的字符串右边截取指定长度的字符串

RIGHT(‘北大青鸟’,2) 返回’青鸟’

REPLACE 替换字符串中的指定字符

REPLACE(‘罗克罗兰’,’罗’,’张’) 返回’张克张兰’

STUFF 删除并替换字符串中指定起始位置和指定长度的字符串

STUFF(‘Happy NewYear!’,7,7,’Birthday’)

返回 ‘Happy Birthday!’

 

日期函数:

GETDATE()获取系统当前日期,直接使用

比如今天是2013年5月15日将返回 2013-05-15

DATEADD 返回在指定日期中增加指定部分的日期之后的日期

DATEADD(mm,3,’2015-5-9’)

返回 2015-8-9

DATEDIFF 返回在两个指定日期中指定部分的差

DATEDIFF(dd,’2015-5-8’,’2015-5-15’)

返回 7

DATENAME 返回指定日期指定部分的字符串形式

DATENAME(yyyy,’2015-8-9’)

返回 ‘2015’

DATEPART 返回指定日期中指定部分的整数形式

DATEPART(dd,’2015-7-9’)

返回 9

 

数学函数

RAND()返回0-1之间的随机数(浮点数),直接使用

RAND() 返回0.54874867…

ABS()返回数字的绝对值

ABS(-5) 返回5

CEILING()向上取整,返回大于指定数值的最小的一个整数值

CEILING(3.55) 返回4

FLOOR()向下取整,返回小于指定数值的最大的一个整数值

FLOOR(8.5) 返回8

POWER()幂运算,返回幂运算的结果

POWER(5,2) 返回25

ROUND()将指定数值四舍五入到指定精度

ROUND(3.557,1) 返回3.6

SIGN()对于正数返回1,对于负数返回-1,对于0返回0

SIGN(-5) 返回-1

SQRT()返回指定数字的平方根

SQRT(25) 返回5

 

系统函数

CONVERT进行数据类型转换

CURRENT_USER 返回当前用户名

DATALENGTH 获取指定表达式所占的内存字节数

HOST_NAME 返回计算机名

SYSTEM_USER 当前登陆用户名

USER_NAME 返回指定用户ID对应的用户名

 

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

※学习本章知识前,你需要回顾和掌握的知识点:

1.如何使用T-SQL语句进行增删改查操作?聚合函数有哪些?分别有什么作用?

T-SQL插入数据:

一次插入一行:

INSERT INTO table_name(column1_name,column2_name..)

VALUES (value1,value2...)

一次插入多行:

已存在表中数据插入已存在表中:

INSERT INTO table_name(column1_name,column2_name..)

SELECT (column1_name,column2_name..)

FROM table_name

已存在表中的数据插入到新表中(自动创建新表):

SELECT column1_name,column2_name..

INTO table_name

FROM table_name

联合插入多行数据(手动输入)

INSERT INTO table_name(column1_name,column2_name..)

SELECT value1,value2 UNION

SELECT...最后一行结尾不加UNION

T-SQL删除数据

DELETE FROM table_name

WHERE..

删除表中所有数据

DELETE FROM table_name=TRUNCATE TABLE table_names

T-SQL修改数据

UPDATE table_name SET column1_name=value1,column2_name=value2

WHERE...

T-SQL查询数据

SELECT * FROM table_name

SELECT column1_name,column2_name...

FROM table_name

WHERE...

聚合函数:基于某个列进行计算,返回计算后的值

SUM()求和

AVG()平均数

MAX()最大值

MIN()最小值

COUNT()计数

2.C#语言中的基础语法是什么?

命名空间:namespace

类:class

程序的入口:Main()方法

变量:一个变量用来存储一个数据,在内存中划出一块存储空间,变量的值可以随着程序运行过程根据需要进行修改

常量:const常量是指程序运行过程中保持不变的值,常量必须声明并赋值后才能使用,不能强制修改常量的值

3.C#语言中的逻辑控制语句有哪些?

选择结构:

if_else/if-else if/多重if/嵌套if/switch-case

循环结构:

while/do-while/for/foreach

跳转语句:

break/continue/return

4.类和对象的关系是什么?什么是封装?访问修饰符有哪些,分别有什么作用?

类是对象的抽象,对象是类的实例。new一个对象的过程可以理解为类的实例化的过程。对象可以封装类的属性和方法,实现信息隐藏。

封装就是将属性和方法保存在一起,可以有选择性的隐藏或显示类的属性和方法,提高程序的安全性。

访问修饰符:

public 可以在其他任何类中使用

private 只能在当前类中使用

protected 只能在同一个包中,继承链中使用

internal 只能在同一个项目中使用

5.方法的返回值有哪几种情况?方法的参数有哪几种情况?字段、属性、方法的区别是什么?什么是值传递和引用传递,二者有什么区别?

方法的返回值:可以有返回值(必须在方法主体中使用return返回值),也可以没有返回值(方法要声明为void)

方法的参数:无参方法和带参方法,如果是带参方法,则实参的数量、类型、顺序都要和形参保持一致,

字段:描述类具有的特征

属性:封装字段,保证信息的安全性

方法:描述类具有的功能

值传递:参数不使用ref修饰,调用方法后不会保留参数的更新值

引用传递:参数使用ref修饰,会保留参数的更新值

5.数据库表的基本结构是什么?

字段、数据类型、约束、主外键、默认值、标识列

6.C#语言中String类常用处理字符串的方法有哪些?""和string.Empty的区别是什么?

比较字符串的值是否相等:Equals()

获取字符串长度:Length

比较字符串:Compare(str1,str2)

获取指定字符串在目标字符串中的索引:

indexOf()首次出现的索引

lastIndexOf()最后一次出现的索引

提取字符串:Substring(int startIndex,int length)

分割字符串:Split()

连接字符串:Join()

消除两端空格:Trim()

转换为大写/小写:ToUpper()/ToLower()

""会为字符串对象分配一个长度为0的存储空间

string.Empty表示空字符串,不会为字符串分配存储空间

7.如何使用T-SQL语句创建数据库、表、进行表结构操作?(DML数据操作语言)

T-SQL创建数据库:

CREATE DATABASE 数据库名

ON PRIMARY

(

NAME='',

FILENAME='',

SIZE=,

MAXSIZE=,

FILEGROWTH=

)

LOG ON

(

NAME='',

FILENAME=''

SIZE=,

MAXSIZE=,

FILEGROWTH=

)

GO

 

T-SQL创建表

CREATE TABLE 表名

(

列名 数据类型 列的特征(包括是否为空IS NULL/是否有默认值DEFAULT/是否是标识列IDENTITY/是否是主键PRIMARY KEY)

)

GO

 

T-SQL操作表结构:

添加约束

ALTER TABLE 表名

ADD CONSTRAINT 约束名 约束类型 约束内容

插入列:

ALTER TABLE 表名

ADD 列名 数据类型

修改列的数据类型:

ALTER TABLE 表名

ALTER COLUMN 列名 数据类型

删除列:

ALTER TABLE 表名

DROP COLUMN 列名

8.什么是主键和外键?数据表之间的主外键关系怎么建立?

对于已建立主外键关系的表能够起到什么效果?

主键用来唯一标识表中每一行,强制实体完整性,一个表只能有一个主键,当需要将两列或两列以上的列设置为一个主键时,则该主键也叫复合主键。

外键用来建立引用关系,确保从表中的某个数据项在主表中必须存在,强制引用完整性,一个表可以有多个外键

建立主外键关系的方式:

①在设计器中添加关系:选择主键表、主键列以及对应的外键表、外键列

②使用ALTER TABLE 语句

ALTER TABLE 表名

ADD FOREIGN KEY (外键)

REFERENCES 主表(主键)

对于已建立主外键关系的表而言:在操作表中数据时会有限制:

必须先插入主表中的数据,再插入从表中的数据

修改主表中的数据后也要同时修改从表中的数据,不能孤立从表中的记录

删除主表前先删除主表

总的来说,在建立了主外键关系的表中,外键表中外键列中的数据必须存在于已经与它建立了主外键关系的主表中的主键列中

 

※学习本章知识,你需要掌握的知识点有:

1.什么是ADO.NET?ADO.NET的两大核心组件是什么?什么是断开连接机制?

2.什么是.NET FrameWork数据提供程序?什么是DataSet数据集?二者分别有什么作用?

3.不同数据库的数据提供程序分别位于.NET框架中的哪些命名空间中?.NET FrameWork数据提供程序四大核心对象是什么?分别有什么作用?他们在SQL Server数据提供程序中的类名是什么?在SQL Server数据提供程序中,Connection和Command对象的属性和方法有哪些?

4.什么是编译错误?什么是运行错误?什么是异常?

5.处理异常的关键字是哪些?分别有什么作用,捕获异常流程是怎样的?

6.使用Connection对象和Command对象的语句流程和基本语法顺序是怎样的?连接数据库的连接字符串是什么?连接字符串的每一部分分别有什么作用?

7.使用Connection对象建立和数据库的连接以及使用Command对象对数据库中数据进行操作时的注意事项有哪些?

※学习完本章之后,可以对照下面我的自我总结看看有没有掌握本章的知识点:

1.

ADO.NET位于Microsoft .NET Framework(.NET框架)中,是.NET框架中的框架类库FCL中的重要组成部分之一,ADO.NET的主要作用是访问和操作数据库,使数据库和应用程序进行交互,从而可以通过应用程序更加灵活方便地对数据库中的数据进行处理,提高数据库的重用性,同时也给用户带来了很好的用户体验,使用户在操作数据库时更方便、更快捷,并且由于和应用程序结合在了一起,通过应用程序的组件渲染以及其他的特效使得ADO.NET可以在处理数据库中的数据同时借助应用程序这一强有力的支持得到了广大互联网乃至其他各个行业用户的一致好评。

ADO.NET是.NET Framework中一组允许应用程序和数据库实现交互的类。.NET Framework中的两大核心组件是:.NET Framework数据提供程序和DataSet数据集。使用ADO .NET在操作数据库中的数据主要有两种处理机制:连接机制和断开连接机制。连接机制体现在可以通过C#编程语言建立和数据库的连接,然后对数据库中的数据进行高效的访问和操作,从而不需要每次都手动进入数据库管理系统中通过查询窗口对数据库中的数据进行操作,提高了工作效率。断开连接机制主要体现在.NET Framework中的核心对象DataAdapter数据适配器和ADO .NET的另一大组件DataSet数据集,使用DataAdapter可以建立数据库和数据集之间的关系,通过Fill()方法将数据库中的数据填充到数据集中,如果应用程序更新了数据集中的数据,则可以再通过Update()方法将数据集中的数据同步提交到数据库。

2.

.NET Framework数据提供程序通过核心对象可以对数据库中的数据进行快速的增删改查操作,主要适用于操作数据。

数据集是独立于任何数据库存在的,可以断开和数据库的连接并操作数据。从而不需要每次都要打开和数据库的连接。数据集其实就是将数据库中的数据临时存储到本地,在需要对数据库中的数据进行操作时,直接对数据集中的数据进行操作,然后通过数据适配器提供的方法将数据集中的数据和数据库中的数据同步。

3.

不同数据提供程序的命名空间:

SQL Server数据提供程序  System.Data.SqlClient;

OLEDB 数据提供程序 System.Data.OleDb;

ODBC数据提供程序 System.Data.Odbc;

Oracle 数据提供程序 System.Data.OracleClient;

EntityClient 实体数据模型 System.Data.EntityClient;

.NET Framework数据提供程序的四大核心对象是:

Connection建立和数据库的连接

Command执行命令

DataReader 读取只进且只读的数据流

DataAdapter 数据适配器,建立数据库和数据集之间的关系

四大核心对象在SQL Server数据提供程序中的类名分别是

SqlConnection/SqlCommand/SqlDataReader/SqlDataAdapter

SqlConnection建立和数据库的连接

属性:

ConnectionString 连接字符串

方法:

void Open()打开连接

void Close()关闭连接

SqlCommand执行命令

属性:

Connection已经定义好的connection对象

CommandText 需要执行的T-SQL语句

方法:

int ExecuteNonQuery()对数据进行不返回值的操作(比如增、删、改),返回受影响的行数

SqlDataReader ExecuteReader()或

SqlDataReader ExecuteReader(CommandBehavior behavior)返回DataReader对象,需要先引入System.Data命名空间

Object ExecuteScalar()返回查询结果中的第一个值,返回值Object引用类型,实际使用使用过程中一般需要将结果进行拆箱(强制转换)为其他基本数据类型。

4.

编译错误指的是程序在运行之前(编译时)发生的错误,运行错误指的是通过编译后在运行时发生的错误。异常指的是运行错误(运行时发生的错误)。异常不能绝对避免,但是可以预知。因此在编写代码时要将程序运行过程中可能发生的错误进行预测,然后进行编码处理,提高程序的健壮性。

5.处理异常的关键字:

try在运行时首先进入try块执行try块中的语句,也就是说try块中的语句应该放入一般情况下不会发生异常或者刚开始进入代码块时需要预先执行的语句。

Catch进行异常处理,在执行try块中的语句时如果发生异常则直接中断try块中语句的执行,跳进到catch块中执行catch块中的语句。因此catch块中应该放入当发生程序发生异常时的处理语句。

finally块中一般放入程序无论是否发生异常都需要在最后执行的语句。

捕获异常流程:

以下几种情况的执行流程是针对于一个完整的捕获异常语句而言的

try

{

 

}

catch(Exception e)异常类

{

 

}

finally

{

}

  • 程序运行过程中没有发生异常

try-finally

执行完try块中的语句后再执行finally块中的语句

②程序运行过程中发生异常:

  1. 在try块中发生异常:

在发生异常的位置中断try块中的语句的执行,直接跳进到catch块中执行catch块中的异常处理语句,最后再执行finally块中的语句

(2)在catch块中发生异常

直接执行catch块中的异常处理语句。

(3)在finally块中发生异常

运行时直接报错,一般不做异常处理。

6.使用Connection对象建立数据库连接和Command对象执行命令的基本流程顺序是:

①在命名空间声明之前引入SQL Server数据提供程序的命名空间

using System.Data.SqlClient

②定义连接字符串

string sqlConn=”Data Source=.;Initial Catalog=database_name;User ID=sa; Pwd=123456”;

③定义一个SqlConnection对象,参数是连接字符串

SqlConnection connection=new SqlConnection(strConn);

④打开连接

connection.Open();

⑤定义需要执行的T-SQL语句,存储在一个字符串变量中

string sql=”T-SQL语句”;

⑥定义SqlCommand对象,将需要执行的Sql语句字符串和已经定义好的SqlConnection对象作为参数传入。

SqlCommand command=new SqlCommand(sql,connection);

⑦根据不同需求调用command对象的不同方法执行,注意:

需要考虑类型转换的问题,有些方法的返回值需要进行类型转换。

⑧关闭连接

connection.Close();

建议插入异常处理代码完善整个执行流程,从而提高程序的健壮性。

连接字符串的组成:

Data Source=需要连接的数据库所在的服务器的名称,一般为.或local或127.0.0.1

Initial Catalog=需要连接的数据库的名称

User ID=数据库的用户名

Pwd=用户名对应的密码(如密码为空,则可以省略该项)

完整的连接字符串例子:

“Data Source=.;Initial Catalog=MySchool;User ID=sa;Pwd=123456”

7.

(1)需要访问和操作数据库,一定要先引入相应数据提供程序的命名空间,SQL Server命名空间是System.Data.SqlClient;

(2)。定义连接字符串,注意连接字符串的各个组成部分,不要写错单词和标点符号,也不要写错需要连接的对象的名称(如数据库名),还要确保定义的用户名和密码是正确的,能够正常访问和操作数据库

(3)一定要注意SqlConnection对象在定义时必须将连接字符串作为参数传入。SqlCommand对象在定义时必须将需要执行的SQL语句字符串和已经定义好的SqlConnection对象作为参数传入,并且第一个参数是需要执行的SQL语句字符串,第二个参数是已经定义好的SqlConnection对象

(4)在定义SQL语句时,要注意当需要传入字符串型数据和数据库中的数据进行比对时,字符串型数据要加单引号,列名和表名一般建议使用[]中括号括起来,方便排错,保持代码的清晰和规范,提高代码可读性。查询语句要符合SQL语言规范

(5)在使用Command对象执行命令之前一定要打开数据库的连接,在执行完对数据的操作流程之后,必须关闭数据库的连接,提高性能。

(6)数据的类型要准确,必要时进行数据类型转换。

(7)对象在使用之前必须实例化,不能为空对象。

 

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

※开始本章的学习之前,你需要回顾和掌握的知识点:

1.ADO.NET两大核心组件是什么?

.NET Framework数据提供程序和DataSet数据集

2..NET Framework数据提供程序中的四大核心对象有哪些?

在SQL Server数据提供程序中哪个命名空间中?四大核心对象在SQL Server数据提供程序中的类名分别是什么?

Connection建立和数据库的连接

Command执行命令

DataReader读取只读只进的数据流

DataAdapter数据适配器,建立数据库和数据集之间的关系。

位于System.Data.SqlClient命名空间中

SqlConnection/SqlCommand/SqlDataReader/SqlDataAdapter

3.Connection对象和Command对象的作用是什么?属性和方法有哪些?

Connection对象的作用是建立应用程序和数据库的连接,方便访问和操作数据库中的数据

Connection对象的属性:

ConnectionString连接字符串

方法:

void Open();

void Close();

Command对象的作用是对数据库中的数据执行增删改查命令,对数据库中的数据进行操作

属性:

Connection已经定义好的Connection对象

CommandText 需要执行的T-SQL语句

方法:

Int ExecuteNonQuery()返回受影响的行数

DataReader ExecuteReader()返回DataReader对象

Object ExecuteScalar()返回查询的单个值

4.异常和编译错误的区别是什么?

在编译时发生的错误就是编译错误,在运行时发生的错误就是异常。一般来说,语法如果出现错误就会触发编译错误,如果语法没有错误,但是可能由于没有显式地执行或取消某些操作而造成程序运行时发生的错误就是异常。

5.异常处理的关键字有哪些?执行流程是怎样的?

try-catch-finally

首先执行try块中的语句,如果没有发现异常,则执行完try块中的语句后再执行finally块中的语句。如果在执行try块语句的过程中发现了异常,则将会终止try块语句的执行,直接跳进catch块中(捕获到了异常)执行catch块中的语句,然后再执行finally块中的语句。总的来说,在进行异常处理时,finally块中的语句不论程序是否发生异常在最后都要执行,程序在执行完try块或catch块中的语句后总会将控制权传递给finally块,与try块的退出方式无关。

6.SQL Server数据提供程序中和数据库建立连接的连接字符串是什么?

“Data Source=服务器名;Initial Catalog=数据库名;User ID=用户名;Pwd=密码(如果密码为空,则此项可以不设置)”

7.Connection对象和Command对象创建时需要传递的参数是什么?这些参数的意义分别是什么?

Connection对象在创建时需要将已经定义好的连接字符串作为实参传入,Command对象在创建时需要将需要执行的SQL语句字符串和已经定义好的Connection对象作为实参传入。顺序不能颠倒。

 

※学习完本章后,你需要理解和掌握的知识点:

1.String类和StringBuilder类分别位于哪个命名空间中?二者有什么区别?StringBuilder类的常用属性和方法有哪些?

2.DataReader对象的作用是什么?有哪些属性和方法?Read()方法的作用是什么?在SQL Server数据提供程序中位于哪个命名空间中?

3.如何对数据库中的数据进行增删改操作?需要用到什么对象以及哪些方法?

4.总结ADO.NET的几个核心对象、以及他们的作用和执行流程是怎样的?

 

※对照下面的我的一些个人总结看看有没有掌握:

1.String类是不可变字符串,也就是说一经定义,其值不可改变,虽然我们在以前使用String类的一些方法对字符串进行连接或插入等操作时会有不同的输出结果,但是实际上每声明或使用一次String类的字符串,都会重新在内存中分配一块独立的存储空间,降低系统性能。StringBuilder类便完美的解决了这个问题。StringBuilder类是可变字符串,使用StringBuilder类可以重复修改字符串而又不需要重新创建新的对象(分配新的存储空间),并且StringBuilder类提供了对连接字符串的一些实用方法,并且当使用StringBuilder类对字符串进行拼接操作时,其执行效率远远高于String类。String类位于System.String命名空间中,StringBuilder类位于System.Text命名空间中。

StringBuilder类常用属性和方法:

属性:

Capacity 获取当前对象分配的内存中的最大字符数

Length 获取当前对象的长度

方法:

Append(string value)在结尾追加指定字符串

AppendFormat(string format,Object arg0,Object arg1)在结尾追加指定格式的字符串

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

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

2.

DataReader对象的作用是读取只进且只读的数据流。

属性:

HasRows查到结果返回true,没有查到结果返回false

FieldCount获取当前行中的列数

方法:

bool Read()前进到下一行记录中,读到记录返回true,没有读到记录返回false

void Close()关闭DataReader对象

DataReader对象在SQL Server数据提供程序中位于System.Data.SqlClient命名空间中

3.

对数据库中数据进行增删改操作时,除了需要已经使用Connection对象建立了和数据库的连接外(断开连接机制除外)需要用到Command对象的ExecuteNonQuery()方法执行诸如增删改这些不返回行的语句,并返回受影响的行数。

4.

ADO.NET小结

到目前为止,我们已经学习了ADO.NET的两大核心组件之一:.NET Framework数据提供程序中的四大核心对象中的三个核心对象。现对于本阶段所学习的使用ADO.NET访问和操作数据库中数据做以小结:

四大核心对象:

Connection建立和数据库的连接

Command执行命令

DataReader读取只读只进的数据流

DataAdapter数据适配器,建立数据库和数据集之间的关系,通过Fill()方法将数据库中的数据填充到数据集中,通过Update()方法将数据集中的数据提交到数据库

本阶段重点学习了前面三个核心对象位于SQL Server数据提供程序中的操作流程和注意事项:

执行流程一般如下:

  1. 引入System.Data.SqlClient命名空间
  2. 定义连接字符串
  3. 创建SqlConnection对象,并将已经定义好的连接字符串作为实参传入
  4. 调用Connection对象的Open()方法打开连接
  5. 编写需要执行的T-SQL语句(建议使用StringBuilder类的拼接字符串的方法对需要执行的T-SQL语句进行字符串拼接,效率更高)
  6. 创建SqlCommand对象,将已经定义好的需要执行的SQL语句字符串和已经定义好的SqlConnection对象作为实参传入,实参的先后顺序不能颠倒,第一个参数是需要执行的SQL语句字符串,第二个实参是已经定义好的SqlConnection对象
  7. 调用Command对象的方法执行命令

增删改:

int ExecuteNonQuery()

查:

一次查询一个结果:Object ExecuteScalar()

一次查询多个结果:DataReader ExecuteReader()

(8)如果使用了DataReader对象,则应该先调用DataReader对象的Close()方法关闭该DataReader对象,然后调用Connection对象的Close()方法关闭数据库的连接

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;

namespace RecordManager
{
    class DBHelper
    {
        //获取链接
        public static SqlConnection GetConnection()
        {
            return new SqlConnection("Data Source=.;Initial Catalog=RecordManagerDB;user id=sa;pwd=sa2008");
        }

        //执行查询,返回DataReader对象
        public static SqlDataReader ExecuteReader(string sql,string args)
        {
            SqlDataReader reader = null;
            SqlConnection connection = null;
            try
            {
                connection = GetConnection();
                connection.Open();
                SqlCommand command = new SqlCommand(sql, connection);
                reader = command.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception e)
            {
                args=e.Message;
                return null;
            }

            return reader;
        }

        //执行增删改,返回受影响的行数
        public static int ExecuteNonQuery(string sql, string args)
        {
            SqlConnection connection = null;
            int result = 0;
            try
            {
                connection = GetConnection();
                connection.Open();
                SqlCommand command = new SqlCommand(sql, connection);
                result = command.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                args = e.Message;
                return -1;
            }
            finally
            {
                connection.Close();
            }

            return result;
        }

        //断开式访问数据库,返回DataTable
        public static DataTable GetTable(string sql,string args)
        {
            SqlConnection connection = null;
            try
            {
                connection = GetConnection();
                connection.Open();
                SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
                DataSet ds = new DataSet();
                adapter.Fill(ds, "tbl");
                return ds.Tables[0];
            }
            catch (Exception e)
            {
                args = e.Message;
                return null;
            }
            finally
            {
                connection.Close();
            }
        }
    }
}

 

 

 

 

 

 

你可能感兴趣的:(ADO.NET)