2023年6月21日发(作者:)

数据库访问技术⼀. 的定义来源于COM组件库ADO(即ActiveX Data Objects),是微软公司新⼀代.NET数据库的访问模型,是⽬前数据库程序设计⼈员⽤来开发基于.NET的数据库应⽤程序的主要接⼝。它利⽤.NET Data Provider(数据提供程序)进⾏数据库的连接和访问,通过数据库程序能够使⽤各种对象来访问符合条件的数据库内容,让提供数据库管理系统的各个⼚商可以根据此标准开放对应的.NET Data Provider,这样设计数据库应⽤程序⼈员不必了解各类数据库底层运作的细节,只要掌握所提供对象的模型,便可访问所有⽀持.NET Data Provider的数据库。结构模型如下所⽰: 图1. 结构模型 是⼀个类库,这些类提供了很多的对象,可⽤于完成数据库连接和增删查改等操作。其中包括如下五个对象: 1)Connection:⽤来连接数据库(SQL Server使⽤的是SqlConnection对象); 2)Command:⽤来对数据库执⾏SQL命令,如增删查改等操作; 3)DataReader:⽤来从数据库中返回只读数据,⽤数据源填充DataSet对象; 4)DataAdapter:与DataSet对象相结合使⽤,实现对数据库的控制; 5)DataSet:可看作离线时内存中的数据库; 这五个对象提供了两种读取数据库的⽅式; 第⼀种⽅式:使⽤Connection、Command、DataReader,其权限只能读取或查询数据库; 第⼆种⽅式:使⽤Connection、Command、DataAdapter、DataSet,其权限能进⾏各种数据库的操作。 读取数据库操作⽰意图:

图1. 结构模型

⼆. 使⽤在线访问数据库的步骤(这⾥⽤的是SQL Server 数据库)

1. 连接数据库直接上⼀段代码:using ent;string source = "server=(local); integrated security=SSPI; database=myDateabase;User ID=sa;pwd=sa";

SqlConnection conn = new SqlConnection(source);

();

// 对数据库数据进⾏操作

(); (1). ⾸先添加命名空间ent;(2). 定义数据库连接字符串:第⼀种⽅法:直接把数据库连接字符串存放在字符串对象中,如上代码所⽰;第⼆种⽅法Web:将数据库连接信息存放在配置⽂件中,然后通过使⽤ConfigurationStringSettings类进⾏调⽤。来个例⼦说明⼀下:(a). ⾸先,在配置⽂件的部分定义数据库连接信息:(b). 在项⽬⽂件中,添加对Configuration的引⽤,在头部添加using uration。然后定义数据库连接字符串为:复制代码 代码如下:string connstring = tionStrings["myDatabase"].ConnectionString;备注:必须添加对uration程序集的引⽤,才能解析上述代码中使⽤的ConfigurationManager类。2. 创建数据库连接1)创建Connection对象:string conn = new SqlConnection(connString);

2)打开数据库: (); ⼀般情况下,当在.NET中使⽤“稀缺”的资源时,如数据库连接、窗⼝或图形对象,最好确保每个资源在使⽤完毕后⽴即关闭。尽管.NET的设计⼈员实现了⾃动垃圾收集机制,垃圾最终会被回收,但仍需要尽可能早地释放资源,以避免出现资源匮乏的情况。当编写访问数据库的代码时,因为使连接打开的时间略长于需要的时间,就可能影响其他会话。在极端的情况下,不关闭连接可能会使其他⽤户⽆法进⼊⼀整组数据表,极⼤地降低应⽤程序的性能。主要有两种⽅式可以确保数据库连接等类似的“稀缺”资源在使⽤完后⽴即释放。这两种⽅式如下: (1)第⼀种⽅式:采⽤finally语句块 确保在finally中关闭任何已打开的连接。try {

// open the connection

();

// 对数据库数据进⾏操作

} catch (SqlException ex) {

// log the exception

} finally {

();

}在给定的⽅法中可能会打开许多资源,这样finally块的层次有时候不容易看清。还有⼀种⽅式可以确保资源的关闭——using语句。 (2)使⽤using语句块using(SqlConnection conn = new SqlConnection(connstring)){

// Open the connection

();

// 对数据库数据进⾏操作

}⽆论块是如何退出的,using⼦句都会确保关闭数据库连接。

