• 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 后面写的是你数据库的地址,你连的是那个数据库,本机的话,这里写 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

    声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。对于本博客如有任何问题,可发邮件与我沟通,我的QQ邮箱是:3074596466@qq.com
  • 相关阅读:
    go基础_定时器
    作业3:写一个测试程序,消耗固定内存
    Hdu3397Sequence operation线段树
    Hdu3308LCIS线段树
    Poj3667Hotel线段树
    Poj1436Horizontally Visible Segments线段树
    Poj3225Help with Intervals区间线段树
    Poj2528Mayor's posters线段树
    poj3468A Simple Problem with Integers区间和线段树
    Hdu1698Just a Hook线段树区间更新
  • 原文地址:https://www.cnblogs.com/CherishTheYouth/p/CherishTheYouth_801.html
Copyright © 2020-2023  润新知