ADO.NET复习总结(4)--访问SqlServer的类
1、连接SqlConnection
2、
3、执行命令SqlCommand
4、数据读取SqlDataReader
注意:
ExecuteNonQuery() :执行非查询(增删改)
ExecuteScalar(): 执行查询,获取单个值,返回单行单列
ExecuteReader() :执行查询,获取多个值,返回多行多列
示例代码:
1.插入语句测试 ExecuteNonQuery() 方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //1.连接字符串 string constr = "Data Source=.;Initial Catalog=dbtest;User Id=sa;Password=123;"; //2.创建连接对象 using(SqlConnection conn=new SqlConnection (constr)) { //3.SQL 语句 string sql = "insert into test2 values('战狼') "; //4.创建SQLcommand对象 using(SqlCommand cmd=new SqlCommand (sql,con)) { //5.打开连接 conn.Open(); //6.执行 int r = cmd.ExecuteNonQuery(); Console.WriteLine("成功的插入了{0}行。", r); } } Console.ReadKey(); } } }
2.查询,获取多个值 ExecuteReader()方法,返回类型datareader
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace _02 { class Program { static void Main(string[] args) { //1.连接字符串 string constr = "Data Source=.;Initial Catalog=dbtest;User Id=sa;Password=123;"; //2.创建连接对象 using (SqlConnection conn = new SqlConnection(constr)) { //3.SQL 语句 string sql = "select * from StudentInfo"; //4.创建SQLcommand对象 using (SqlCommand cmd = new SqlCommand(sql, conn)) { //5.打开连接 conn.Open(); //6.执行 //通过调用ExecuteReader()方法,将给定的sql语句在服务器中执行。 //执行完毕后,服务器就已经查询出了数据。但是数据是保存在数据库服务器的内存当中。 //并没有返回给应用程序。知识返回给了应用程序一个reader对象,这个对象就是用来获取数据的对象。 using ( SqlDataReader reader = cmd.ExecuteReader()) { //接下来就要通过reader对象一条一条获取数据 //1、在获取数据之前,先判断一下本次执行查询之后,是否查询到了数据 if (reader.HasRows)//属性HasRows判断是否结果集中有行 { //2.有数据,那么接下来就要一条一条获取数据‘ //每次获取数据之前,都要先调用reader.Read()方法,向后移动一条数据,如果成功移到了某条数据上,则返回true,否则为FALSE while(reader.Read()) { //获取当前reader指向的数据(一行多列) //reader.FieldCount,可以查询当前查询语句查询出列的个数。 for (int i = 0; i < reader.FieldCount; i++) { Console.Write(reader[i] + " | "); } Console.WriteLine(); } } else { Console.WriteLine("没有任何数据"); } } } } Console.ReadKey(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace _02 { class Program { static void Main(string[] args) { //1.连接字符串 string constr = "Data Source=.;Initial Catalog=dbtest;User Id=sa;Password=123;"; //2.创建连接对象 using (SqlConnection conn = new SqlConnection(constr)) { //3.SQL 语句 string sql = "select * from StudentInfo"; //4.创建SQLcommand对象 using (SqlCommand cmd = new SqlCommand(sql, conn)) { //5.打开连接 conn.Open(); //6.执行 //通过调用ExecuteReader()方法,将给定的sql语句在服务器中执行。 //执行完毕后,服务器就已经查询出了数据。但是数据是保存在数据库服务器的内存当中。 //并没有返回给应用程序。知识返回给了应用程序一个reader对象,这个对象就是用来获取数据的对象。 using ( SqlDataReader reader = cmd.ExecuteReader()) { //接下来就要通过reader对象一条一条获取数据 //1、在获取数据之前,先判断一下本次执行查询之后,是否查询到了数据 if (reader.HasRows)//属性HasRows判断是否结果集中有行 { //2.有数据,那么接下来就要一条一条获取数据‘ //每次获取数据之前,都要先调用reader.Read()方法,向后移动一条数据,如果成功移到了某条数据上,则返回true,否则为FALSE while(reader.Read()) { //获取当前reader指向的数据(一行多列) //reader.FieldCount,可以查询当前查询语句查询出列的个数。 for (int i = 0; i < reader.FieldCount; i++) { //但是通过reader【】索引器,可以使用列名获取列的值 // Console.Write(reader[i] + " | "); Console.Write(reader["sid"] ); //根据列名称获取列的索引 //reader.Getordinal(); //GetValue()只能通过列索引来获取列的值 Console.Write(reader.GetValue(i) + " | "); } Console.WriteLine(); } } else { Console.WriteLine("没有任何数据"); } } } } Console.ReadKey(); } } }
注意:
当遇到数据库中的null值的时候,通过Reader.GetValue()或者reader()索引器来获取列的值,
拿到的是DBNull.Value,不是C#的Null,而DBNull.Value的ToString()方法返回的空字符串,所以最终没有报错。
//大多数用下面这种方法 //通过下面这种方式读取到的数据直接就是对应的类型,不是object类型,使用起来更方便。 reader.Getxxxxx()//使用强类型读取列中的数据
2、SqlDataReader
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace _02 { class Program { static void Main(string[] args) { #region 版本1 ////1.连接字符串 //string constr = "Data Source=.;Initial Catalog=dbtest;User Id=sa;Password=123;"; ////2.创建连接对象 //using (SqlConnection conn = new SqlConnection(constr)) //{ // //3.SQL 语句 // string sql = "select * from StudentInfo"; // //4.创建SQLcommand对象 // using (SqlCommand cmd = new SqlCommand(sql, conn)) // { // //5.打开连接 // conn.Open(); // //6.执行 // //通过调用ExecuteReader()方法,将给定的sql语句在服务器中执行。 // //执行完毕后,服务器就已经查询出了数据。但是数据是保存在数据库服务器的内存当中。 // //并没有返回给应用程序。知识返回给了应用程序一个reader对象,这个对象就是用来获取数据的对象。 // using (SqlDataReader reader = cmd.ExecuteReader()) // { // //接下来就要通过reader对象一条一条获取数据 // //1、在获取数据之前,先判断一下本次执行查询之后,是否查询到了数据 // if (reader.HasRows)//属性HasRows判断是否结果集中有行 // { // //2.有数据,那么接下来就要一条一条获取数据‘ // //每次获取数据之前,都要先调用reader.Read()方法,向后移动一条数据,如果成功移到了某条数据上,则返回true,否则为FALSE // while (reader.Read()) // { // //获取当前reader指向的数据(一行多列) // //reader.FieldCount,可以查询当前查询语句查询出列的个数。 // for (int i = 0; i < reader.FieldCount; i++) // { // //但是通过reader【】索引器,可以使用列名获取列的值 // // Console.Write(reader[i] + " | "); // Console.Write(reader["sid"]); // //根据列名称获取列的索引 // //reader.Getordinal(); // //GetValue()只能通过列索引来获取列的值 // // Console.Write(reader.GetValue(i) + " | "); // //大多数用下面这种方法 // //通过下面这种方式读取到的数据直接就是对应的类型,不是object类型,使用起来更方便。 // // reader.Getxxxxx()//使用强类型读取列中的数据 // } // Console.WriteLine(); // } // } // else // { // Console.WriteLine("没有任何数据"); // } // } // } //} #endregion #region 版本2 string constr = "Data Source=.;Initial Catalog=dbtest;User Id=sa;Password=123;"; using (SqlConnection conn = new SqlConnection(constr)) { string sql = "select * from StudentInfo"; using (SqlCommand cmd = new SqlCommand(sql, conn)) { conn.Open(); using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.HasRows) { //注意通过reader.GetXxxx()方式来获取表中的数据,如果数据为null,那么久报异常了,此时需要手动写代码来判断数据是否为null while (reader.Read()) { //sId, sName, sGender, sBirthday, sPhone, sEMail, cid //打印每一列的值 Console.Write(reader.GetInt32(0) + "\t||\t"); Console.Write(reader.GetString(1) + "\t||\t"); Console.Write(reader.GetBoolean(2) + "\t||\t"); Console.Write(reader.GetDateTime(3) + "\t||\t"); Console.Write(reader.IsDBNull(4)?"NULL":reader.GetString(4)+ "\t||\t"); //Console.Write(reader.GetString(4) + "\t||\t"); Console.Write(reader.GetString(5) + "\t||\t"); Console.Write(reader.GetSqlInt32(6) + "\t||\t"); } } } } #endregion Console.ReadKey(); } } } }