3. 创建数据库操作命令:Connection对象与数据源建⽴连接后,使⽤Command对象对数据源执⾏查询、插⼊、修改和删除等操作。(1) 创建SQL数据库操作命令: sqlQuery查询语句具体规则请详见我的系列⽂章:【读书笔记】SQL Server查询语句_邓智容 (2) 创建Command对象:(a). ⽅法⼀:复制代码 代码如下:SqlCommand command = new SqlCommand(); tion = conn; dText = "SQL语句";(b). ⽅法⼆:SqlCommand command = new SqlCommand("SQL语句", conn);

备注: 1). SQL查询语句若含有C#程序的变量并以字符串形式连接,则应注意数据为⾮数字的变量应⽤单引号括起来; 2). 在SQL查询语句中使⽤参数化查询语句的话,譬如:dText = "SELECT * FROM myTable WHERE siteName=@siteName";

当需要给该参数赋值时,可以使⽤Command对象建⽴参数对象,然后再赋值:复制代码 代码如下:(new SqlParameter(@siteName, siteName)); ters["@siteName"].Value = "#";备注: 在.Net Framework 2.0中SqlClient增加了AddWithValue(string parameterName, object value)⽅法。该⽅法简化了调⽤储存过程的输⼊参数过程,在运⾏时对所输⼊的数据类型进⾏判断,获取对应的数据库类型。 因此该⽅法在运⾏效率上⽐⽤ Add(string parameterName, SqlDbTypesqlDbType, int size, string sourceColumn)⽅法要低。 在效率要求较⾼的地⽅仍然建议使⽤Add()⽅法,其它场合可以使⽤AddWithValue()简化代码编写量。

4. 执⾏sqlQuery命令:定义好命令后,就需要执⾏它。执⾏的语句有多种⽅式,这取决于要从命令中返回什么数据。Command类提供了下述可执⾏的命令: (1)ExecuteNonQuery() —— 执⾏命令,但不返回任何结果。⼀般⽤于UPDATE、INSERT或DELETE语句中,其中唯⼀的返回值是受影响的记录个数。但如果调⽤带有输出参数的存储过程,该⽅法就有返回值。 (2) ExecuteReader() —— 执⾏命令,返回⼀个类型化的IDataReader。是从数据源中选择某些数据的最简单快捷的⽅法。 (3) ExecuteScalar() —— 执⾏命令,返回结果集中的第⼀⾏第⼀列的值。

5. 对数据库操作完毕后关闭数据库连接:();

三. 离线数据库访问DataAdapter对象主要在Connection对象和DataSet对象之间执⾏数据的传输⼯作,将数据填充到DataSet对象中,也可把DataSet对象更新后的数据返回到数据源中,也可架构在Command对象上,通过CommandBuilding对象⽣成DataAdapter的Insert、Update和Delete等SQL操作命令。使⽤DataSet和DataTable对象访问数据源后,会⾃动离线,在内存中处理数据,如有修改数据的操作,将⾃动重新连接数据源,更新数据库。DataSet对象、DataAdapter对象与数据源之间的关系如下:DataSet <---> DataAdapter <---> 数据源下⾯是使⽤DataAdapter进⾏离线数据库访问的操作步骤:1. 创建DataAdapter、DataTable对象(使⽤的是SQL Server数据库)复制代码 代码如下:SqlAdapter da = new SqlAdapter("sqlQuery查询语句", conn); DataSet = ds = new DataSet(); DataTable dt = new DataTable();2. 将数据填充到DataTable对象(ds, "TableName"); dt = ["TableName"];

3. 对DataTable中的数据进⾏处理 TataTable对象的属性和⽅法有:

名称 属性/⽅法 说明() ⽅法 插⼊新数据⾏Rows[n].Delete() ⽅法 删除第n⾏的记录 属性 获取⾏数Rows[i]["ColumnName"] 属性 获取第i⾏、列名为ColumnName的值Rows[i][j] 属性 获取第i⾏、第j列的值

还有⼀种数据查询技术:LINQ。下回再讨论。通过以上对数据库访问技术的介绍,希望对⼤家有所帮助。

