摘要:接下来的几篇博客将要讲到如何使用ado.net实现简单的数据库操作,包括增删改等内容。首先会介绍基础的数据库操作,然后以一个实例来进行讲解,这个实例会把一个数据表读取到winform上,然后在winform上有一些按钮和文本框,通过这些实现对数据库里的内容的增删改的操作。我个人比较菜,因此记录计较详细,说话也啰嗦,因此可能会写几篇才能介绍完。
本人属菜鸟一枚,刚接触.net两个星期,写的东西也是照搬自己看的视频里老师教的东西,其目的主要是为了巩固自己学习,当然,如果正好能帮助到和我一样的刚入门的菜鸟,那我也是非常高兴的。闲言少叙,那么我就开始了。
昨天写了一篇关于最简单的三层的随笔,但是,对于里面的数据库的操作只用了一个SqlHelper就一笔带过了,至于这个SqlHelper是怎么实现的,可能很多刚接触.net一两天的同学还是蒙圈的,所以今天借这个实例,详细的说一下ado.net的简单数据库操作。啊?什么?你想问复杂的。抱歉,想问复杂的请走开,为什么?因为我也不会!
下面我正式开始了,哈哈!
第一部分:连接数据库
1.先说一下连接数据库的基本步骤哈:
(1)创建连接字符串:
创建连接字符串有两种方法,分别适用于登录数据库的不同方式,我这里说的是我用的sqlserver数据库哈,其他的数据库应该也差不多吧,我没试过,哈哈!
第一种:windows方式登录
这种方式应该这么写:
string constr = "Data Source = acer-pc; Initial Catalog = 数据库名;Intergrated Security = true";
什么?你还不知道啥是windows的登录方式,好吧,当你用这张图登录的时候,你就是windows登录方式:
第二种:sql账号登录(通常用的都是 sa 账号登录的)
这种方式就这么写
string constr = "Data Source = acer-pc; Initial Catalog = 数据库名; UserID = sa(账户用户名) Passqord = 168168(密码)";
其中,Data Source 后面写的是你数据库的地址,你连的是那个数据库,本机的话,这里写 localhost127.0.0.1服务器名称(上图中的第二个框里的内容)或者直接打个点(.),这几种写法都可以;Initial Catalog 后写数据库的名字就可以了,再后面的就能看懂了吧。
(2)创建连接对象
创建连接对象需要用到这个东东 ==》 SqlConnection (这个类的空间没引进来,需要shift + alt + f10 引入),怎么写?看下面
1 using (SqlConnection con = new SqlConnection(constr)) 2 { 3 4 }
con 就是连接对象了。
(3)打开连接
(4)数据库操作
(5)关闭连接,释放资源
直接看代码吧:
using (SqlConnection con = new SqlConnection(constr)) { con.Open();//打开连接 Console.WriteLine("打开连接成功"); con.Close();//关闭连接 }
可以新建一个控制台程序,在主函数里写上这段代码试一下,这是我的代码和结果:
using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ado801am_ConnectSql { class Program { static void Main(string[] args) { string conStr = "Data Source = acer-pc;Initial Catalog = FirstDB;Integrated Security = true"; using (SqlConnection con = new SqlConnection(conStr)) { con.Open(); Console.WriteLine("连接成功"); con.Close(); } Console.ReadKey(); Console.WriteLine("关闭连接"); } } }
第二部分、数据库操作
数据库操作部分接在上面的第四步,这里又细分了几步,看下面:
1.编写sql语句
这是啥意思呢,其实就是先写个sql = "XXX",比如,你要查询某个表中的全部内容,那你就要写:
string sql = "select * from TbXXX表";
就这。
2.创建一个执行sql语句的对象
这个和创建连接对象一回事,要用到一个这 ==》SqlCommand (这个类的空间没引进来,需要shift + alt + f10 引入),怎么写?还是看下面:
using (SqlCommand cmd = new SqlCommand(sql,con))//两个参数 { }
这里是两个参数哈,不要搞错了。
3.执行sql语句
咋执行啊?调用SqlCommand 里的方法呀!
至于这里有几个方法可以调用,那就要详细讲一下了,趁我自己还记得住,赶快记载下来,哈哈,别哪天突然忘了,毕竟看视频的时候没做笔记。
这里有三个方法可用,分别是:
(1)ExecuteNonQuery():这个方法怎么用呢,执行所有的sql语句都能用吗?显然,不能够啊。这个方法啊,他执行后会给你返回一个 int 类型的值(也就是一个整数),那这个整数代码表啥意思啊,这个整数代表的意思是:你的sql语句对这个表的内容改变的行数;比如啊,你向XXX表中插入了三条记录,那么这哥们儿就给你额返回个整数 3 ,你改变了表中的两条数据,这哥们就给你扔个 2 ,你删除了10条数据,他就给你个 10 ,但是啊,你要是执行查数据的操作,他给你个啥呢?比如:你要查一个名字叫 ChrishTheYouth 的人,那他给你啥呢,答案是: -1 ,为啥?因为,这表中的数据没变化啊,半行都没变化,指望他给你个啥呢!所以,我们在执行增、删、改的sql语句时才能使用这个方法,查的操作就只能借助下面两个方法了。
(2)ExecuteScalar();这个书上是这么写的 ==》返回的是一个 对象(object)类型,返回结果集中的 第一行第一列 的值,什么意思?我的理解是这样的,比如你查一个表里面有没有某个人,如果查到了,他就返回这个人所在这一列的第一个字段的值(通常是id之类的),所以啊,这条语句多用于你查的内容只有那么一条,比如登录的时候,你查某个人在不在表里,结果查出来这个人这一列,那他就返回这一列的这个id给你。
举个例子,看这条sql语句:
select count(*) from TbAreas
这条语句在数据库查到的内容是这样的,看图:
我们用ExecuteScalar()就获得了查询结果的第一行第一列,也就是这个54;
再看一个:
select * from TbAreas where TbAreas.areaName = '天津市'
查询结果是:
而用ExecuteScalar()返回到的就是这个areaId.这么讲应该就懂了吧。在看看第三个:
(3)ExcuteReader():上一个讲的是,当查询单个记录时使用的方法,那么如果我要查询一个表中所有的数据,还要把他显示出来,该怎么办呢?哈哈,那就要用到这里的ExcuteReader()方法啦。这个方法返回的是个类型化的DataReader对象,你查的时候,不管查到了啥,都给你返回个DataReader,但是,别以为这个DataReader里面有数据,这里啥也没有??啊?啥也没有,那你返回这个给我干啥?别急,听我讲,其实啊,你查询的内容都在数据库的内存里存着在,但是这个里面的内容你怎么拿呢?就通过DataReader来拿,这个DataReader啊,它不是一个袋子,在里面装东西,它不是袋子,他是一个人,是一个帮手,是一个纽带,你只能通过这个东西的帮忙,才能把你查询的数据从数据库内存里拿过来。这么说,应该懂了吧。啥??还不懂,那我也没辙了,推荐看看这个博客:http://www.cnblogs.com/net515/archive/2012/06/14/2549267.html
上面就是数据库操作的三个方法啦。接下来,我想讲一下,这个比较复杂的ExcuteReader()是怎么用的,主要是加深自己的理解和印象吧。
ExcuteReader()的用法:
还是写一个实例,结合一个简单实例来说怎么使用这个东西,怎么查数据,怎么把查到的数据取出来。先看代码:
using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ado801am_ConnectSql { class Program { static void Main(string[] args) { string conStr = "Data Source = acer-pc;Initial Catalog = FirstDB;Integrated Security = true";//数据库连接字符串 using (SqlConnection con = new SqlConnection(conStr)) //连接数据库实例 { string sql = "select * from TbClass";//sql语句字符串 using (SqlCommand cmd = new SqlCommand(sql,con)) //执行sql语句实例 { con.Open();//打开数据库连接 using (SqlDataReader reader = cmd.ExecuteReader()) { //查询返回的结果是一个SqlDataReader类型对的对象,这个对象就是reader //判断查询结果中是否有数据 if (reader.HasRows) //reader.HasRows的返回值是bool类型变量,有数据则返回true,无数据则返回false { while (reader.Read()) //reader.Read()把光标读取的光标放在表的第一行,然后每循环一次,向下移动一行,直到遍历完所有行,返回false { for (int i = 0; i < reader.FieldCount; i++) { Console.Write(reader[i] + " "); } Console.WriteLine();//换行 } Console.ReadKey(); } else { Console.WriteLine("未查到任何数据"); } } } } } } }
然后看一下结果和表里的内容是否一致:
显然,查询结果是一致的。
下面具体说一下这个程序里几个点:
(1)reader.HasRows:这个方法的功能就是先看看数据库中有没有查询到你需要的数据,有就返回true,没有就返回false;
(2)reader.Read():这个方法就相当与一个指针,它最开始指向第一行,然后依次向后移动,循环一次移动一次,指到那一行,你就可以读那一行的数据,指导所有行都指完了,它就返回一个false,然后退出这个循环。
(3)reader.FieldCount:这个东西的作用是 ==》获取当前行中的列数;
上面的实例中,也可以不用for循环去取某个行中的各个数据,而是直接把每个每个位置的数据取出来,这样做的话需要指导每个列的数据类型,如下所示:
while (reader.Read()) { Console.Write(reader.GetInt32(0) + " "); Console.Write(reader.GetString(1) + " "); Console.Write(reader.GetString(2) + " "); Console.WriteLine();//换行 } Console.ReadKey();
运行结果如图:
这种reader.GetXXX()的写法有一个问题需要注意,那就是如果数据表中的数据为null,那么就会报出异常,因此在使用这个的时候需要对是否为空进行一个判断,判断方法如下:
Console.Write( reader.IsDBNull(2)?"NULL" : reader.GetString(2));
先判断是否为null,如果为null,则输出NULL,如果不为null,则输出存在的那个值,我修改了刚才的表,是其中有几个值为空,然后分别看看查询的结果:
数据库中的表:
A、添加了null校验的结果
B.不添加校验的结果:
好了,关于ado.net数据库的操作今天就说到这里啊,剩下的晚上再写啊。
写的东西比较浅,没什么含量,太菜了,有什么失误的地方,希望看到的同学可以留言告知,谢谢!
QQ:3074596466