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地址对应的主机上的数据库服务才行; //通过数据库服务操作数据库文件; //如果本机上的数据库服务被停止了,就不能访问本机的数据库了。 string sql = "INSERT INTO Teacher VALUES ( N'赵灵' , 1 , 18 , GETDATE() ,N'中国台湾省' , N'[email protected]' , 15555 )"; //创建一个执行sql语句的对象 参数为要执行的sql语句和数据库连接对象(command对象要在哪个连接上执行) 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)) { string sql = "INSERT INTO Teacher output inserted.TeaID values('途虎',1,40,getDate(),'上海','[email protected]',50000)"; using (SqlCommand comm = new SqlCommand(sql, conn)) { 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 string sql = "INSERT INTO Teacher values('途虎养车',1,40,getDate(),'上海','[email protected]',50000)"; 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 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); } } }