2023年6月21日发(作者:)

数据库访问技术⼀. 的定义来源于COM组件库ADO(即ActiveX Data Objects),是微软公司新⼀代.NET数据库的访问模型,是⽬前数据库程序设计⼈员⽤来开发基于.NET的数据库应⽤程序的主要接⼝。它利⽤.NET Data Provider(数据提供程序)进⾏数据库的连接和访问,通过数据库程序能够使⽤各种对象来访问符合条件的数据库内容,让提供数据库管理系统的各个⼚商可以根据此标准开放对应的.NET Data Provider,这样设计数据库应⽤程序⼈员不必了解各类数据库底层运作的细节,只要掌握所提供对象的模型,便可访问所有⽀持.NET Data Provider的数据库。结构模型如下所⽰: 图1. 结构模型 是⼀个类库,这些类提供了很多的对象,可⽤于完成数据库连接和增删查改等操作。其中包括如下五个对象: 1)Connection:⽤来连接数据库(SQL Server使⽤的是SqlConnection对象); 2)Command:⽤来对数据库执⾏SQL命令,如增删查改等操作; 3)DataReader:⽤来从数据库中返回只读数据,⽤数据源填充DataSet对象; 4)DataAdapter:与DataSet对象相结合使⽤,实现对数据库的控制; 5)DataSet:可看作离线时内存中的数据库; 这五个对象提供了两种读取数据库的⽅式; 第⼀种⽅式:使⽤Connection、Command、DataReader,其权限只能读取或查询数据库; 第⼆种⽅式:使⽤Connection、Command、DataAdapter、DataSet,其权限能进⾏各种数据库的操作。 读取数据库操作⽰意图:

图1. 结构模型

⼆. 使⽤在线访问数据库的步骤(这⾥⽤的是SQL Server 数据库)

1. 连接数据库直接上⼀段代码:using ent;string source = "server=(local); integrated security=SSPI; database=myDateabase;User ID=sa;pwd=sa";

SqlConnection conn = new SqlConnection(source);

();

// 对数据库数据进⾏操作

(); (1). ⾸先添加命名空间ent;(2). 定义数据库连接字符串:第⼀种⽅法:直接把数据库连接字符串存放在字符串对象中,如上代码所⽰;第⼆种⽅法Web:将数据库连接信息存放在配置⽂件中,然后通过使⽤ConfigurationStringSettings类进⾏调⽤。来个例⼦说明⼀下:(a). ⾸先,在配置⽂件的部分定义数据库连接信息:(b). 在项⽬⽂件中,添加对Configuration的引⽤,在头部添加using uration。然后定义数据库连接字符串为:复制代码 代码如下:string connstring = tionStrings["myDatabase"].ConnectionString;备注:必须添加对uration程序集的引⽤,才能解析上述代码中使⽤的ConfigurationManager类。2. 创建数据库连接1)创建Connection对象:string conn = new SqlConnection(connString);

2)打开数据库: (); ⼀般情况下,当在.NET中使⽤“稀缺”的资源时,如数据库连接、窗⼝或图形对象,最好确保每个资源在使⽤完毕后⽴即关闭。尽管.NET的设计⼈员实现了⾃动垃圾收集机制,垃圾最终会被回收,但仍需要尽可能早地释放资源,以避免出现资源匮乏的情况。当编写访问数据库的代码时,因为使连接打开的时间略长于需要的时间,就可能影响其他会话。在极端的情况下,不关闭连接可能会使其他⽤户⽆法进⼊⼀整组数据表,极⼤地降低应⽤程序的性能。主要有两种⽅式可以确保数据库连接等类似的“稀缺”资源在使⽤完后⽴即释放。这两种⽅式如下: (1)第⼀种⽅式:采⽤finally语句块 确保在finally中关闭任何已打开的连接。try {

// open the connection

();

// 对数据库数据进⾏操作

} catch (SqlException ex) {

// log the exception

} finally {

();

}在给定的⽅法中可能会打开许多资源,这样finally块的层次有时候不容易看清。还有⼀种⽅式可以确保资源的关闭——using语句。 (2)使⽤using语句块using(SqlConnection conn = new SqlConnection(connstring)){

// Open the connection

();

// 对数据库数据进⾏操作

}⽆论块是如何退出的,using⼦句都会确保关闭数据库连接。

