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数据提供程序实现,也就是说这只是一个接口,具体的实现得看具体的数据库。
我们先看一下,具体的属性和方法吧:
publicstringConnectionString{get;set;}//获取或设置用于打开数据库的连接字符串
publicstringDatabase{get;}//获取当前连接或即将连接的数据库名称
publicSystem.Data.ConnectionStateState{get;}//获取当前连接的状态
publicSystem.Data.IDbTransactionBeginTransaction();//开启一项数据库事务
publicvoidChangeDatabase(stringdatabaseName);//修改已打开连接的当前数据库
publicvoidClose();//关闭当前连接
publicSystem.Data.IDbCommandCreateCommand();//创建并获取与该连接关联的命令对象
publicvoidOpen();//开启与数据库的连接
b.IDbCommand
表示连接到数据源时执行的SQL命令,并由访问关系数据库的.NET数据提供程序实现。与IDbConnection一致,也是一个接口。
这个接口的属性和方法如下:
publicstringCommandText{get;set;}//获取或设置要对数据源运行的文本命令,也就是SQL语句
publicintCommandTimeout{get;set;}//获取或设置在终止尝试执行命令并生成错误之前的等待时间
publicSystem.Data.CommandTypeCommandType{get;set;}//指定或者获取解释CommandText属性的方式
publicSystem.Data.IDbConnectionConnection{get;set;}//获取或设置执行该命令的连接
publicSystem.Data.IDataParameterCollectionParameters{get;}//获取命令的参数化列表
publicSystem.Data.IDbTransactionTransaction{get;set;}//获取或设置该命令关联的事务
publicvoidCancel();//尝试取消执行命令
publicSystem.Data.IDbDataParameterCreateParameter();//创建一个参数
publicintExecuteNonQuery();//执行一个语句,并返回受影响的行数
publicSystem.Data.IDataReaderExecuteReader();//在Connect上执行CommandText,并返回一个IDataReader
publicobjectExecuteScalar();//执行查询,并返回第一行第一列,其他数据忽略
c.IDataReader
提供一种读取结果集(通过对数据源执行命令获取)的一个或多个只进流的方法,具体实现由访问关系数据库的.NET数据提供程序实现。
这里的只进流的意思类似于只读流,也就是说它是一种单向的流,从数据库传向程序的流。
这个接口的属性和方法如下:
publicintDepth{get;}//获取一个值,该值指示当前行的嵌套深度
publicboolIsClosed{get;}//获取该读取器的是否关闭
publicintRecordsAffected{get;}//获取由执行SQL语句而更改、插入或删除的行数
publicvoidClose();//关闭IDataReader对象
publicSystem.Data.DataTableGetSchemaTable();//获取一个描述该读取器关联的列元数据
publicboolNextResult();//显示是否有下一行,如果有则在下次读取的时候,读取下一行的数据
publicboolRead();//与NextResult类似同时,IDataReader继承了接口IDataRecord,也就是说IDataReader也能直接返回当前行的数据。
来,我们看看它从IDataRecord继承了哪些吧(也就是IDataRecord有的属性和方法)。
publicintFieldCount{get;}//获取当前行中的列数
publicobjectthis[inti]{get;}//获取位于指定索引处的列
publicobjectthis[stringname]{get;}//获取具有指定名称的列
publicSystem.Data.IDataReaderGetData(inti);//获取指定列序号的DataReader
publicTypeGetFieldType(inti);//获取对应于会从Type返回的Object类型的GetValue(Int32)信息
publicstringGetDataTypeName(inti);//获取指定字段的数据类型信息
publicstringGetName(inti);//获取要查找的字段的名称
publicintGetOrdinal(stringname);//返回命名字段的索引
publicboolGetBoolean(inti);//作为布尔值获取指定列的值
publicbyteGetByte(inti);//获取指定列的8位无符号整数值
publiccharGetChar(inti);//获取指定列的字符值
publicDateTimeGetDateTime(inti);//获取指定字段的日期和时间数据值
publicdecimalGetDecimal(inti);//获取指定字段的数值
publicdoubleGetDouble(inti);//获取指定字段的双精度浮点数
publicfloatGetFloat(inti);//获取指定字段的单精度浮点数
publicGuidGetGuid(inti);//获取指定字段的GUID值
publicshortGetInt16(inti);//获取指定字段的16位带符号整数值
publiclongGetInt64(inti);//获取指定字段的64位带符号整数值
publicstringGetString(inti);//获取指定字段的字符串值
publicobjectGetValue(inti);//返回指定字段的值
publicintGetValues(object[]values);//将当前记录的值按顺序填充到数组中,并返回实际的数目
publicboolIsDBNull(inti);//返回指定字段是否设置为null
特别补充说明
ConnectionState是一个枚举状态,表示数据连接状态,其属性值如下:
CommandType用来指定如何解释命令字符串,属性值如下:
3.如何使用ADO.NET操作数据库
以SQLServer为例,创建一个Connection:
usingSystem.Data;
usingSystem.Data.SqlClient;//SqlServer的命名空间
stringconnectStr=;
IDbConnectionconnection=newSqlConnection(connectStr);
在.NETFramework中,以上代码是正确的,因为.NETFramework内置了SQLServer的数据访问程序,也就是数据驱动。但是在.NETCore中,需要为项目添加如下包的引用:
System.Data.SqlClient
这里简单介绍一下如何使用VisualStudio安装包:
如图所示,在-下找到管理解决方案的NuGet程序包,点击。然后会出现类似于下图:
然后点击浏览,输入:System.Data.SqlClient
选中第一项,然后在右侧勾选要添加包的项目,然后点击安装。
OK,现在假设你们都已经安装好了。然后继续下一步操作:
执行一个查询语句:
selectnamefromdemo;
创建一个Command:
这时候创建Command有这样几种方式:
IDbCommand