C#学习之旅(三)

C#学习之旅(三)

文章目录

        数据访问技术

        数据库是一门复杂的技术,其在当前的软件开发中得到了广泛的应用。数据库的出现为数据存储技术带来了新的方向,也产生了一门复杂的学问。为了使客户端能够访问服务器中的数据库,可以使用各种数据访问方法或技术,ADO.NET就是这样一种技术,另外,微软还提供了另一种操作数据库的框架,即Entity Framework。

        1.1、数据库基础

        1.1.1、数据库简介

        数据库是按照数据结构来组织、存储和管理数据的仓库,是存储在一起的相关数据的集合。使用数据库可以减少数据的冗余度,节省数据的存储空间。其具有较高的数据独立性和易扩充性,实现了数据资源的充分共享。计算机系统中只能存储二进制的数据,而数据存在的形式却是多种多样的。数据库可以将多样化的数据转换成二进制的形式,使其能够被计算机识别。同时,可以将存储在数据库中的二进制数据以合理的方式转化为人们可以识别的逻辑数据。
    随着数据库技术的发展,为了进一步提高数据库存储数据的高效性和安全性,随之产生了关系型数据库。关系型数据库是由许多数据表组成的,数据表又是由许多条记录组成的,而记录又是由许多的字段组成的,每个字段对应一个对象。根据实际的要求,设置字段的长度、数据类型、是否必须存储数据。

    数据库的种类有很多,常见的分类有一下几种:
    按照是否支持联网分为单机版数据库和网络版数据库。
    按照存储的容量分为小型数据库、中型数据库、大型数据库和海量数据库。
    按照是否支持关系分为非关系数据库和关系数据库。

        1.1.2、SQL语言简介

        (1)、SQL是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系型数据库系统。SQL的含义是“结构化查询语言(Structured Query Language)”。目前,SQL语言有两个不同的标准,分别是美国国家标准学会(ANSI)和国际标准化组织(ISO)。SQL是一种计算机语言,可以用它与数据库交互。SQL本身不是一个数据库管理系统,也不是一个独立的产品。但SQL是数据库管理系统不可缺少的组成部分,它是与DBMS通信的一种语言和工具。由于它功能丰富,语言简洁,使用方法灵活,所以备受用户和计算机业界的青睐,被众多计算机公司和软件公司采用。经过多年的发展,SQL语言已成为关系型数据库的标准语言。
        (2)、在编写SQL语句时,要注意SQL语句中各关键字要以空格分隔。

        1.1.3、安装SQL Server 2017及SQL Server Management Studio

        参考博客:https://www.cnblogs.com/Williamls/p/10506243.html
                          https://jingyan.baidu.com/article/e52e361596935b00c60c51b4.html
                          https://blog.csdn.net/slyh_td/article/details/83474486

        1.1.4、数据库的创建及删除

        (1)、创建数据库:
        ①、在Windows10操作系统的开始界面中找到Microsoft SQL Server Tools 18的 Microsoft SQL Server Management Studio 18,单击打开,在“连接到服务器”对话框中选择登录的服务器名称和身份验证方式,然后登录用户名和登录密码。

C#学习之旅(三)
        ②、单击“连接”按钮,连接到指定的SQL Server 2017服务器,然后展开服务器节点,选中“数据库”节点,右击,在弹出的快捷菜单中选择“新建数据库”命令。

C#学习之旅(三)
        ③、打开“新建数据库”对话框,在该对话框中输入新建的数据库的名称,选择数据库所有者和存放路径,这里的数据库所有者一般为默认。

C#学习之旅(三)
        ④、单击“确认”按钮,即可新建一个数据库。

C#学习之旅(三)
        (2)、删除数据库:删除数据库的方法很简单,只需在要删除的数据库上右击,在弹出的快捷菜单中选择“删除”命令即可。

C#学习之旅(三)
        (3)、如果数据库以后还要被使用,可以将数据库进行分离,在数据库上右击,在弹出下拉列表中选择“任务”->“分离”命令。

        1.1.5、数据表的创建及删除

        (1)、创建数据表:
        ①、单击数据库名左侧的“+”,打开该数据库的子项目,在子项目中的“表”项上右击,在弹出的快捷菜单中选择“新建”->“表”命令。

C#学习之旅(三)
        ②、在SQL Server Management Studio管理器的右边显示一个新表,这里输入要创建的表中所需要的字段,并设置主键。

C#学习之旅(三)
        ③、单击“保存”按钮,弹出“选择名称”对话框。输入要新建的数据表的名称,单击“确定”按钮,即可在数据库中添加一个数据表。

C#学习之旅(三)
        (2)、删除数据表:如果要删除数据库中的某个数据表,只需右击数据表,在弹出的快捷菜单中选择“删除”命令即可。

