C# 数据操作系列 – 2. ADO.NET操作

C# 数据操作系列 - 2. ADO.NET操作

0.前语
在上一篇中初略的介绍了一下SQL的根本写法,这一篇开端咱们正式步入C#操作数据库的规模。经过这一系列的内容,我想咱们能关于数据库交互有了必定的知道和根底。闲话不多说,先给咱们介绍一个C#操作数据库的办法。

  1. ADO.NET的介绍
    在ADO.NET呈现之前,C#衔接数据库有很多种办法,各种结构琳琅满目。用户们饱尝困扰,再加上杂乱无章的衔接办法对言语的开展也是一种强有力的阻遏。所以微软决议搞一套规范化出来,之后ADO.NET诞生了。

ADO.NET界说了一系列操作数据库的接口和基类,而数据库厂商只需求根据自己的实践状况开发对应的完成类就能够了。

  1. 运用ADO.NET 操作需求的进程
    运用ADO.NET操作数据库,先需求一个衔接也便是 IDbConnection实例,然后运用IDbCommand履行,经过 IDataReader读取数据。

先来简略介绍一下上面说到的接口:

a.IDbConnection

表明一个与数据源的敞开衔接,并由拜访联系数据库的.NET 数据供给程序完成,也便是说这仅仅一个接口,详细的完成得看详细的数据库。

咱们先看一下,详细的特点和办法吧:

public string ConnectionString { get; set; }// 获取或设置用于翻开数据库的衔接字符串
public string Database { get; }//获取当时衔接或行将衔接的数据库称号
public System.Data.ConnectionState State { get; }//获取当时衔接的状况
public System.Data.IDbTransaction BeginTransaction ();//敞开一项数据库业务
public void ChangeDatabase (string databaseName);//修正已翻开衔接的当时数据库
public void Close ();//封闭当时衔接
public System.Data.IDbCommand CreateCommand ();//创立并获取与该衔接相关的指令目标
public void Open ();//敞开与数据库的衔接

  1. IDbCommand

表明衔接到数据源时履行的SQL指令,并由拜访联系数据库的.NET数据供给程序完成。与IDbConnection共同,也是一个接口。

这个接口的特点和办法如下:

public string CommandText { get; set; } //获取或设置要对数据源运转的文本指令,也便是SQL句子
public int CommandTimeout { get; set; } //获取或设置在停止测验履行指令并生成过错之前的等待时刻
public System.Data.CommandType CommandType { get; set; }//指定或许获取解说CommandText特点的办法
public System.Data.IDbConnection Connection { get; set; }//获取或设置履行该指令的衔接
public System.Data.IDataParameterCollection Parameters { get; }//获取指令的参数化列表
public System.Data.IDbTransaction Transaction { get; set; }//获取或设置该指令相关的业务
public void Cancel ();//测验撤销履行指令
public System.Data.IDbDataParameter CreateParameter ();//创立一个参数
public int ExecuteNonQuery ();//履行一个句子,并回来受影响的行数
public System.Data.IDataReader ExecuteReader ();//在Connect上履行CommandText,并回来一个IDataReader
public object ExecuteScalar ();//履行查询,并回来榜首行榜首列,其他数据疏忽

  1. IDataReader

供给一种读取成果集(经过对数据源履行指令获取)的一个或多个只进流的办法,详细完成由拜访联系数据库的.NET 数据供给程序完成。

这儿的只进流的意思相似于只读流,也便是说它是一种单向的流,从数据库传向程序的流。

这个接口的特点和办法如下:

public int Depth { get; }//获取一个值,该值指示当时行的嵌套深度
public bool IsClosed { get; }// 获取该读取器的是否封闭
public int RecordsAffected { get; }//获取由履行 SQL 句子而更改、刺进或删去的行数
public void Close ();//封闭IDataReader目标
public System.Data.DataTable GetSchemaTable ();//获取一个描绘该读取器相关的列元数据
public bool NextResult ();//显现是否有下一行,假如有则在下次读取的时分,读取下一行的数据
public bool Read ();//与NextResult相似
一起,IDataReader 承继了接口 IDataRecord,也便是说IDataReader也能直接回来当时行的数据。

