ado.net的简单数据库操作(一)

  摘要:接下来的几篇博客将要讲到如何使用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 后面写的是你数据库的地址,你连的是那个数据库,本机的话,这里写 localhost\127.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

 

posted @ 2018-08-01 14:56  CherishTheYouth  阅读(919)  评论(3编辑  收藏  举报