C#学习之旅(三)
        (3)、在创建表结构时,有些字段可能需要设置初始值(如int型字段),可以在默认值文本框中输入相应的值。

        1.1.6、简单SQL语言的应用

        通过SQL语句,可以实现对数据库进行查询、插入、更新和删除操作。使用的SQL语句分别是Select语句、Insert语句、Update语句和Delete语句。

        (1)、使用cmd操作SQL Server数据库:
       ①、打开cmd命令界面,运行osql ?/,查看所有关于SQL Server相关命令:(注意大小写)

C#学习之旅(三)
          ②、根据以上提示连接数据库,运行osql -S 服务器 -U 登陆ID -P 密码,当出现1>表示连接成功,这时候就可以输入sql语句来进行操作了。

C#学习之旅(三)
          ③、查看系统中的所有SQL Server数据库。输入 select * from sysdatabases,并在2>时输入GO/go,执行SQL语句。

C#学习之旅(三)
        (2)、在Microsoft SQL Server Management Studio中使用T-SQL代码创建数据库:
        ①、在“对象资源管理器”中右键单击服务器实例,选择“新建查询”:

C#学习之旅(三)
          ②、插入以下代码,点击执行(F5),创建新数据库db_CSharp。

USE master
GO
IF NOT EXISTS (
   SELECT name
   FROM sys.databases
   WHERE name = N'db_CSharp'
)
CREATE DATABASE [db_CSharp]
GO

C#学习之旅(三)
          ③、在数据库下拉列表中,选择db_CSharp数据库,右键,点击新建查询。然后将以下代码复制过去,点击运行(F5),创建新表tb_test。

-- 在模式“dbo”中创建一个名为“tb_test”的新表
-- 如果表已经存在,则删除该表
IF OBJECT_ID('dbo.tb_test', 'U') IS NOT NULL
DROP TABLE dbo.tb_test
GO
-- 创建指定格式的表
CREATE TABLE dbo.tb_test
(
   编号                    INT     NOT NULL   PRIMARY KEY, -- 主键列
   商品名称      [NVARCHAR](50)    NOT NULL,
   商品价格               FLOAT    NOT NULL,
   商品类型      [NVARCHAR](50)    NOT NULL,
   商品产地      [NVARCHAR](50)    NOT NULL,
   新旧程度      [NVARCHAR](50)    NOT NULL
);
GO

C#学习之旅(三)
          ④、清空查询页面,将以下代码插入并执行。作用:将数据存储到tb_test表中。

INSERT INTO dbo.tb_test
	([编号],[商品名称],[商品价格],[商品类型],[商品产地],[新旧程度])
VALUES
	(1,N'电动自行车',300,N'交通工具',N'国产',N'全新'),
	(2,N'手机',1300,N'家电',N'国产',N'二手'),
	(3,N'电脑',9000,N'家电',N'国产',N'二手'),
	(4,N'背包',350,N'服饰',N'国产',N'全新'),
	(5,N'MP4',299,N'家电',N'国产',N'全新'),
	(6,N'电视机',1350,N'家电',N'国产',N'全新')
GO

          ⑤、使用SELECT * FROM dbo.tb_test命令查看插入表中的数据。

C#学习之旅(三)
        (3)、查询数据:在SQL中语句中使用Select语句查询数据,Select语句是从数据库中检索数据并查询,并将查询的结果以表格的形式返回。语法如下:

SELECT select_list
[INTO new_table]
FROM table_source
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_conditon]
[ORDER BY order _expression [ASC | DESC]]

        (Select语句的参数即说明)

        使用Select语句查询数据表tb_test中商品的新旧程度为“二手”的数据,代码如下(大小写功能相同):

select * from tb_test where 新旧程度='二手'

C#学习之旅(三)
        (4)、添加数据:在SQL语句中,使用Insert语句向数据表中添加数据。语法如下:

INSERT[INTO]
	{tabel_name WITH(<table_hint_limited>{…n})
	| view_name
	| rowset_function_limited
	}
	{[(column_list)]
		{VALUES
		({DEFAULT | NULL | expression}[…n])
		| derived_table
		| execute_statement
		}
	}
	| DEFAULT VALUES

        (Insert语句的参数及说明)

        使用Insert语句,向数据表tb_test中添加一条新的商品信息。代码如下:

insert into tb_test(编号,商品名称,商品价格,商品类型,商品产地,新旧程度) values(7,'洗衣机',890,'家电','进口','全新')

C#学习之旅(三)
        注意:
                (1)、插入项的顺序和数据类型必须与表或视图中列的顺序和数据类型相对应。
                (2)、如果表中某项定义为不允许NULL,则插入数据时,该列必须存在合法值。
                (3)、如果某列是字符型或日期型数据类型,则插入的数据应该加上单引号。

        (5)、更新数据:使用Update语句更新数据,可以修改一个列或者几个列中的值,但一次只能修改一个表。语法如下:

UPDATE
	{table_name WITH(<table_hint_limited>[,…n])
	| view_name
	| rowset_function_limited
	}
	SET
	{column_name={expression | DEFAULT | NULL}
	| @variable=expression
	| @variable=column=expression}[,…n]
	{{[FROM]{table_source}[,…n]
		[WHERE 
			<serach_condition>]
		|
		[WHERE CURRENT OF
		{{[GLOBAL]cursor_name}|cursor_variable_name}
		]}
		[OPTION(<query_hint>[,…n])]

        (Update语句的参数及说明)

        使用Update语句,更新tb_test表中洗衣机的商品价格。代码如下:

update tb_test set 商品价格=1500 where 商品名称='洗衣机'

C#学习之旅(三)
        注意:
                (1)、UPDATE语句将记入日志。如果要替换或修改大块的text、ntext或image数据,请使用WRITETEXT或UPDATETEXT语句而不要使用UPDATE语句。

        (6)、使用Delete语句删除数据,可以使用一个单一的Delete语句删除一行或多行。当表中没有行满足Where子句中指定的条件时,就没有行会被删除,也没有错误产生。

DELETE
	[FROM]
		{table_name WITH(<table_hint_limited>[,…n])
		| view_name
		| rowset_function_limited
		}
		[FROM {<table_source>}[,…n]]
	[WHERE
		{<search_conditon>
		| {[CURRENT OF
			{{[GLOBAL] cursor_name}
				| cursor_variable_name
				}
			]}
		}
	]
	[OPTION (<query_hint>[,…n])]

        (Delete语句的参数及说明)

        使用delete语句,删除tb_test表中商品名称为“洗衣机”。并且商品产地是“进口”的商品信息,代码如下:

delete from tb_test where 商品名称='洗衣机' and 商品产地='进口'

C#学习之旅(三)

        1.2、ADO.NET简介

         ADO.NET是一组向.NET程序员公开数据访问服务的类。ADO.NET为创建分布式数据共享应用程序提供了一组丰富的组件。它提供了一系列的方法,用于支持对Microsoft SQL Server和XML等数据源进行访问,还提供了通过OLE DB和XML公开的数据提供一致访问的方法。数据客户端应用程序可以使用ADO.NET来连接到这些数据源,并查询、添加、删除和更新所包含的数据。
         ADO.NET支持两种访问数据的模型:无连接模型和连续模型。无连接模型将数据下载到客户机器上,并在客户机上将数据封装到内存中,然后可以像访问本地关系数据库一样访问内存中的数据(如DataSet)。连接模型依赖于逐条的访问,这种访问要求打开并保持与数据源的连接。
         这里可以用趣味化的方式理解ADO.NET对象模型的各个部分:
C#学习之旅(三)
         ①、数据库好比水源,存储了大量的数据。
         ②、Connection对象好比伸入水中的进水龙头,保持与水的接触,只有它与水进行了“连接”,其他对象才可以抽到水。
         ③、Command对象则像抽水机,为抽水提供动力和执行方法,通过“水龙头”,然后把水返给上面的“水管”。
         ④、DataAdapter、DataReader对象就像输水管,担任着水的传输任务,并起着桥梁的作用。DataAdapte对象像一根输水管,通过发动机,把水从水源送到水库里进行保存。而DataReader对象也是一种水管,和DataAdaper对象不同的是,它不把水送到水库里面,而是单向的直接把水送到需要水的用户那里或田地里。所以要比在水库中转一下速度更快。
         ⑤、DataSet对象则是一个大水库,把抽上来的水按一定比例关系的池子进行存在。即使撤掉“抽水装置”(断开连接,离线状态),也可以保持“水”的存在。这也正是ADO.NET的核心。
         ⑥、DataTable对象则像水库中的每个独立的水池子,分别存放不同种类的水。一个大水库由一个或多个这样的水池子组成。

        1.3、连接数据库:Connection对象

        1.3.1、Connection对象概述

        (1)、Connection对象是一个连接对象,主要功能是建立与物理数据库的连接。其主要包括4种访问数据库的对象类,也可称为数据提供程序,分别介绍如下。
        ①、SQL Server数据提供程序,位于System.Data.SqlClient命名空间。
        ②、ODBC数据提供程序,位于System.Data.Odbc命名空间。
        ③、OLEDB数据提供程序,位于System.Data.OleDb命名空间。
        ④、Oracle数据提供程序,位于System.Data.OracleClient命名空间。

        (2)、根据使用数据库的不同,引用不同的命名空间,然后通过命名空间中的Connection对象连接类连接数据库。例如:连接SQL Server数据库,首先要通过using System.Data.SqlClient命令引用SQL Server数据提供程序,然后才能调用空间下SqlConnection类连接数据库。

        1.3.2、连接数据库

        (1)、以SQL Server数据库为例,如果要连接SQL Server数据库,必须使用System.Data.SqlClient命名空间下的SqlConnection类。所有首先要通过using System.Data.SqlClient命令引用命名空间,连接数据库之后,通过调用SqlConnect对象的Open()方法打开数据库。通过SqlConnection对象的State属性判断数据库的连接状态。语法如下:public override ConnectionState State{get;}。

        (Connection枚举的值及说明)

C#学习之旅(三)

        1.3.3、关闭连接

        (1)、当对数据库操作完毕后,要关闭与数据库的连接,释放占用的资源。通过调用SqlConnection对象的Close方法或Dispose方法关闭与数据库的连接,这两种方法的主要区别是:Close方法用于关闭一个连接,而Dispose方法不仅关闭一个连接,而且还清理连接所占用的资源。当使用Close方法关闭连接后,可以再调用Open方法打开连接,不会产生任何错误。而如果使用Dispose方法关闭连接,就不可以再次直接用Open方法打开连接,必须再次重新初始化连接再打开。

C#学习之旅(三)
C#学习之旅(三)
C#学习之旅(三)
        (2)、在编写应用程序时,对数据库操作完成后,要及时关闭数据库的连接,以防止在对数据库进行其他操作时,数据库被占用。

        1.4、执行SQL语句:Command对象

        1.4.1、Command对象概述

        (1)、Command对象是一个数据命令对象,主要功能是向数据库发送查询、更新、删除、修改操作的SQL语句。Command对象主要有以下几种方式。
        ①、SqlCommand:用于向SQL Server数据库发送SQL语句,位于System.Data.SqlClient命名空间。
        ②、OleDbCommand:用于向使用OLEDB公开的数据库发送SQL语句,位于System.Data.OleDb命名空间。例如,Access数据库和MySQL数据库都是OLEDB公开的数据库。
        ③、OdbcCommand:用于向ODBC公开的数据库发送SQL语句,位于System.Data.Odbc命名空间。有些数据库没有提供相应的连接程序,则可以配置好ODBC连接后,使用OdbcCommand。
        ④、OracleCommand:用于向Oracle数据库发送SQL语句,位于System.Data.OracleClient命名空间。

        (2)、在使用OracleCommand向Oracle数据库发送SQL语句时,要引入System.Data.OracleClient命令空间。但是在默认情况下没有此命名空间。此时,需要将程序集System.Data.OracleClient引入项目中。引入程序集的方法是在项目名称上右击,在弹出的快捷菜单中选择“添加引用”命令,打开“添加引用”对话框。在该对话框中选择System.Data.OracleClient程序集,单击“确定”按钮,即可将其添加到项目中。

        1.4.2、设置数据源类型

        (1)、 Command对象有3个重要的属性,分别是Connection属性、CommandText属性和CommandType属性。Connection属性用于设置SqlCommand使用的SqlConnection。CommandText属性用于设置要对数据源执行的SQL语句或存储过程。CommandType属性用于设置指定CommandText的类型。CommandType属性的值是CommandType枚举值,CommandType枚举有3个枚举成员,分别介绍如下。
        ①、StoredProcedure:存储过程的名称。
        ②、TableDirect:表的名称。
        ③、Text:SQL文本命令。

C#学习之旅(三)

        1.4.3、执行SQL语句

        (1)、Command对象需要取得将要执行的SQL语句,通过调用该类提供的多种方法,向数据库提交SQL语句。
        (2)、ExecuteNonQuery()方法:执行SQL语句,并返回受影响的行数。在使用SqlCommand向数据库发送增、删、改命令时,通常使用ExecuteNonQuery()方法执行发送的SQL语句。

C#学习之旅(三)
        (3)、ExecuteReader()方法:执行SQL语句,并生成一个包含数据的SqlDataReader对象的实例。

C#学习之旅(三)
        (4)、ExecuteScalar()方法:执行SQL语句,返回结果集中的第一行的第一列。在上述实例中,已经使用ExecuteScalar()方法获取指定数据表中的数据数量,ExcuteScalar()方法通常与聚合函数一起使用。

        (常见的聚合函数及说明)

        1.5、读取数据:DataReader对象

        1.5.1、DataReader对象概述

        (1)、DataReader对象是数据读取器对象,提供只读向前的游标,如果应用程序需要每次从数据库中取出最新的数据,或者只是需要快速读取数据,并不需要修改数据,那么就可以使用DataReader对象进行读取。对于不同的数据库连接,有不同的DataReader类型。
        ①、在System.Data.SqlClient命名空间下时,可以调用SqlDataReader类。
        ②、在System.Data.SqlClient命名空间下时,可以调用SqlDataReader类。
        ③、在System.Data.Odbc命名空间下时,可以调用OdbcDataReader类。
        ④、在System.Data.Oracle命名空间下时,可以调用OracleDataReader类。
        在使用DataReader对象读取数据时,可以使用ExecuteReader()方法,根据SQL语句的结果创建一个SqlDataReader对象。
        在创建DataRelation时,它首先验证是否可以建立关系。在创建DataRelation和将其添加到DataRelationCollection(DataSet的DataRelation对象的集合)之间的这段时间,可以对父行或子行进行其他更改。

        1.5.2、判断查询结果是否有值

        (1)、可以通过SqlDataReader对象的HasRows属性获取一个值,该值指示SqlDataReader是否包含一行或多行,即判断查询结果中是否有值。语法如下:public override bool HasRows {get;}。属性值:如果SqlDataReader包含一行或多行,则为true;否则为false

C#学习之旅(三)

        1.5.3、读取数据

        (1)、如果要读取数据表中的数据,通过ExecuteReader方法,根据SQL语句创建一个SqlDataReader对象后,再调用SqlDataReader对象的Read方法读取数据。 Read()方法使SqlDataReader前进到下一条记录,SqlDataReader的默认位置在第一条记录前面。因此,必须调用Read()方法访问数据。对于每个关联的SqlConnection,一次只能打开一个SqlDataReader,在第一个关闭之前,打开另一个的任何尝试都将失败。语法如下: public override bool Read ()。
        在使用完SqlDataReader对象后,要使用Close方法关闭SqlDataReader对象。语法如下:public override void Close ()。

//实例化SqlConnection变量conn
SqlConnection conn = new    SqlConnection("server=.;database=db_15;uid=sa;pwd=");
//打开连接
conn.Open();
//创建一个SqlCommand对象
SqlCommand cmd = new SqlCommand("select * from "+textBox1.Text.Trim(), conn);
//使用ExecuteReader方法创建SqlDataReader对象
SqlDataReader sdr = cmd.ExecuteReader();
sdr.Close();

        1.6、数据适配器:DataAdapter对象

        1.6.1、DataAdapter对象概述

        (1)、DataAdapter对象是一个数据适配器对象,是DataSet与数据源之间的桥梁。DataAdapter对象提供了4个属性,用于实现与数据源之间的互通。
        ①、SelectCommand属性:向数据库发送查询SQL语句。
        ②、DeleteCommand属性:向数据库发送删除SQL语句 。
        ③、InsertCommand属性:向数据库发送插入SQL语句。
        ④、UpdateCommand属性:向数据库发送更新SQL语句。
        再对数据库进行操作时,只要将这4个属性设置成相应的SQL语句即可。DataAdapter对象中还有几个主要的方法:具体如下。
        (1)、Fill()方法用数据填充DataSet。语法如下:public int Fill(DataSet dataSet, string srcTable)。dataSet:要用记录和架构(如必要)填充的DataSet。srcTable:用于表映射的源表的名称。返回值:已在DataSet中成功添加或刷新的行数,这不包括受不返回行的语句影响的行。
        (2)、Update()方法更新数据库时,DataAdapter将调用DeleteCommand,InsertCommand以及UpdateCommand属性。语法如下:public int Update(DataTable dataTable)。dataTable:用于要更新数据源的DataTable。返回值:DataSet中成功更新的行数。
        例如,如果使用DataAdapter对象的Fill()方法从数据源中提取数据并填充到DataSet时,就会用到SelectCommands属性中设置的命令对象。

        1.6.2、填充DataSet数据集

        (1)、通过DataAdapter对象的Fill方法填充DataSet数据集,Fill方法使用Select语句从数据源中检索数据。与Select命令关联的Connection对象必须有效,但不需要将其打开。

C#学习之旅(三)
        (2)、DataSet和DataTable对象从MarshalByComponent(实现IComponent并提供可远程控制的组件的基实现)继承而来,并支持用于远程处理ISerializable接口。

        1.6.3、更新数据源

        (1)、使用DataAdapter对象的Update方法,可以将DataSet(在15.7节中将会介绍DataSet对象)中修改过的数据及时地更新到数据库中。在调用Update方法之前,要实例化一个CommandBuilder类,它能自动根据DataAdapter的SelectCommand的SQL语句判断其他的InsertCommand、UpdateCommand和DeleteCommand。这样,就不用设置DataAdapter的InsertCommand、UpdateCommand和DeleteCommand属性,直接使用DataAdapter的Update方法来更新DataSet、DataTable或DataRow数组即可。

C#学习之旅(三)
        (2)、使用Update()方法更新数据时,要求更新的数据表必须要主键,否则将会产生异常信息,无法执行更新操作。
        (3)、在DataTable对象上可以多次使用Fill()方法。如果主键存在,则传入行会与已有的匹配合并;如果主键不存在,则传入行会追加到DataTable中。

        1.7、数据集:DataSet对象

        1.7.1、DataSet对象概述

        (1)、DataSet对象就像存放于内存中的一个小型数据库。它可以包含数据表、数据列、数据行、视图、约束以及关系。通常,DataSet的数据来源于数据库或者XML,为了从数据库中获取数据,需要使用数据适配器(DataAdapter)从数据库中查询数据。

        1.7.2、合并DataSet内容

        (1)、可以使用DataSet的Merge方法将DataSet、DataTable或DataRow数组的内容并入现有的DataSet中。Merge方法将指定的DataSet及其架构与当前的DataSet合并,在此过程中,将根据给定的参数保留或放弃在当前DataSet中的更改并处理不兼容的架构。
    语法如下:
        public void Merge (
                DataSet dataSet,
                bool preserveChanges,
                MissingSchemaAction missingSchemaAction
        )
    dataSet:其数据和架构将被合并到DataSet中。
    preserveChanges:要保留当前DataSet中更改,则为true;否则为false。
    missingSchemaAction:MissingSchemaAction枚举值之一。

        (MissingSchemaAction枚举成员及说明)

C#学习之旅(三)
        (2)、当DataSet对象为null时,无法进行合并。

        1.7.2、合并DataSet内容

        (1)、为了在不影响原始数据的情况下使用数据,或者使用DataSet中数据的子集,可以创建DataSet的副本。当复制DataSet时,可以:
    ①、创建DataSet的原样副本,其中包含架构、数据、行状态信息和行版本。
    ②、创建包含现有DataSet的架构但仅包含已修改行的DataSet。可以返回已修改的所有行或者指定特定的DataRowState。有关行状态的更多信息,可参考行状态和行版本。
    ③、仅复制DataSet的架构(即关系结构),而不复制任何行。可以使用ImportRow将行导入现有的DataTable。
    可以使用DataSet对象的Copy方法创建包含架构和数据的DataSet的原样副本。Copy方法的功能是复制指定DataSet的结构和数据。
    语法:
        public DataSet Copy ()
    返回值:新的DataSet,具有与该DataSet相同的结构(表架构、关系和约束)和数据。

C#学习之旅(三)

        1.8、Entity Framework编程基础

        1.8.1、什么是Entity Framework

        (1)、Entity Framework(以下简写为EF)是微软官方发布的ORM框架,它是基于ADO.NET的,通过EF可以很方便的将表映射到实体对象或将实体对象转换为数据表。
        (2)、ORM是将数据存储从域对象自动映射到关系型数据库的工具。ORM主要包括3个部分:域对象、关系数据库对象、映射关系。ORM使类提供自动化CRUD,使开发人员从数据库API和SQL中解放出来。
        (3)、EF有3种使用场景,分别如下:
    ①、从数据库生成Class
    ②、由实体类生成数据库表结构
    ③、通过数据库可视化设计器设计数据库,同时生成实体类。

C#学习之旅(三)

        1.8.2、Entity Framework实体数据模型

        (1)、Entity Framework的实体数据模型(EDM)包括3个模型:概念模型、映射和存储模型,分别如下:
    ①、概念模型:概念模型由概念框架定义语言文件(.csdl)来定义,包含模型类和它们之间的关系,独立于数据库表的设计。
    ②、映射:映射有映射规范语言文件(.msl)来定义,它包含有关如何将概念模型映射到存储数据模型的信息。
    ③、存储模型:存储模型有存储框架定义语言文件(.ssdl)来定义,它是数据库设计模型,包括表、视图、存储的过程和它们的关系和键。

C#学习之旅(三)

        1.8.3、Entity Framework运行环境

        (1)、Entity Framework框架曾经为是.NET Framework的一部分,但Version 6之后,从.NET Framework中分离出来,其中,EF5由两部分组成:EF API和 .NET Framework 4.0/4.5,而EF6是独立的EntityFramework.dll,不依赖.NET Framework。使用NuGe即可安装EF,在安装Visual Studio 2017开法环境时,会自动安装EF5.0和6.0版本。

C#学习之旅(三)

        1.8.4、创建实体数据模型

        (1)、创建一个Windows窗体应用程序,选中当前项目并右击,在下拉列表中选择管理NuGet程序包,点击进入,选择浏览,搜索EntityFramework包,点击下载。

C#学习之旅(三)
        (2)、下载完成后,选中当前项目并右击,依次选择“添加”—>“新建项”,在弹出“添加新建项”对话框中,该对话框的左侧“已安装”下选择“Visual C#项”,右侧列表中找到“ADO.NET实体数据模型”并选中,在“名称”文本框中输入实体数据模型的名称,可以与数据库名相同。

C#学习之旅(三)
        (3)、弹出“实体数据模型向导”对话框,在该对话框中选择“来自数据库的EF设计器”。

C#学习之旅(三)
        (4)、单击“下一步”按钮,在弹出的窗口中点击“新建连接”按钮,弹出“选择数据源”对话框。在该对话框中选择“Microsoft SQL Server”。

C#学习之旅(三)
        (5)、单击“继续”按钮,弹出“连接属性”对话框。
        数据源:单击“更改”按钮,选择“MicroSoft SQL Server(SqlClient)”选项,如果默认为该项,请忽略。
        服务器名:单击下拉表右侧的下拉按钮会自动寻找本机机器名称,如果数据库存在本地,那么选择自己的机器名即可。
        身份验证:在“身份验证”下拉列表中选择“SQL Server身份验证”选项,填写用户名和密码(数据库登陆名和密码)。
        选中“选择或数据数据库名称”单选按钮,在其下拉列表单击右侧的下拉按钮,找到想要映射的数据库名称。

C#学习之旅(三)
        (6)、以上信息配置完毕后,单击“确定”按钮,在是否要在连接字符串中加入敏感数据单选框中选择“是”。

C#学习之旅(三)
        (8)、单击“下一步”按钮,跳转到“选择您的数据库对象和设置”对话框,这里暂时使用不到“视图”或“存储过程的函数”,所以只能选择“表”选项即可,单击完成按钮。

C#学习之旅(三)
        (9)、等待生成完成后,编辑器自动打开模型页面以展示关联性。

C#学习之旅(三)

        1.8.5、通过EF对数据表进行增删改查操作

        (1)、在默认窗体中添加7个TextBox控件,分别用来输入或者编辑商品信息;添加一个ComboBox控件,用来显示商品的单位;添加两个Button控件,分别用来实现添加和修改商品信息的功能;添加一个DataGridView控件,用来实时显示数据表中所有商品信息。

C#学习之旅(三)
C#学习之旅(三)
C#学习之旅(三)


Select语句的参数即说明
参数 说明
Select_list 指定由查询返回的列。它是一个逗号分割的表达式列表。每个表达式同时定义格式(数据类型和大小)和结果集列的数据来源。每个选择列表表达式通常是从中获取数据的源表或视图的引用,但也可以是其他表达式,例如常量或T-SQL函数。在选择列表中使用“*”表达式指定返回源表中的所有列。
INTO new_table_name 创建新表并将查询行从查询插入新表中。new_table_name指定新表的名称。
FROM table_list 指定从其中检索行的表。这些来源可能包括基表、视图和链接表。From子句还可以包含连接说明,该说明定义了SQL Server用来在表之间进行导航的特定路径。From子句还用在Delete和Update语句中,以定义要修改的表。
WHERE search_conditions Where子句指定用于限定返回的行的索引条件。Where子句还用在Delete和Update语句中以定义目标表中要修改的行。
GROUP BY group_by_list Group By 子句根据 group_by_list 列中的值将结果集分成组。例如,Student表在“性别”中有两个值。Group By ShipVia子句将结果分成两组,每组对应于ShipVia的一个值。
HAVING search_condition Having 子句是指定组或聚合的搜索条件。逻辑上讲,Having子句从中间结果集对进行筛选,这些中间结果集是用Select语句中的From、Where或Group By子句创建的。Having子句通常与Group By子句一起使用,尽管Having子句前面不必有Group By子句。
ORDER BY order_list [ASC | DESC] Order By子句定义结果集中的行排列的顺序。order_list指定组成排序列表的结果集的列。ASC和DESC关键字用于指定行是按升序还是降序排列。Order By之所以重要,是因为关系理论规定除非已经指定Order By,否则不能假设结果集中的行带有任何序列。如果结果集行的顺序对于Select语句来说很重要,那么在该语句中就必须使用Order By子句。







Insert语句的参数及说明
参数 说明
[INTO] 一个可选的关键字,可以将它用在INSERT和目标表之前
table_name 将要接受数据的表或table变量的名称
view_name 视图的名称及可选的别名。通过view_name来引用的视图必须是可更新的
(column_list) 要在其中插入数据的一列或多列的表。必须用圆括号将clumn_list括起来,并且用逗号进行分割
VALUES 引入要插入的数据值的列表。对于column_list(如果已指定)中或者表中的每一列,都必须有一个数据值。必须用圆括号将值列表括起来。如果VALUSE列表中的值、表中的值与表中列的顺序不相同,或者未包含表中所有列的值,那么必须使用column_list明确地指定存储每个传入值的列
DEFAULT 强制SQL Server装载为列定义的默认值。如果对于某列并不存在默认值,并且该列允许NULL,那么就插入NULL.
expression 一个常量、变量或表达式。表达式不能包含Select或Execute语句
derived_tabel 任何有效的Select语句,它将返回装载到列表中的数据行







Update语句的参数及说明
参数 说明
tabel_name 需要更新的表的名称。如果该表不在当前服务器或数据库中,或不为当前用户所用,那么这个名称可用连接服务器、数据库和所有者名称来限定
WITH(<table_hint_limited>[,…n]) 指定目标表所允许的一个或多个表提示。需要有WITH关键字或圆括号。不允许有READPAST、NOLOCK和READUNCOMMITTED
view_name 要更新的视图的名称。通过view_name来引用的视图必须是可更新的。用UPDATE语句进行的修改,至多只能影响视图的FROM子句引用的基表中的一个
rowset_function_limited OPENQUERY或OPENROWSET函数,视提供程序功能而定
SET 指定要更新的列或变量名称的列表
column_name 含有要更改数据的列的名称。column_name必须驻留与UPDATE子句中所指定的表或视图中。标识符不能进行更新。
expression 变量、字面值、表达式或加上括弧的返回单个值的subSELECT语句。expression返回的值将替换column_name或@variable中的现有值。
DEFAULT 指定使用对列定义的默认值替换列中的现有值。如果该列没有默认值并且定义为允许空值,也可以用来将列更改为NULL。
@variable 已声明的变量,该变量将设置为expression所返回的值
FROM<table_source> 指定用表来为更新操作提供准则
WHERE 指定条件来限定所更新的行
<search_condition> 为要更新行指定需满足的条件。搜索条件也可以是连续所基于的条件。对搜索条件中可以包含的谓词数量没有限制
CURRENT OF 指定更新在指定游标的当前位置进行
GLOBAL 指定cursor_name指定的是全局游标
cursor_name 要从中进行提取的开方游标的名称。如果同时存在名为cursor_name的全局游标和局部游标,在指定了GLOBAlL时,则cursor_name指的是全局游标;如果为指定GLOBAL,则cursor_name指局部游标。游标必须允许更新。
cursor_variable_name 游标变量的名称。cursor_variable_name必须引用允许更新的游标
OPTION(<query_hint>[,…n]) 指定优化程序提示用于自定义SQL Server的语句处理







Delete语句的参数及说明
参数 说明
table_name 需要更新的表的名称。如果该表不在当前服务器或数据库中。或不为当前用户所有,那么这个名称可用链接服务器、数据库和所有者名称来限定。
WITH(<table_hint_limited>[,…n]) 指定目标表所允许的一个或多个表提示。需要有WITH关键字或圆括号。不允许有READPAST、NOLOK和READUNCOMMITTED
view_name 要更新的视图的名称。通过view_name来引用的视图必须是可更新的。用UPDATE语句进行进行的修改,至多只能影响视图的FROM子句所引用的基表中的一个
rowset_function_limited OPENQUERY或OPENROWSET函数,视提供程序功能而定
FROM<table_source> 指定用表来为更新操作提供准则
WHERE 指定条件来限定所更新的行
<search_condition> 为要更新的行指定所需满足的条件。搜索条件也可以是连续所基于的条件。对搜索条件中可以包含的谓词数量没有限制。
CURRENT OF 要从中进行提取的开放游标的名称。如果同时存在名为cursor_name的全局游标和局部游标,在指定了GLOBAL时,则cursor_name指的是全局游标;如果未指定GLOBAL,则cursor_name指局部游标。游标必须允许更新
cursor_variable_name 游标变量的名称。cursor_variable_name必须引用允许更新的游标
OPTION(<query_hint>[,…n]) 指定优化程序提示用于自定义SQL Server的语句处理







Connection枚举的值及说明
枚举值 说明
Broken 与数据源的连接中断。只有在连接打开之后才可能发生这种情况。可以关闭处于这种状态的连接,然后重新打开。
Closed 连接处于关闭状态
Connecting 连接对象正在与数据源连接
Executing 连接对象正在执行命令
Fetching 连接对象正在检索数据
Open 连接处于打开状态







常见的聚合函数及说明
聚合函数 说明
AVG(expr) 列平均值,该列只能包含数字数据
COUNT(expr)、COUNT(*) 列值的计数(如果将列名指定为expr)、表或分组中所有行的计数(如果指定*)忽略空值,但COUNT(*)在计数中包含空值
MAX(expr) 列中最大值(文本数据类型中按字母顺序排在最后的值),忽略空值
MIN(expr) 列中最小值(文本数据类型中按字母顺序排在最前的值),忽略空值
SUM(expr) 列值的和,该列只能包含数字数据







MissingSchemaAction枚举成员及说明
聚合函数 说明
Add 添加必要的列以完成架构
AddWithKey 添加必需的列和主键信息已完成架构,用户可以在每个DataTable上显示设置主键约束。这将确保对与现有记录匹配的传入记录进行更新,而不是追加
Error 如果缺少指定的列映射,则生成InvalidOperationException
Ignore 忽略额外列

上一篇:盒子布局与css中的两种渐变


下一篇:R语言--apply家族