0.前言
在上一篇中初略的介绍了一下SQL的基本写法,这一篇开始我们正式步入C#操作数据库的范围。通过这一系列的内容,我想大家能对于数据库交互有了一定的认识和基础。闲话不多说,先给大家介绍一个C#操作数据库的方式。
1. ADO.NET的介绍
在ADO.NET出现之前,C#连接数据库有很多种方式,各种框架琳琅满目。用户们饱受困扰,再加上乱七八糟的连接方式对语言的发展也是一种强有力的阻挠。所以微软决定搞一套标准化出来,之后ADO.NET诞生了。
ADO.NET定义了一系列操作数据库的接口和基类,而数据库厂商只需要根据自己的实际情况开发对应的实现类就可以了。
2. 使用ADO.NET 操作需要的步骤
使用ADO.NET操作数据库,先需要一个连接也就是 IDbConnection实例,然后使用IDbCommand执行,通过 IDataReader读取数据。
先来简单介绍一下上面提到的接口:
a.IDbConnection
表示一个与数据源的开放连接,并由访问关系数据库的.NET 数据提供程序实现,也就是说这只是一个接口,具体的实现得看具体的数据库。
我们先看一下,具体的属性和方法吧:
1 | public string ConnectionString { get; set; }// 获取或设置用于打开数据库的连接字符串 |
b. IDbCommand
表示连接到数据源时执行的SQL命令,并由访问关系数据库的.NET数据提供程序实现。与IDbConnection一致,也是一个接口。
这个接口的属性和方法如下:
1 | public string CommandText { get; set; } //获取或设置要对数据源运行的文本命令,也就是SQL语句 |
c. IDataReader
提供一种读取结果集(通过对数据源执行命令获取)的一个或多个只进流的方法,具体实现由访问关系数据库的.NET 数据提供程序实现。
这里的只进流的意思类似于只读流,也就是说它是一种单向的流,从数据库传向程序的流。
这个接口的属性和方法如下:
1 | public int Depth { get; }//获取一个值,该值指示当前行的嵌套深度 |
同时,IDataReader 继承了接口 IDataRecord,也就是说IDataReader也能直接返回当前行的数据。
来,我们看看它从IDataRecord继承了哪些吧(也就是IDataRecord有的属性和方法)。
1 | public int FieldCount { get; }//获取当前行中的列数 |
特别补充说明
ConnectionState 是一个枚举状态,表示数据连接状态,其属性值如下:
字段 | 值 | 说明 |
---|---|---|
Broken | 16 | 与数据源的连接中断。 只有在连接打开之后才可能发生这种情况。 可以关闭处于这种状态的连接,然后重新打开。 (该值是为此产品的未来版本保留的。) |
Closed | 0 | 连接已关闭。 |
Executing | 4 | 连接对象正在执行命令。 (该值是为此产品的未来版本保留的。) |
Fetching | 8 | 连接对象正在检索数据。 (该值是为此产品的未来版本保留的。) |
Open | 1 | 连接处于打开状态。 |
CommandType 用来指定如何解释命令字符串,属性值如下:
字段 | 值 | 说明 |
---|---|---|
StoredProcedure | 4 | 存储过程的名称。 |
TableDirect | 512 | 表的名称。 |
Text | 1 | SQL 文本命令。 (默认。) |
3. 如何使用ADO.NET操作数据库
以SQLServer为例,创建一个Connection:
1 | using System.Data; |
1 | string connectStr = ""; |
在.NET Framework中,以上代码是正确的,因为.NET Framework内置了SQL Server的数据访问程序,也就是数据驱动。但是在.NET Core中,需要为项目添加如下包的引用:
System.Data.SqlClient
这里简单介绍一下如何使用Visual Studio安装包:
如图所示,在【工具】->【NuGet 包管理器】下找到 管理解决方案的NuGet程序包,点击。然后会出现类似于下图:
然后点击浏览,输入:System.Data.SqlClient
选中第一项,然后在右侧勾选要添加包的项目,然后点击安装。
OK,现在假设你们都已经安装好了。然后继续下一步操作:
执行一个查询语句:
1 | select name from demo; |
创建一个Command:
这时候创建Command有这样几种方式:
1 | IDbCommand command = connection.CreateCommand();// 通过 connection创建一个命令 |
如果在创建Command的时候,没有指定连接和要执行的SQL语句,那么必须在获取Reader之前,手动设置。
现在获取一个Reader:
1 | IDataReader reader = command.ExecuteReader(); |
如果只是想执行SQL,不关心返回内容的话,可以调用以下方法:
1 | int lines = command.ExecuteNonQuery();// 获取受影响的行数 |
该方法适合于SQL是DML类型的SQL语句或者增删改的SQL语句。
如果是查询语句,则需要获取Reader,然后通过Reader获取对应的值。
4. 实践
在大概讲解了SQL,我们通过实践练习把之前了解到的内容串联起来。
a.创建一个表
1 | var connectStr = ""; |
对于 ExcuteNonQuery的返回值,微软在官方文档中给出了这样的描述:
对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。 对于所有其他类型的语句,返回值是 -1。
所以这里的返回值是-1。
b.添加一条数据
与创建表类似,区别在于使用的SQL语句不同。在C#中,使用ADO.NET 向数据库添加值,需要手动拼接SQL语句来操作。
代码如下:(假设使用在上一个示例里创建的表)
拼接SQL:
1 | var value1 = "测试"; |
注意SQL语句拼接过程中的单引号,这在SQL中表示中间是字符串。SQL有很强的将字符串转换成对应字段类型的能力,所以可以统一传给数据库字符串。
执行SQL:
1 | var connectStr = ""; |
这次如果没有执行错误的话,会返回一个1。
c.修改记录
例如修改demo里name为测试的数据,将其name修改为demo:
1 | var connectStr = ""; |
其中result表示SQL影响的表中数据行数。
d. 删除记录
1 | var sql = "delete table demo where name = ‘测试’"; |
e. 查询
这里就先容我卖个关子,不过大家可以自己试试ADO.NET的查询
5. 说明
在第四小节里提到了连接字符串,对于C#来说,不同数据库应当有不同的连接字符串。因为这是C#连接数据库的一种指令或者是密钥。
简单介绍一下连接字符串,它是用分号隔开的键值对列表。格式如下:
1 | keyword1=value; keyword2=value; |
以下是一个标准的SQL Server连接字符串:
1 | Persist Security Info=False;User ID=*****;Password=*****;Initial Catalog=AdventureWorks;Server=MySqlServer |
其中:
- Persist Security Info=False 表示使用账户密码连接数据库
- User ID 表示用户名
- Password 表示密码
- Initial Catalog=AdventureWorks 表示连接的数据库是 AdventureWorks ,可根据自己需要修改
- Server=MySqlServer 表示数据库在 MySqlServer 这个服务器上,可以是IP地址或者域名等
之所以留下了查询没有说,因为在ADO.NET中还有一种更棒的方式操作数据库。这就是下篇内容要讲的。如果有需要的小伙伴,别忘了关注评论哈。
- 本文作者: Mr.Gao
- 本文链接: https:/www.attachie.club/csharp/database/58271.html
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!