3. 创建数据库操作命令:Connection对象与数据源建⽴连接后,使⽤Command对象对数据源执⾏查询、插⼊、修改和删除等操作。(1) 创建SQL数据库操作命令: sqlQuery查询语句具体规则请详见我的系列⽂章:【读书笔记】SQL Server查询语句_邓智容 (2) 创建Command对象:(a). ⽅法⼀:复制代码 代码如下:SqlCommand command = new SqlCommand(); tion = conn; dText = "SQL语句";(b). ⽅法⼆:SqlCommand command = new SqlCommand("SQL语句", conn);

备注: 1). SQL查询语句若含有C#程序的变量并以字符串形式连接,则应注意数据为⾮数字的变量应⽤单引号括起来; 2). 在SQL查询语句中使⽤参数化查询语句的话,譬如:dText = "SELECT * FROM myTable WHERE siteName=@siteName";

当需要给该参数赋值时,可以使⽤Command对象建⽴参数对象,然后再赋值:复制代码 代码如下:(new SqlParameter(@siteName, siteName)); ters["@siteName"].Value = "#";备注: 在.Net Framework 2.0中SqlClient增加了AddWithValue(string parameterName, object value)⽅法。该⽅法简化了调⽤储存过程的输⼊参数过程,在运⾏时对所输⼊的数据类型进⾏判断,获取对应的数据库类型。 因此该⽅法在运⾏效率上⽐⽤ Add(string parameterName, SqlDbTypesqlDbType, int size, string sourceColumn)⽅法要低。 在效率要求较⾼的地⽅仍然建议使⽤Add()⽅法,其它场合可以使⽤AddWithValue()简化代码编写量。

4. 执⾏sqlQuery命令:定义好命令后,就需要执⾏它。执⾏的语句有多种⽅式,这取决于要从命令中返回什么数据。Command类提供了下述可执⾏的命令: (1)ExecuteNonQuery() —— 执⾏命令,但不返回任何结果。⼀般⽤于UPDATE、INSERT或DELETE语句中,其中唯⼀的返回值是受影响的记录个数。但如果调⽤带有输出参数的存储过程,该⽅法就有返回值。 (2) ExecuteReader() —— 执⾏命令,返回⼀个类型化的IDataReader。是从数据源中选择某些数据的最简单快捷的⽅法。 (3) ExecuteScalar() —— 执⾏命令,返回结果集中的第⼀⾏第⼀列的值。

5. 对数据库操作完毕后关闭数据库连接:();

三. 离线数据库访问DataAdapter对象主要在Connection对象和DataSet对象之间执⾏数据的传输⼯作,将数据填充到DataSet对象中,也可把DataSet对象更新后的数据返回到数据源中,也可架构在Command对象上,通过CommandBuilding对象⽣成DataAdapter的Insert、Update和Delete等SQL操作命令。使⽤DataSet和DataTable对象访问数据源后,会⾃动离线,在内存中处理数据,如有修改数据的操作,将⾃动重新连接数据源,更新数据库。DataSet对象、DataAdapter对象与数据源之间的关系如下:DataSet <---> DataAdapter <---> 数据源下⾯是使⽤DataAdapter进⾏离线数据库访问的操作步骤:1. 创建DataAdapter、DataTable对象(使⽤的是SQL Server数据库)复制代码 代码如下:SqlAdapter da = new SqlAdapter("sqlQuery查询语句", conn); DataSet = ds = new DataSet(); DataTable dt = new DataTable();2. 将数据填充到DataTable对象(ds, "TableName"); dt = ["TableName"];

3. 对DataTable中的数据进⾏处理 TataTable对象的属性和⽅法有:

名称 属性/⽅法 说明() ⽅法 插⼊新数据⾏Rows[n].Delete() ⽅法 删除第n⾏的记录 属性 获取⾏数Rows[i]["ColumnName"] 属性 获取第i⾏、列名为ColumnName的值Rows[i][j] 属性 获取第i⾏、第j列的值

还有⼀种数据查询技术:LINQ。下回再讨论。通过以上对数据库访问技术的介绍,希望对⼤家有所帮助。