来,咱们看看它从IDataRecord承继了哪些吧(也便是IDataRecord有的特点和办法)。

public int FieldCount { get; }//获取当时行中的列数
public object this[int i] { get; }//获取坐落指定索引处的列
public object this[string name] { get; }//获取具有指定称号的列

public System.Data.IDataReader GetData (int i);//获取指定列序号的DataReader
public Type GetFieldType (int i);//获取对应于会从 Type 回来的 Object 类型的 GetValue(Int32) 信息
public string GetDataTypeName (int i);//获取指定字段的数据类型信息
public string GetName (int i);//获取要查找的字段的称号
public int GetOrdinal (string name);//回来命名字段的索引

public bool GetBoolean (int i);//作为布尔值获取指定列的值
public byte GetByte (int i);//获取指定列的 8 位无符号整数值
public char GetChar (int i);//获取指定列的字符值
public DateTime GetDateTime (int i);//获取指定字段的日期和时刻数据值
public decimal GetDecimal (int i);//获取指定字段的数值
public double GetDouble (int i);//获取指定字段的双精度浮点数
public float GetFloat (int i);//获取指定字段的单精度浮点数
public Guid GetGuid (int i);//获取指定字段的GUID值
public short GetInt16 (int i);//获取指定字段的 16 位带符号整数值
public long GetInt64 (int i);//获取指定字段的 64 位带符号整数值
public string GetString (int i);//获取指定字段的字符串值
public object GetValue (int i);//回来指定字段的值
public int GetValues (object[] values);// 将当时记载的值按次序填充到数组中,并回来实践的数目
public bool IsDBNull (int i);//回来指定字段是否设置为 null
特别弥补阐明

ConnectionState 是一个枚举状况,表明数据衔接状况,其特点值如下:

字段 值 阐明
Broken 16 与数据源的衔接中止。 只要在衔接翻开之后才可能发生这种状况。 能够封闭处于这种状况的衔接,然后从头翻开。 (该值是为此产品的未来版别保存的。)
Closed 0 衔接已封闭。
Executing 4 衔接目标正在履行指令。 (该值是为此产品的未来版别保存的。)
Fetching 8 衔接目标正在检索数据。 (该值是为此产品的未来版别保存的。)
Open 1 衔接处于翻开状况。
CommandType 用来指定怎么解说指令字符串,特点值如下:

字段 值 阐明
StoredProcedure 4 存储进程的称号。
TableDirect 512 表的称号。
Text 1 SQL 文本指令。 (默许。)

  1. 怎么运用ADO.NET操作数据库
    以SQLServer为例,创立一个Connection:

using System.Data;
using System.Data.SqlClient;//Sql Server的命名空间
string connectStr = "";
IDbConnection connection = new SqlConnection(connectStr);
在.NET Framework中,以上代码是正确的,由于.NET Framework内置了SQL Server的数据拜访程序,也便是数据驱动。但是在.NET Core中,需求为项目增加如下包的引证:

System.Data.SqlClient

这儿简略介绍一下怎么运用Visual Studio装置包:

如图所示,在【东西】->【NuGet 包办理器】下找到 办理解决方案的NuGet程序包,点击。然后会呈现相似于下图:

然后点击阅读,输入:System.Data.SqlClient

选中榜首项,然后在右侧勾选要增加包的项目,然后点击装置。

OK,现在假定你们都现已装置好了。然后持续下一步操作:

履行一个查询句子:

select name from demo;
创立一个Command:

这时分创立Command有这样几种办法:

