using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 数据库操作
{
    class Program
    {
        static void Main(string[] args)
        {

            //通过ado.net连接数据库
            /*
             连接数据库的步骤:
             1)创建连接字符串:被连接的数据的主机地址、用户名和密码
             Data Source=服务器名字,表示要连接的服务器
             Initial Catelog=默认被连接的某一个数据库的名字
             Integrated Security=true;表示使用windows验证方式连接数据库
             核心类的使用:SqlConnection

             2)创建连接对象
             3)打开连接(如果打开数据库连接没有问题,表示连接成功)
             4)关闭连接,释放资源
             */

            //创建连接字符串
            string constr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;Integrated Security=true";

            //另外一种写法
            string constr1 = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";

            //创建连接对象
            //编译的时候,编译成try{}finally{}
            //F12查看当前类的源码
            //方法名首字母大写
            //CTRL+SHIFT+u:转换成大写字母
            //快捷键:shift+F5、F5
            using (SqlConnection conn=new SqlConnection(constr1))
            {
                //测试打开连接
                conn.Open();
                Console.WriteLine("打印连接成功");
                //关闭连接,释放资源,这些代码不用写了,因为代码写在using代码块中了。
                //conn.Close();
                //conn.Dispose();
            }
            Console.WriteLine("关闭连接,释放资源!"); 
        }
    }
}


