ADO.NET五大对象增删改查使用
string ConnStr = "Data Source=.;Initial Catalog=ADO_DEMO;Integrated Security=True"; #region SqlConnection使用 //第一步:新建SqlConnection对象 SqlConnection SqlConn = new SqlConnection(); //设置SqlConnection对象的连接字符串; SqlConn.ConnectionString = ConnStr; //如果用DataSet或者DataTable,可以不用打开数据库,否则必须打开数据库 SqlConn.Open(); #endregion #region SqlCommand对象的增、删、改操作 //新建SqlCommand对象 SqlCommand cmd = new SqlCommand(); //设置SqlCommand对象的Connection属性,即:SqlConn(SqlConnection类型的对象) cmd.Connection = SqlConn; //如果是执行INSERT/UPDATE/DELETE的SQL语句,可以直接设置CommandText属性 //如果是执行存储过程,则必须设置CommandType属性为CommandType.StoredProcedure cmd.CommandText = "INSERT INTO Ex_Class VALUES('1707A',19)"; //设置完Connection属性及CommandText属性后可以直接执行SQL语句 //cmd.ExecuteNonQuery(); //执行完成后要关闭数据库,并且释放资源 SqlConn.Close(); SqlConn.Dispose(); #endregion #region 利用SqlCommand对象和SqlDataReader对象获取数据(记录集) //判断如果连接没有打开,是关闭状态,就打开数据库 if(SqlConn.State == ConnectionState.Closed) { SqlConn.ConnectionString = ConnStr; SqlConn.Open(); } //新建SqlCommand对象 SqlCommand cmd_select = new SqlCommand(); //设置SqlCommand对象的Connection属性,即:SqlConn(SqlConnection类型的对象) cmd_select.Connection = SqlConn; //如果是执行INSERT/UPDATE/DELETE的SQL语句,可以直接设置CommandText属性 //如果是执行存储过程,则必须设置CommandType属性为CommandType.StoredProcedure cmd_select.CommandText = "SELECT * FROM Ex_Class"; //调用ExecuteReader方法并用SqlDataReader对象接收返回的记录; SqlDataReader sdr = cmd_select.ExecuteReader(); //如果SqlDataReader返回的只有一条记录,可以用下面的方法来获取; if(sdr.Read()) { string ClassName = sdr["ClassName"].ToString(); int ClassCount = Convert.ToInt32(sdr["ClassCount"]); Response.Write(string.Format("SqlDataReader返回一条记录:ClassName:{0} ClassCount:{1}<br><br>", ClassName, ClassCount)); } //如果SqlDataReader返回的是多条记录,可以用下面的方法来获取记录,并存储集合 List<Model> DataList = new List<Model>(); while(sdr.Read()) { Model m = new Model(); m.ClassName = sdr["ClassName"].ToString(); m.ClassCount = Convert.ToInt32(sdr["ClassCount"]); DataList.Add(m); } //然后可以使用集合中的数据,比如: foreach(var p in DataList) { Response.Write(string.Format("SqlDataReader返回多条记录:ClassName:{0} ClassCount:{1}<br><br>", p.ClassName, p.ClassCount)); } //注意SqlDataReader使用完后要关闭和释放资料 sdr.Close(); sdr.Dispose(); SqlConn.Close(); SqlConn.Dispose(); #endregion #region 利用DataTable对象获取数据(记录集) /*注意:如果DataTable获取记录,不用打开数据库,即Open()*/ SqlConn.ConnectionString = ConnStr; //新建SqlCommand对象 SqlCommand cmd_datatable = new SqlCommand(); //设置SqlCommand对象的Connection属性,即:SqlConn(SqlConnection类型的对象) cmd_datatable.Connection = SqlConn; //如果是执行INSERT/UPDATE/DELETE的SQL语句,可以直接设置CommandText属性 //如果是执行存储过程,则必须设置CommandType属性为CommandType.StoredProcedure cmd_datatable.CommandText = "SELECT * FROM Ex_Class"; //新建一个SqlDataAdapter对象,用来向DataTable填充数据 SqlDataAdapter sda = new SqlDataAdapter(); //设置SqlDataAdapter对象对应的SqlCommand对象 sda.SelectCommand = cmd_datatable; //新建一个DataTable对象,用来接收SqlDataAdapter对象传递过来的数据 DataTable dt = new DataTable(); //调用SqlDataAdapter对象的Fill方法,将数据填充到DataTable sda.Fill(dt); //接下来可以使用DataTable中的数据,比如获取第一行的值: string MyClassName = Convert.ToString(dt.Rows[0]["ClassName"]); int MyClassCount = Convert.ToInt32(dt.Rows[0]["ClassCount"]); Response.Write(string.Format("DataTable返回一条记录:ClassName:{0} ClassCount:{1}<br><br>", MyClassName, MyClassCount)); //也可以使用foreach遍历DataTable中的数据 List<Model> DList = new List<Model>(); foreach(DataRow dr in dt.Rows) { Model Obj = new Model(); Obj.ClassName = Convert.ToString(dr["ClassName"]); Obj.ClassCount = Convert.ToInt32(dr["ClassCount"]); DList.Add(Obj); //或者直接输出值 Response.Write(string.Format("DataTable返回多条记录:ClassName:{0} ClassCount:{1}<br><br>", dr["ClassName"], dr["ClassCount"])); } //如果用DataTable返回一个List类型,除了上面手工转换,还可以使用下面的方法 //注意:需要引入using Newtonsoft.Json命名空间 //第一步:将DataTable中的数据库序列化为一个字符串 var json = JsonConvert.SerializeObject(dt); List<Model> NewList = new List<Model>(); //第二步:将序列化的字符串反序列化为一个List对象 NewList = JsonConvert.DeserializeObject<List<Model>>(json); #endregion #region 利用SqlCommand调用存储过程 if (SqlConn.State == ConnectionState.Closed) { SqlConn.ConnectionString = ConnStr; SqlConn.Open(); } //新建SqlCommand对象 SqlCommand cmd_proc = new SqlCommand(); //设置SqlCommand对象的Connection属性,即:SqlConn(SqlConnection类型的对象) cmd_proc.Connection = SqlConn; //如果SqlCommand对象执行的是存储过程,则必需设置SqlCommand对象的CommandType为CommandType.StoredProcedure cmd_proc.CommandType = CommandType.StoredProcedure; //设置SqlCommand对象调用的存储过程名称 cmd_proc.CommandText = "PROC_Ex_Class"; //设置存储过程需要的参数 //如果是输入参数需要直接赋值,如果是输出参数或者返回值,则只需要设置参数的Direction属性 SqlParameter sql_parm1 = new SqlParameter("@ClassName", SqlDbType.NVarChar, 50); //设置输入参数的值 sql_parm1.Value = "1909B"; //将参数添加进SqlCommand对象的Parameters集合 cmd_proc.Parameters.Add(sql_parm1); //第2个参数 SqlParameter sql_parm2 = new SqlParameter("@ClassCount", SqlDbType.NVarChar, 50); //设置输入参数的值 sql_parm2.Value = 10; //将参数添加进SqlCommand对象的Parameters集合 cmd_proc.Parameters.Add(sql_parm2); //第3个参数:设置输出参数的Direction属性,无需设置值 SqlParameter sql_parm3 = new SqlParameter("@Info", SqlDbType.NVarChar, 100); sql_parm3.Direction = ParameterDirection.Output; cmd_proc.Parameters.Add(sql_parm3); //第4个参数:设置存储过程返回值的Direction属性,无需设置值 SqlParameter sql_parm4 = new SqlParameter("@ReturnVal", SqlDbType.NVarChar, 100); sql_parm4.Direction = ParameterDirection.ReturnValue; cmd_proc.Parameters.Add(sql_parm4); //调用SqlCommand对象的ExecuteNonQuery方法,执行存储过程 cmd_proc.ExecuteNonQuery(); //存储过程执行完成后,输出参数和返回值参数自动会被赋值 //这是存储过程的输出参数 string info = Convert.ToString(sql_parm3.Value); //这是存储过程的返回值 int returnval = Convert.ToInt32(sql_parm4.Value); //我们可以把两个结果输出 Response.Write(string.Format("存储过程执行结果:输出参数:{0},返回值:{1}", info, returnval)); #endregion