stmt 深入 真的 读者 方式 对他 新建 文本
本章简言 |
上一章讲到关于 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#:
- 1 // 摘要:
- 2 // 指定如何解释命令字符串。
- 3 public enum CommandType
- 4 {
- 5 // 摘要:
- 6 // SQL 文本命令。(默认。)
- 7 Text = 1,
- 8 //
- 9 // 摘要:
- 10 // 存储过程的名称。
- 11 StoredProcedure = 4,
- 12 //
- 13 // 摘要:
- 14 // 表的名称。
- 15 TableDirect = 512,
- 16 }
现在 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[0], 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 > 0)
- {
- 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[email protected]WHERE ID[email protected]";
- 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 > 0)
- {
- Console.WriteLine("修改成功");
- }
- else
- {
- Console.WriteLine("修改失败");
- }
- connection.Close();
以上的内容主要是讲了关于有线连接的方式。笔者上面就说过有俩种。一种是有线,一种是无线。关于无线更多是用到 SqlDataAdapter 类和 DataSet 类。希望读者们自行研究。
本章总结 |
本章主要是讲到 ADO.NET 的部分知识点。专对有线连接的部分知识。对于后面开发. NET 来讲会有一定会帮助。不过相信现在有很人不知道 ADO.NET 是什么。更多都被 ORM 框架取代了。
Java 进击 C#——语法之 ADO.NET
来源: http://www.bubuko.com/infodetail-2081564.html