IDbCommand command = connection.CreateCommand();// 经过 connection创立一个指令
IDbCommand command = new SqlCommand();//简略创立一个指令目标
IDbCommand command = new SqlCommand(sql,connection);//在初始化的时分,指定要履行的SQL和衔接的Connection
假如在创立Command的时分,没有指定衔接和要履行的SQL句子,那么必须在获取Reader之前,手动设置。

现在获取一个Reader:

IDataReader reader = command.ExecuteReader();
假如仅仅想履行SQL,不关心回来内容的话,能够调用以下办法:

int lines = command.ExecuteNonQuery();// 获取受影响的行数
该办法适合于SQL是DML类型的SQL句子或许增修正的SQL句子。

假如是查询句子,则需求获取Reader,然后经过Reader获取对应的值。

  1. 实践
    在大约讲解了SQL,咱们经过实践操练把之前了解到的内容串联起来。

a.创立一个表

var connectStr = "";
var sql = @"create table demo
(

[key] int identity primary key,
[name] varchar(20)

)";
IDbConnection connection = new SqlConnection(connectStr);
IDbCommand command = connection.CreateCommand();
connection.Open();//敞开链接
command.CommandText = sql;//赋值sql
var result = command.ExecuteNonQuery();//获取回来的int值,是-1
connection.Close();//用完了记得把链接封闭
关于 ExcuteNonQuery的回来值,微软在官方文档中给出了这样的描绘:

关于 UPDATE、INSERT 和 DELETE 句子,回来值为该指令所影响的行数。 关于一切其他类型的句子,回来值是 -1。

所以这儿的回来值是-1。

b.增加一条数据

与创立表相似,差异在于运用的SQL句子不同。在C#中,运用ADO.NET 向数据库增加值,需求手动拼接SQL句子来操作。

代码如下:(假定运用在上一个示例里创立的表)

拼接SQL:

var value1 = "测验";
var sql = @$"insert into demo(name) values('{value1}');";
//====或许
var sql = string.Format("insert into demo(name) values('{0}');", "测验");
留意SQL句子拼接进程中的单引号,这在SQL中表明中心是字符串。SQL有很强的将字符串转换成对应字段类型的才能,所以能够一致传给数据库字符串。

履行SQL:

var connectStr = "";
IDbConnection connection = new SqlConnection(connectStr);
IDbCommand command = connection.CreateCommand();
connection.Open();
command.CommandText = sql;
var result = command.ExecuteNonQuery();
connection.Close();
这次假如没有履行过错的话,会回来一个1。

c.修正记载

例如修正demo里name为测验的数据,将其name修正为demo:

var connectStr = "";
var sql = "update demo set name = 'demo' where name = ‘测验’";
IDbConnection connection = new SqlConnection(connectStr);
IDbCommand command = connection.CreateCommand();
connection.Open();
command.CommandText = sql;
var result = command.ExecuteNonQuery();
Console.WriteLine(result);
connection.Close();
其间result表明SQL影响的表中数据行数。

  1. 删去记载

var sql = "delete table demo where name = ‘测验’";
IDbConnection connection = new SqlConnection(connectStr);
IDbCommand command = connection.CreateCommand();
connection.Open();
command.CommandText = sql;
var result = command.ExecuteNonQuery();
Console.WriteLine(result);
connection.Close();

  1. 查询

这儿就介绍我卖个关子,不过咱们能够自己试试ADO.NET的查询

  1. 阐明
    在第四末节里说到了衔接字符串,关于C#来说,不同数据库应当有不同的衔接字符串。由于这是C#衔接数据库的一种指令或许是密钥。

简略介绍一下衔接字符串,它是用分号离隔的键值对列表。格局如下:

keyword1=value; keyword2=value;
以下是一个规范的SQL Server衔接字符串:

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中还有一种更棒的办法操作数据库。这便是下篇内容要讲的。假如有需求的小伙伴,别忘了重视谈论哈。

原文地址https://www.cnblogs.com/c7jie/p/12868458.html