using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 通过ado.net操作数据库
{
    class Program
    {
        static void Main(string[] args)
        {

            //核心知识点:SqlConnection .Open()方法  SqlCommand:输送sql语句,获取执行结果  SqlDataReader获取一个数据集,
            //练习数据库的增删改查
            //关键是记住这个流程

            //一、通过ado.net向表中插入一条数据
            string conStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****"; ;
            using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(conStr))
            {

                Console.WriteLine("打开连接成功");
                //如果手动停止数据库服务,就连接不上了!
                //注意要体停止的数ip地址对应的主机上的数据库服务才行;
                //通过数据库服务操作数据库文件;
                //如果本机上的数据库服务被停止了,就不能访问本机的数据库了。
                using (System.Data.SqlClient.SqlCommand sqlCom = new System.Data.SqlClient.SqlCommand(sql, conn))
                {
                    //如果构造函数里面没有,写在这里也是可以的。
                    //sqlCom.CommandText = sql;
                    //sqlCom.Connection = conn;


                    //连接对象玩打开,最早关闭,这样就比较节省资源。
                    conn.Open();

                    //开始执行sql语句:
                    //1)当执行insert update delete操作时,调用这个方法;方法的返回值为int类型表示执行sql语句所影响的行数;如果执行的不是insert delete update返回的值为-1.
                    int r = sqlCom.ExecuteNonQuery();

                    //2)当查询出多行记录、多列结果时调用这个方法
                    //sqlCom.ExecuteReader();

                    //3)当执行单个返回结果的时候(一行记录、一列数据、一个数据时),调用这个方法
                    //sqlCom.ExecuteScalar();
                    Console.WriteLine("成功影响了{0}行数据", r);
                }

            }

            //二、通过ado.net删除表中的一条数据
            //1)创建连接字符串2)使用using创建连接对象3)编写sql语句4)创建SqlCommand对象5)打开数据库连接6)执行相应的操作
            string delStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
            using (SqlConnection conn = new SqlConnection(delStr))
            {
                string sql = "delete from Teacher where TeaID=6";
                using (SqlCommand sqlCom = new SqlCommand())
                {
                    sqlCom.CommandText = sql;
                    sqlCom.Connection = conn;
                    conn.Open();
                    int r = sqlCom.ExecuteNonQuery();
                    Console.WriteLine("成功删除了了{0}语句", r);
                }
            }

            //三、通过ado.net修改表中的一条记录    
            string updStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
            using (SqlConnection sqlConn = new SqlConnection(updStr))
            {
                string sql = "update Teacher set TeaName=N'陈静',TeaSalary=10000 where TeaID=5";
                using (SqlCommand sqlCom = new SqlCommand(sql, sqlConn))
                {
                    sqlConn.Open();
                    int r = sqlCom.ExecuteNonQuery();
                    Console.WriteLine("成功修改了一条数据{0}", r);
                }
            }

            //四、通过ado.net查询表中的记录条数  
            string strConn = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                string sql = "select count(*) from Teacher";
                using (SqlCommand comm = new SqlCommand(sql, conn))
                {
                    conn.Open();
                    //查询结果有可能是null,"select * from Teacher";如果是聚合函数,结果不可能是null;其他的时候就不确定了。
                    //int count =(int) comm.ExecuteScalar(); 存在拆箱操作

                    int count = Convert.ToInt32(comm.ExecuteScalar());
                    Console.WriteLine("表中总共有{0}条数据", count);
                }
            }

            //五,查询所有的记录
            /**
             SqlDataReader的特点:
             1)只能通过read读取数据,不能赋值,不能修改。2)只进,read只能一条一条向前移动,不能后退、跳跃。游标向下移上一条数据就被销毁。
             2)使用read时,必保证连接是打开的。因为此时数据存在服务端,需要自己去拿。当read使用完毕后,必须关闭read,同时关闭连接。
             3)默认情况下SqlDataReader独占一个连接对象,这个连接对象不能在做其他的事情。

             
             */
            string selectAllStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
            using (SqlConnection conn = new SqlConnection(selectAllStr))
            {
                string sql = "select * from Teacher";
                using (SqlCommand comm = new SqlCommand(sql, conn))
                {
                    conn.Open();
                    //调用ExecuteReader()方法,将给定的sql语句在服务器端执行。
                    using (SqlDataReader reader = comm.ExecuteReader())
                    {
                        //所有的结果集都在reader中
                        //查询结果保存在“数据库服务器”的内存当中,并没有直接返回给应用程序结果,只返回给应用程序一个reader。
                        //应用程序必须通过reader来获取数据,每次只能取一条数据。

                        //通过reader对象,一条一条获取数据
                        //先判断是否查询到数据,HasRows row 行 如果有数据就是true没有就是false。
                        if (reader.HasRows)
                        {
                            //调用Read()方法才能取到数据,游标向下移动,
                            while (reader.Read())
                            {
                                //返回结果为真表示能够取到数据,同时游标指向下一行。
                                //获取当前查询语句查询出的列的个数(几列数据)(由查询语句自己确定)
                                for (int i = 0; i < reader.FieldCount; i++)
                                {
                                    //reader[i]结果为object类型,打印出这一行的每一列数据,索引器
                                    Console.Write(reader[i] + "    |    ");
                                    //还可以通过列名索引器获取值
                                    //Console.Write(reader["TeaName"]);

                                    //在给定列名的情况下,获取列的序号
                                    //int index = reader.GetOrdinal("TeaName");

                                    //第二种方式:GetValue只能通过索引获取值
                                    //Console.Write(reader.GetValue(i) + "    |    ");

                                    //通过索引器和GetValues方法,实质没区别

                                    //当遇到数据库中的null值的时候,通过reader.GetValues()或者索引器来获取列的值的时候,拿到的是DBNull.Value,不是c#的null,调用ToString()方法,返回的是空字符串,所以并不会报错。

                                    //使用强类型读取列中的数据,这样结果就不是Object类型了,使用起来更方便。
                                    //reader.GetInt(); 

                                    //获取列中值的两种方式
                                }
                                Console.WriteLine();

                            }
                        }
                        else
                        {
                            Console.WriteLine("没有查询到任何数据!");
                        }

                    }
                }
            }



            //六,打印列对应的值
            string connStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                string sql = "select *  from Teacher";
                using (SqlCommand comm = new SqlCommand(sql, conn))
                {
                    conn.Open();
                    SqlDataReader reader = comm.ExecuteReader();
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            Console.Write(reader.GetInt32(0)+"\t");
                            Console.Write(reader.GetString(1) + "\t");
                            Console.Write(reader.GetBoolean(2) + "\t");
                            Console.Write(reader.GetInt32(3) + "\t");
                            //时间
                            Console.Write(reader.GetDateTime(4) + "\t");
                            //地址
                            Console.Write((reader.IsDBNull(5)) ? "NULL" : reader.GetString(5) + "\t");
                            //邮箱
                            //Console.Write((reader.IsDBNull(6)) ? "NULL" : reader.GetString(6) + "\t");
                            //薪水
                            Console.Write(reader.GetInt32(7) + "\t");
                            //换行
                            Console.WriteLine();

                            //1)注意:通过reader.GetXxx()方法来获取表中的数据时,如果值为null,就会抛出异常,程序停止执行。此时需要手动判断值是否为null。IsDBNull()方法的使用
                            //2)通过GetXxx()获取时间类型的数据 reader.GetDateTime(4)
                            //3)用一个list集合表示一张表中的所有数据

                        }
                    }
                    else
                    {
                        Console.WriteLine("未查询到任何数据!!!");
                      
                    }
                }
            }

            Console.ReadKey();


        }
    }
}

