连接数据库基本步骤 
1.创建连接字符串

//Data  Source=steve-pc;连接本机
 //Initial Catalog= 数据库名
 //Integrated Security=True//windows验证方式
 string constr="Data Source =steve-pc;Initial Catalog=数据库名;User Id=sa; password=123"

2.创建连接对象

using (SqlConnection con=new SqlConnection(constr))
 {
 //测试 打开连接
 con.open()
 // con.Close()}


3.打开连接
4.关闭连接

 向表中插入一条数据 
 

using(SqlConnection con=new SqlConnection (constr))
  {
   //编写sql语句
   //增加一条
   string sql="insert into TblPerson values ('李凯悦',18,174,0)";
   //创建一个执行sql语句的对像
   using (SqlCommand cmd=new SqlCommand (sql,con))
   {
   //开始执行sql语句
   //打开连接(最晚打开连接,最早关闭连接,节省资源)
   con.open()
   //开始执行语句
   cmd.ExecuteNonQuery();///insert\delete\update语句时,与一个返回值时int类型,表示执行insert,delete,update语句后,所影响的行数,只有执行这三个语句会返回所影响的行数,执行其他永远返回-1
   
   cmd.ExecuteScalar()//当执行返回单个结果 
   cmd.ExecuteReader()//当查询出多行,多列结果的时候 
   
   
   }
  
  }


 
 修改一条语句

update TblPerson set uName="王国维",age=20,height=176 where autoId=44


 
 查询出表中的记录条数

string sql="select count(*) from TblPerson "
  object count =(int)cmd.ExecuteScalar();


 连接字符串 创建连接对象 sql语句 创建命令对象sqlCommand 打开连接 执行
 当sql语句执行的时候,如果是聚合函数那么EXecuteScalar()返回的不可能是null,因为聚合函数不会返回null,但是如果sql语句使用的不是聚合函数。那么ExecuteScalar()方法是有可能返回null的,那么在使用count变量的时候就需要先判断是否为null了
 
 执行完毕后 会从表中查询出一些数据,这些查询出的数据是保存在了数据库服务器的内存当中
 返回给应用程序一个SqlDataReader reader 接下来应用程序要获取数据的话 必须通过reader来获取数据

using (SqlDataReader reader= cmd.ExecuteReader())
  {
   if(reader.HasRows)
   {
    //reader指向第一条数据的前一条  reader.Read()向后移动一条数据
    where(reader.Read())
    {
    //获取当前reader指向的数据
    //reader.FieldCount,可以获取当前查询语句查询出的列的个数
    for(int i=0;i<reader.FieldCount;i++)
    {
     Console.WriteLine(reader[i]+"     ")
     //getvalue只能根据列的索引来获取列的值 //但是通过reader索引器可以通过列名来获取列的值
     Console.WriteLine(reader.GetValue(i))//reader["列名"]
     //当遇到数据库中的null值的时候,通过reader,GetValue()或者reader[]索引器来获取列的值,拿到的是DBNull,不是c#的null ,而DBNull。Value的ToString()方法返回的时空字符串,所以最终没有报错 
     根据列名称获取列的索引
     
     reader.GetOrdinal()
     
     
    }
    }
   }
   
  else
  {
   Console.WriteLine("没有查询到任何数据")
  }
  
  }


 
 Datareader 特点
 1.只读,只进 只能向前移动
 2.使用Reader时必须保证连接时打开状态 当reader使用完毕 后,必须把reader关闭,释放,同时关闭释放连接对象
 3.默认情况下DataReader要求独占一个连接对象
 
 reader.GetXXXX() //使用强类型读取列中的数据 数据为null时报异常
 reader.IsDBNull()?"Null":reader.GetInt32()//先判断是否为空
 
 
 dataGridView