Command對象
作用:向數據庫發送SQL語句
封裝連接對象和執行的SQL語句
對數據庫執行具體的操作,提供增、刪、改、查的方法
屬性
CommandText 需要封裝的SQL語句或存儲過程名稱
Connection Command對象使用的數據庫連接對象
方法
ExecuteNonQuery() 執行增、刪、改操作
ExecuteScalar() 返回單一結果的查詢 只能返回數據集的第一行第一列 常常用來執行聚合函數
ExecuteReader() 返回只讀數據列表的查詢
ExecuteNonQuery() 方法使用要點
執行insert update delete類型的語句
執行返回受影響的行數、一般是大於0的整數,0說明沒有影響 ,-1表示執行出錯
執行增、刪、改步驟總結
1 創建Connection對象
2 組合sql語句insert update delete
3 創建Command對象 並封裝Connection和sql語句
4 打開連接
5 執行ExecuteNonQuery()方法,返回受影響的行數
6 關閉連接
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PracticeFive { class Program { string connString = "server=DESKTOP-BQDF638;database=test_four;uid=sa;pwd=123456"; SqlConnection conn = null; public void OpenDB() { conn = new SqlConnection(connString); if(conn.State==ConnectionState.Closed) { conn.Open(); } Console.WriteLine("數據庫已連接"); } public void CloseDB() { if(conn.State==ConnectionState.Open) { conn.Close(); } Console.WriteLine("數據庫已斷開"); } public int Insert(string sql) { SqlCommand cmd = new SqlCommand(sql, conn);//簡單寫法 //SqlCommand cmd = new SqlCommand //{ // CommandText = sql, // Connection = conn //}; //ExecuteNonQuery()執行增 刪 改 操作 int result = cmd.ExecuteNonQuery();//返回影響的行數 return result; } static void Main(string[] args) { string sql = "insert into student(id,name,age,teacherID) values(5,'小王',25,105)"; Program p = new Program(); p.OpenDB(); int insertResult = p.Insert(sql); Console.WriteLine("insertResult:{0}", insertResult); p.CloseDB(); Console.ReadKey(); } } }
讀取結果集
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PracticeFive { class Program { string connString = "server=DESKTOP-BQDF638;database=test_four;uid=sa;pwd=123456"; public void QueryAllStudents(string sql) { SqlConnection conn = new SqlConnection(connString); SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); while(reader.Read()) { Console.WriteLine("id:{0} name:{1} age:{2} teacherID:{3}", (int)reader["id"], (string)reader["name"], (int)reader["age"], (int)reader["teacherID"]); } reader.Close();//關閉讀取器 conn.Close(); } static void Main(string[] args) { string sql = "select * from student"; Program p = new Program(); p.QueryAllStudents(sql); Console.ReadKey(); } } }
讀取多個結果集 在sql server中我們可以這樣 select * from student; select * from teacher; 同時執行兩條查詢語句
在c# 中
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PracticeFive { class Program { string connString = "server=DESKTOP-BQDF638;database=test_four;uid=sa;pwd=123456"; public void QueryAllStudents(string sql) { SqlConnection conn = new SqlConnection(connString); SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); while(reader.Read()) { Console.WriteLine("id:{0} name:{1} age:{2} teacherID:{3}", (int)reader["id"], (string)reader["name"], (int)reader["age"], (int)reader["teacherID"]); } if(reader.NextResult()) { while(reader.Read()) { Console.WriteLine("id:{0} name:{1} major:{2}", reader["id"], reader["name"], reader["major"]); } } reader.Close();//關閉讀取器 conn.Close(); } static void Main(string[] args) { string sql = "select * from student;select * from teacher"; Program p = new Program(); p.QueryAllStudents(sql); Console.ReadKey(); } } }
實現一個簡單的SQL Helper類
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PracticeFive { class SQLHelper { private static string connString = "server=DESKTOP-BQDF638;database=test_four;uid=sa;pwd=123456"; public static int GetSingleQuery(string sql)//一般用於聚合函數的查詢 { SqlConnection conn = new SqlConnection(connString); SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); int result = (int)cmd.ExecuteScalar(); conn.Close(); return result; } public static int Update(string sql) { SqlConnection conn = new SqlConnection(connString); SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); int result = cmd.ExecuteNonQuery();//返回影響的行數 conn.Close(); return result; } public static SqlDataReader GetReader(string sql) { SqlConnection conn = new SqlConnection(connString); SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); //SqlDataReader reader = cmd.ExecuteReader(); //reader.Close(); //conn.Close(); //這樣寫會報閱讀器關閉時嘗試調用 Read 無效錯誤 //解決方法 SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);//關閉讀取器時自動關閉connection連接 return reader; } static void Main(string[] args) { //測試代碼 //string sql = "select * from student"; //SqlDataReader reader = GetReader(sql); //while(reader.Read()) //{ // Console.WriteLine("id:{0} name:{1} age:{2} teacherID:{3}", (int)reader["id"], reader["name"].ToString(), (int)reader["age"], (int)reader["teacherID"]); //} //reader.Close();//關閉讀取器 //string sql = "select count(*) from student"; //int result = GetSingleQuery(sql); //Console.WriteLine("result stu count:{0}", result); //string sql = "update student set name='小李' where name='小王'"; //int result = Update(sql); //Console.WriteLine("update result:{0}", result); Console.ReadKey(); } } }
將查詢到的數據以對象的形式返回
using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PracticeFive { class Test { private static string connString = "server=DESKTOP-BQDF638;database=test_four;uid=sa;pwd=123456"; public Student QueryStuByID(string sql) { SqlConnection conn = new SqlConnection(connString); SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); Student stu = null; if(reader.Read()) { stu = new Student { Id = (int)reader["id"], Name = reader["name"].ToString(), Age = (int)reader["age"], TeacherID = (int)reader["teacherID"] }; } reader.Close(); conn.Close(); return stu; } static void Main(string[] args) { //測試代碼 //string sql = "select * from student where id=3"; //Test t = new Test(); //Student stu = t.QueryStuByID(sql); //if(stu!=null) //{ // Console.WriteLine("stu name:{0}", stu.Name); //} Console.ReadKey(); } } class Student { private int id; private string name; private int age; private int teacherID; public int Id { get => id; set => id = value; } public string Name { get => name; set => name = value; } public int Age { get => age; set => age = value; } public int TeacherID { get => teacherID; set => teacherID = value; } } }
將查詢到的數據以對象集合的方式返回 和上述代碼類似
連表查詢
using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PracticeFive { class Test { private static string connString = "server=DESKTOP-BQDF638;database=test_four;uid=sa;pwd=123456"; public List<StudentTeacher> UnionQuery(string sql)//聯合查詢 { SqlConnection conn = new SqlConnection(connString); SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); List<StudentTeacher> lstStuTea = new List<StudentTeacher>(); while(reader.Read()) { StudentTeacher stuTea = new StudentTeacher(); stuTea.Stu = new Student { Name = reader["stuName"].ToString() }; stuTea.Tea = new Teacher { Name = reader["teaName"].ToString(), Major = reader["major"].ToString() }; lstStuTea.Add(stuTea); } reader.Close(); conn.Close(); return lstStuTea; } static void Main(string[] args) { //因為學生表和老師表都有name字段 計算機無法區分 所有取別名來區分 string sql = "select a.name as stuName,b.name as teaName,b.major from student a inner join teacher b on a.teacherID=b.id"; Test test = new Test(); List<StudentTeacher> lst = test.UnionQuery(sql); foreach(var item in lst) { Console.WriteLine("student name:{0} teacher name:{1} teacher major:{2}", item.Stu.Name, item.Tea.Name, item.Tea.Major); } Console.ReadKey(); } } class Student { private int id; private string name; private int age; private int teacherID; public int Id { get => id; set => id = value; } public string Name { get => name; set => name = value; } public int Age { get => age; set => age = value; } public int TeacherID { get => teacherID; set => teacherID = value; } } class Teacher { private int id; private string name; private string major; public int Id { get => id; set => id = value; } public string Name { get => name; set => name = value; } public string Major { get => major; set => major = value; } } class StudentTeacher//聯合查詢時使用 { private Student stu; private Teacher tea; internal Student Stu { get => stu; set => stu = value; } internal Teacher Tea { get => tea; set => tea = value; } } }
