本章简言

上一章讲到关于C#语法的基础部分。了解相关的基础部分之后我们就要去了解一下C#是什么样子访问数库的。C#把访问数据库这一部分的知识点叫作ADO.NET。即是JAVA常常讲到的JDBC这一部分的知识点了。笔者根据使用数据库方式的不同又分为有线连接和无线连接(关于有线和无线的叫法是笔者个人定义的。因为看了不同的书里面很多叫法)。不管是什么样子的叫法。只要明白有线是保持连接的状态下操作数据库。而无线是连接之后复制一份副本,关闭连接,对副本进行操作之后,在连接更新数据库。笔者认为如果只是使用的话,只要了解对应的几个相关的类就可以了。如果有搞研究的话,就是对他内部的一些机制进行学习了。那么这里只是讲到如何使用。

 ADO.NET的概念

由于本系列并不是主讲ADO.NET。所以这里笔者只会教上面定义有线连接方式相关的类。不管如何让我们先看一下ADO.NET类相关联的所有基类吧。这样子也方便我们下面的学习。

下面是ADO.NET的基类信息

DbConnection类:用于连接数库的类。相当于JDBC里面通过DriverManager.getConnection方法获得Connection接口对应的实例类。

DbCommand类:用于存放数据源执行的 SQL 语句或存储过程的类。相当JDBC里面的Statement接口。

DbDataReader类:从数据源读取行的一个只进流。即是执行SQL结果的存放地方。相当于JDBC里面的ResultSet接口

DbParameter类:用于表示DbCommand里面对应的参数。相当于JDBC里面的PreparedStatement的填充参数一样子。

DbParameterCollection类:不用看就知道DbParameter类的集合类。

DbTransaction类:用于事务的类。相当于JDBC里面的conn.setAutoCommit(false)的功能。这个不会不清楚吧。

DbDataAdapter类:这个类常用于DataSet一起用。也就是说他是笔者上面定义的无线连接方式。

DbCommandBuilder类:用于协调 DataSet 的更改与关联数据库的单表命令。即是跟上面的DbDataAdapter类常常一起用。

DbConnectionStringBuilder类:用于生成连接字符串。

事实上ADO.NET所有的类都是基于上面的基类。想要使用ADO.NET的话,只要了解上面的基类就可以了。如果更深入的话,笔者也不清楚什么做了。至于上面的基类C#把他们按类层次划分为连接类和非连接类。如下面笔者在网络上找到的一张图片。我们就可以很清楚的知道哪一些是连接类,哪一些是非连类。

显然连接就是连接数库时用的类,非连接就是在没有数据库的情况相关类了。而上面笔者是根据操作数据库模式进行划分的。希望不要误导各位的理解。上面左边的方框里面就是属于连接类,右边的方框是属于非连接类。

连接类:DbConnection类、DbCommand类、DbTransaction类、DbParameter类、DbDataAdapter类

非连接类:DataTable类、DataRow类、DataRowCollection类、DataColumn类、DataColumnCollection类、DataRelation类、DataRelationCollection类

学习ADO.NET,事实上就是学习ADO.NET对应的类。有了我们对上面类的一定的了解之后。笔者只要自己动手写一个小例子就可以理解和明白了。

ADO.NET的例子

笔者的数据库用是SQL Server 2008。新建一个数据库,笔者将他命名为Ado。在新建一个张表为Catalogs。如下SQL语句

表的SQL:

CREATE TABLE [dbo].[Catalogs](
[ID] [int] NOT NULL,
[CatalogName] [nvarchar](50) NULL,
[CatalogCode] [nvarchar](50) NULL,
CONSTRAINT [PK_Catalogs] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

数据的SQL:

INSERT [Catalogs] ([ID], [CatalogName], [CatalogCode]) VALUES (1, N'图书', N'c0001')
INSERT [Catalogs] ([ID], [CatalogName], [CatalogCode]) VALUES (2, N'计算机', N'c0002')

好了。有了上面的数据和表之后,笔者就要简单做一个获得数据的例子来学习ADO.NET的知识。

一、首先我们要想办法和数据库发生关系。即是连接到数据库。对JDBC来讲第一步是加载对应数据库驱动。相信下面这段代码做JAVA不可能不懂吧。可惜C#这边却好像没有这一步。JDBC做了这一步之后才开始获得对应的连接类实例。

JDBC的加载驱动:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

JDBC的获得连接:

String url = "jdbc:sqlserver://localhost;databaseName=AAA";
Connection conn = DriverManager.getConnection(url,"sa","123");

至于ADO.NET却没有那么复杂。直接实例化一个数据库连接类就行了。如下的代码

ADO.NET的获得连接:

SqlConnection connection = new SqlConnection("Data Source=.;Initial Catalog=Ado;User ID=sa;Password=123");

这里笔者讲一个小手段。相信JDBC在获得连接字符串的时候,是一件很头痛的事情。只能百度或死记。而C#这边如果用的是SQL Server 的话。到是可以用VS的“服务器资源管理器”视图来获得对应的连接字符串。

右击图上的“数据连接”》添加连接(A)

这个时候就是弹出一个让你选择要连接的数据库信息。如图下。

先在服务器名的方框中填写"."。然后在选择使用WINDOW 或是 SQL SERVER。最后你就可以在“选择或输入数据库名称”中下拉选择你所对应的数据库了。这个时候点击确定按扭就会在“服务器资源管理器”视图中“数据连接”下方多出一个连接。先择右击》属性

点击“属性(R)”之后就会弹出对应的属性窗体了。这才是我们最后需要的信息了。如图下。看到连接字符串了没有。就是他了。复制一下就可以了。只是密码部分修改一下就可以了。因为他是******。这是不对的。

连接字符串对应的值:

Data Source=.;Initial Catalog=Ado;User ID=sa;Password=***********

SqlConnection类就是DbConnection类的子类。有心的读者可能看出一些问题来。是不是说明一点:每一个不同的数据库是不是对应的在Connection前面加上对应的关键字母呢?即是XxxConnection。Xxx可能会变。没有错。笔者想说一点就是这个。在JDBC里面不同的数据库会加载不同的驱动。如MySql就加载MySql的驱动。Sql Sever就是加载Sql Sever的驱动。只是C#这边没有对应的加载驱动的说法。事实上笔者认为有。只是变了而以。XxxConnection的Xxx便是最好的体现。

二、新建一个SQL命令。即是新建一个DbCommand类对应的实例类。这个部分相当JDBC的Statement stmt = conn.createStatement()了。

C#:

SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "SELECT TOP 1000 [ID] ,[CatalogName] ,[CatalogCode] FROM [Ado].[dbo].[Catalogs]";
command.CommandType = System.Data.CommandType.Text;

SqlCommand类是DbCommand类的子类。这个笔者说了是白说。上面我们知道了DbCommand类的功能。SqlCommand类理解为用于存放SQL命令。同时用于触发SQL命令的执行。首先让我们看一下上面的代码。其中Connection属性和CommandText属性相信大家都明白。如果只是存放SQL命令却不给他对应的连接,他又什么知道去哪里查数据库呢?所以有Connection属性就知道去找哪个数据库了,有CommandText属性就是知道要对这个数据库做什么。而CommandType属性是表示要做的SQL命令是什么类型的。只是SQL语句,还是存储过程,或是只直获得表。(这里的变量connection是上面代的connection一样子)

C#:

 // 摘要:
// 指定如何解释命令字符串。
public enum CommandType
{
// 摘要:
// SQL 文本命令。(默认。)
Text = ,
//
// 摘要:
// 存储过程的名称。
StoredProcedure = ,
//
// 摘要:
// 表的名称。
TableDirect = ,
}

现在SqlCommand类对象实例知道了连接的数据库,也知道要执行SQL命令。接下来便是生成对应的结果。即是执行。那么在执行的时候,又会分了查询和增删改。这一点JDBC也有。Statement接口的executeQuery方法和executeUpdate方法就是最好的证明了。不用笔者多说了。同样子,C#也一样,只是方法名不一样子而以。ExecuteReader方法就是相当于executeQuery方法。但记得ExecuteReader方法这边一般是不用参数的。ExecuteNonQuery方法相当于executeUpdate方法。理解了这俩个方法就好办了。在执行这俩个方法之前,我们还有做一件事情就是打开连接。代码如下

C#:

connection.Open();//打开连接
SqlDataReader dr = command.ExecuteReader();//执行SQL命令

三、处理SQL命令的结果。即是利用SqlDataReader类来获得对应的结果。JDBC中在获得结果的时候,就是利用ResultSet接口。显然俩者很类似。

C#:

SqlDataReader dr = command.ExecuteReader();//执行SQL命令
while (dr.Read())
{
Console.WriteLine(string.Format("CatalogName:{0} CatalogCode:{1}", dr[], dr["CatalogCode"]));
} dr.Close();
connection.Close();

跟JDBC真的很类似,其中dr.Read()就跟ResultSet接口的next()方法类似。而dr[0]和dr["CatalogCode"]跟ResultSet接口的getString()方法类似。注意在执行结束之后要关闭SqlDataReader类和SqlConnection类。让我们看一下执行的结果吧。

上面笔者只做查询的例子却没有做增删改的例子。因为笔者相信对你们来是小事了。只要把SQL命令修改成增删改的语句和ExecuteReader方法变成为ExecuteNonQuery方法。当然这时候就没有返回SqlDataReader类的对象了。有的只是影响的行数而以。代码如下

C#:

SqlConnection connection = new SqlConnection("Data Source=.;Initial Catalog=Ado;User ID=sa;Password=123");
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "UPDATE Catalogs SET CatalogName='小吃' WHERE ID =1";
command.CommandType = System.Data.CommandType.Text;
connection.Open();//打开连接 int affectCount = command.ExecuteNonQuery();
if (affectCount > )
{
Console.WriteLine("修改成功");
}
else
{
Console.WriteLine("修改失败");
} connection.Close();

上面是简单的修改。只要读者们自己组装SQL语句就可以了。那么有没有跟JDBC的PreparedStatement接口功能一样子的方式吗。答案是有的。笔者就直接把代码贴出。你们看一下就知道什么用了。

C#:

SqlConnection connection = new SqlConnection("Data Source=.;Initial Catalog=Ado;User ID=sa;Password=123");
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "UPDATE Catalogs SET CatalogName=@CatalogName WHERE ID =@ID";
command.CommandType = System.Data.CommandType.Text;
connection.Open();//打开连接
command.Parameters.Add(new SqlParameter("@CatalogName", "小吃"));
command.Parameters.Add(new SqlParameter("@ID" ,1)); int affectCount = command.ExecuteNonQuery();
if (affectCount > )
{
Console.WriteLine("修改成功");
}
else
{
Console.WriteLine("修改失败");
} connection.Close();

以上的内容主要是讲了关于有线连接的方式。笔者上面就说过有俩种。一种是有线,一种是无线。关于无线更多是用到SqlDataAdapter类和DataSet类。希望读者们自行研究。

本章总结

本章主要是讲到ADO.NET的部分知识点。专对有线连接的部分知识。对于后面开发.NET来讲会有一定会帮助。不过相信现在有很人不知道ADO.NET是什么。更多都被ORM框架取代了。

Java进击C#——语法之ADO.NET的更多相关文章

  1. Java进击C#——语法之面向对象

    本章简言 上一章笔者讲到关于ADO.NET相关的知识,知道了如何去访问数据库.本章将来讲关于面向对象的思想.不管在JAVA还是在C#面向对象思想的重要性都是占了一个很大的成份.往往他就像呼吸一样子,更 ...

  2. Java进击C#——语法之多线程

    本章简言 上一章中笔者对C#一些独有的语法点进行讲解,相信也可以看C#的一些神奇之处.那么本章主要是放在多线程这方面的知识.不管是C#还是JAVA在开发过程或多或少都会用到关于多线程的编程.当然笔者不 ...

  3. Java进击C#——语法之知识点的改进

    本章简言 上一章我们讲到关于面向对象思想上C#和JAVA之差别.笔者分别从面向对象的三大特性入手.而本章主要讲一些C#改进的知识点.在.NET Framework 2.0之后出现很多新的知识点.这些知 ...

  4. Java进击C#——语法之基础

    本章简言 上一章讲到关于项目工程开发常用的知识点,有了前面俩章的介绍之后.本章正式开始介绍关于C#的基础语法.我们都很清楚C#也是面向对象的计算机语言.而且他跟JAVA的相似度高达80%.所以很多语法 ...

  5. Java进击C#——语法之IO操作

    本章简言 上一章我们对线程同步进行讲解.了解如何去处理可能发生的脏数据.而本章就要讲有关于C#在读取IO文件的时候,常常用到的操作类.这一章的内容会比较少.但是笔者还是总结出来让读者们有一个学习的方向 ...

  6. Java进击C#——语法之线程同步

    上一章我们讲到关于C#线程方向的应用.但是笔者并没有讲到多线程中的另一个知识点--同步.多线程的应用开发都有可能发生脏数据.同步的功能或多或少都会用到.本章就要来讲一下关于线程同步的问题.根据笔者这几 ...

  7. Java进击C#——应用开发之Linq和EF

    本章简言 上一章笔者对于WinForm开发过程用到的几个知识点做了讲解.笔者们可以以此为开端进行学习.而本章我们来讲一个跟ORM思想有关的知识点.在讲之前让我们想一下关于JAVA的hibernate知 ...

  8. Java进击C#——前言

    本章简言 记得三年前笔者来到现在的公司的时候,公司人口不出十个人.那个时候笔者刚从日本回来,想在福州.厦门.青岛找一个合适自己发展的机会.最后我的一个福州的朋友打电话希望我能过去帮他,跟他一起创业.这 ...

  9. Java进击C#——应用开发之WinForm开发

    本章简言 上一章笔者介绍了关于WinForm环境.这一章笔者将继续讲WinForm.只不过更加的面向开发了.事实就是在学习工具箱里面的控件.对于WinForm开发来讲,企业对他的要求并没有那么高.但是 ...

随机推荐

  1. 谢欣伦 - OpenDev原创例程 - 时间同步Time Sync

    很久以前就发现系统自带的时间同步功能很弱,更新时间总是不成功.索性编写一个小软件来更新系统时间,正好用上了我之前写的代码,相关代码可参见文章<化繁为简系列原创教程 - 通信专题 - 无连接套接字 ...

  2. 游戏编程技巧 - Subclass Sandbox

    Subclass Sandbox 使用场景 你正在开发一款类似LOL的游戏,里面有许多英雄角色,你决定把这些英雄类交给小弟们实现.因为在这些英雄中,释放放技能时,有的要使用粒子系统造成炫酷的效果,有的 ...

  3. Powershell 字符串处理案例

    有一张Excel表格收集了计算机名和IP地址,另外一张表有计算机名,需要找出这张表中计算机名对应的IP地址. #定义函数Get-LikeContentInfo function Get-LikeCon ...

  4. JSP学习笔记

    JSP学习笔记 Jsp网页主要分为Elements与Template Data两部分. Template Data:JSP Container不处理的部分,例如HTML内容 Elements:必须经由 ...

  5. java线程学习

    线程概念 当我问别人什么是线程的时候,别人给我讲了一大堆线程如何创建,如何使用以及若干线程的高深问题,其实作为一个资深菜鸟,我就想问问,什么是线程而已,找了书中的一些概念总结了一下,多线程与操作系统中 ...

  6. Metrics.NET 项目

    Metrics.NET(https://github.com/etishor/Metrics.NET)是一个给CLR 提供度量工具的包,它是移植自Java的metrics,在c#代码中嵌入Metric ...

  7. UITableView(一)

    #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITableViewDataSource, ...

  8. Python黑帽编程1.2 基于VS Code构建Python开发环境

    Python黑帽编程1.2  基于VS Code构建Python开发环境 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Atta ...

  9. Nodejs之MEAN栈开发(三)---- 使用Mongoose创建模型及API

    继续开扒我们的MEAN栈开发之路,前面两节我们学习了Express.Jade引擎并创建了几个静态页面,最后通过Heroku部署了应用. Nodejs之MEAN栈开发(一)---- 路由与控制器 Nod ...

  10. [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)

    说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...