非常好,新兵,我们已经成功连接到了数据库,接下来,我们就可以让数据库执行我们的命令了,也就是,可以开始大干一场了。哦,当然,你还得知道如何让数据库执行命令。如果没掌握好技巧而弄巧成拙的话,异常大军会马上赶过来并杀死你的。
一旦SqlConnection类使用了open方法,那么,就代表我们已经连接到了数据库,哦,等等,这是….异常大军!笨蛋,你连接字符串拼错了!怎么办?别慌,下士,microsoft送给我们的工具箱还没用呢,让我打开看看,哦,这是try-catch-finally。另一个是using,对付他们简直绰绰有余。
cry-catch-finally是一种可以捕获异常并处理的语法。话不多说,先看看微软使用说明书上是如何使用它的:
try { conn.Open(); //做一些事情 } catch(Exception) { throw; } finally { conn.Close(); conn.Dispose(); }
我们首先在try块内打开连接,这样的话,如果有异常抛出,那么我们就可以捕获它到catch块中,并且可以判断这是一个什么异常,并写上处理代码。最后finally语句块内的东西是不管上面执行的结果怎么样,它都会最后执行的,在这里,我们选择让它关闭数据库和释放资源。
你很可能会奇怪,我们为什么要手动释放资源,我们不是有微软提供的GC神器么。很遗憾地告诉你,GC神器无法自动回收这个SqlConnection对象,不过微软提供了另一套机制来实现自动释放,那就是IDispose接口。只要是实现了这个接口的对象,就可以通过using关键字来自动释放:
using(SqlConnection co = new SqlConnection()) { //执行一些命令 co.Open(); }
是的,在using语句内初始化实现了IDispose接口的类都可以自动释放的。
好了,之后便让我们开始执行命令吧!
我们的第一步就是创建命令:
using(SqlConnection co = new SqlConnection()) { //执行一些命令 co.Open(); using(SqlCommand cmd = co.CreateCommand()) { cmd.CommandText = "insert into Task(tID,tTitle) values(546,‘开会‘)"; cmd.CommandType = CommandType.Text; } }
其中Type类型是指我们要执行的命令是sql命令(Text)还是存储过程。它默认是Text,所以其实我们没有必要指定它。
好了,接下来是执行命令的函数,我们有四个执行命令的函数
cmd.ExecuteNonQuery(); cmd.ExecuteScalar(); cmd.ExecuteXmlReader(); cmd.ExecuteReader();
第一个是执行非查询命令的函数,它返回一个int类型,代表几行受影响,如(insert,update,delete)
第二个是执行单个查询的函数,它返回查询结果中的第一行第一列,如:
cmd.CommandText = "select tName from Task where tID = 1"; string tName = cmd.ExecuteScalar() as string;
第三个返回一个SqlXmlReader,我们可以使用处理Dom的方式处理这些数据,但是这涉及到更多的知识了,所以一般不实用这个。
第四个返回一个SqlDataReader对象,它适合任意查询命令。主要是依靠read函数来读取数据。每次调用一次read,他就会指到数据的下一行。
具体使用方法如下:
using(var reader = cmd.ExecuteReader()) { while(reader.Read()) { var tN = (string)reader["tName"]; var tID = (int)reader["tID"]; } }
顺便一提,上面这些东西都有异步版本,也就是我们只要加上await/async关键字就可以异步执行命令了,简直不能太给力啊!