练习:通过ado.net实现数据库的增删改查

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ado.net练习一
{
    class Program
    {
        static void Main(string[] args)
        {
            //练习

            //经常拼错单词怎么破,两次了: MyFirstData,initial catalog
            //你调用哪个查询放哪取决于你想获取什么样的返回结果。
            //验证用户登录相当于把user表中的数据全部对比了一遍,登录其实是查询操作。
            //登录逻辑判断:select count(*) from User where UserName='陈如水',UserPassword='5555';

            //将表中的数据读取到一个List<T>集合里面
            //LoadData();
            //实现对班级表的增删改查
            //1)增加一条用户记录
            //AddTeacher();

            //2)修改用户的信息
            //updateData();

            //3)删除用户记录
            //deleteData();

            //4)获取自动增加的主键值
            //GetPrimaryKeyData();

            //5)登录练习  需要重新写代码
            QueryLogin();
            Console.ReadKey();
        }

        private static void QueryLogin()
        {
            string connStr = @"data source=;initial catalog=MyFirstData; User ID=;PASSWORD=";
            using (SqlConnection conn = new SqlConnection(connStr))
            {

                //这种sql语句只能校验用户是否登录成功,不能校验是用户名还是密码错误
                //string sql = "select count(*) from Teacher where TeaName='陈诗音'";
                int row;
                string sql = "select * from Teacher where TeaName='陈诗音'";
                using (SqlCommand comm = new SqlCommand(sql, conn))
                {
                    conn.Open();
                    row = (int)comm.ExecuteScalar();
                    //已经为TeaName列设置过唯一性约束了。
                }

                if (row > 0)
                {
                    //用户名已经存在
                    string sqlPassword = "select * from Teacher where TeaAge=17";
                    using (SqlCommand comm2 = new SqlCommand(sqlPassword, conn))
                    {
                        int state = (int)comm2.ExecuteScalar();
                        if (state > 0)
                        {
                            Console.WriteLine("登录成功!");
                        }
                        else
                        {
                            Console.WriteLine("密码错误!");
                        }
                    }
                }
                else
                {
                    Console.WriteLine("用户名不存在!");
                }
            }
        }

        //插入数据时,返回自动增长的主键值(获取新纪录的自动编号)
        private static void GetPrimaryKeyData()
        {
            string connStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                {
                    conn.Open();
                    int row = (int)comm.ExecuteScalar();
                    Console.WriteLine("新插入行的记录是{0}", row);
                }
            }
        }

        //删除某一条用户记录
        private static void deleteData()
        {
            string connStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                //删除第十三条记录
                string sql = "delete from Teacher where TeaID=13";
                using (SqlCommand comm = new SqlCommand(sql, conn))
                {
                    conn.Open();
                    int row = comm.ExecuteNonQuery();
                    if (row > 0)
                    {
                        Console.WriteLine("总共有{0}行数据收到影响", row);
                    }
                    else
                    {
                        Console.WriteLine("删除失败!");
                    }
                }

            }
        }

        //修改学生的信息
        private static void updateData()
        {
            string connStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                string sql = "update Teacher set TeaName='张慧慧' where TeaID=12";
                using (SqlCommand comm = new SqlCommand(sql, conn))
                {
                    conn.Open();
                    int row = comm.ExecuteNonQuery();
                    if (row > 0)
                    {
                        Console.WriteLine("总共有{0}行收到影响", row);
                    }
                    else
                    {
                        Console.WriteLine("插入失败!");
                    }
                }
            }
        }

        //添加学生记录,其实是执行插入操作
        private static void AddTeacher()
        {
            string connStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                // TeaName,TeaGender, TeaAge,TeaBirthdat,TeaAddress,TeaEmail, TeaSalary
                {
                    conn.Open();
                    int row = comm.ExecuteNonQuery();
                    if (row > 0)
                    {
                        Console.WriteLine("添加{0}新的记录成功!", row);
                    }
                    else
                    {
                        Console.WriteLine("添加记录失败!");
                    }

                }
            }
        }

        private static void LoadData()
        {

            //声明一个集合,用于存储查询到的所有记录
            List<Teacher> list = new List<Teacher>();

            string connStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                string sql = "select * from Teacher";
                using (SqlCommand comm = new SqlCommand(sql, conn))
                {
                    conn.Open();
                    using (SqlDataReader reader = comm.ExecuteReader())
                    {
                        //判断是否查询到了数据
                        if (reader.HasRows)
                        {
                            //每次读取一条记录的数据
                            while (reader.Read())
                            {
                                //每次循环都要创建一个Teacher对象, TeaName,TeaGender, TeaAge,TeaBirthdat,TeaAddress,TeaEmail, TeaSalary
                                //数据绑定只认属性,不认字段,内部通过反射机制来实现。
                                Teacher teacher = new Teacher();
                                teacher.TeaID = reader.GetInt32(0);
                                teacher.TeaName = reader.GetString(1);
                                teacher.TeaGender = reader.GetBoolean(2);
                                teacher.TeaAge = reader.GetInt32(3);
                                //把日期类型转化成字符串类型
                                teacher.TeaBirthdat = reader.GetDateTime(4).ToString();
                                //值可能为空,进行逻辑判断
                                teacher.TeaAddress = (reader.IsDBNull(5)) ? "NULL" : reader.GetString(5);
                                teacher.TeaEmail = (reader.IsDBNull(6)) ? "NULL" : reader.GetString(6);
                                teacher.TeaSalary = reader.GetInt32(7);
                                //把对象添加到集合
                                list.Add(teacher);
                            }
                        }
                        else
                        {
                            Console.WriteLine("查询不到数据!!!");
                        }
                    }
                }
            }

            Console.WriteLine(list.Count);

        }
    }
}