WinFrom日记————ExecuteReader、ExecuteNonQuery、ExecuteScalar使用方法

WinFrom日记————ExecuteReader、ExecuteNonQuery、ExecuteScalar使用方法

在写C#的时候,获取数据库数据的时候会用到ExecuteReader、ExecuteNonQuery、ExecuteScalar等对象和方法,刚开始给自己整蒙了,不知道怎么用用哪个,程序第一部分的内容写的差不多了,写几篇博客做一些总结
数据库连接方法:https://blog.csdn.net/weixin_44546342/article/details/106303336
一、ExecuteScalar执行方法

			string Sql_Str = "update T_users set Active=@Active where Email = @Email;SELECT id from T_users where Email=@Email;";
            SqlParameter[] sq =		
            {
                new SqlParameter("@Active",Active),
                new SqlParameter("@Email",Email)
            };
            ReadySql(Sql_Str, sq);		//参数的存储和sql语句存储,这是我自己封装的方法,不必太在意
            object Result = sql_com.ExecuteScalar();
            if(Result != null)
            {
                MessageBox.Show("Update successful!");
            }
            else
            {
                MessageBox.Show("Something wrong!");
            }
            sql_con.Close();
            return;

ExecuteScalar()执行后,返回的是一个object类的数据,这个类型是所有类型的基类,可以进行任意的转换,强制转换就可以。
ExecuteScalar()执行后返回的数据库第一条的第一列数据,就只返回一个数据,所以他适用于查询总数,查询单个id之类的情况下,查询结果如图;
在这里插入图片描述
二、ExecuteNonQuery执行方法

			Sql_Str = "insert into T_Office (User_id,Office) values(@User_id,@Office)";
            SqlParameter[] sql =
            {
                new SqlParameter("@Office",Office),
                new SqlParameter("@User_id",User_id)
            };
            sql_com = new SqlCommand(Sql_Str, sql_con);
            sql_com.Parameters.AddRange(sql);
            int Result = sql_com.ExecuteNonQuery();		//执行后返回的是一个整数
            if (Result>0)
            {
                MessageBox.Show("Add successful!");
            }
            else
            {
                MessageBox.Show("Something wrong!");
            }
            sql_con.Close();	//数据库连接关闭
            //sql_con.Dispose();		

ExecuteNonQuery()方法执行后返回的是一个整数,即返回受Sql语句所影响的数据条数,这个执行方法可以用于数据插入、修改的时候,用来判断Sql语句是否成功执行
另插一句,我之前写的时候为了判断语句是否成功是在Sql语句后面加上SELECT @@Identity;
像这样insert into T_Office (User_id,Office) values(@User_id,@Office);SELECT @@Identity;
即返回第几条数据受影响吧好像,然后用ExecuteScalar()执行的,这个方法我觉得不太好,还是ExecuteNonQuery()比较好用,就这么提一下,不要太在意
三、ExecuteReader()执行方法

			List<LoginList> result_list = new List<LoginList>();		//泛型集合list<>,我也是一知半解,照着用
            ReadySql(Sql_Str, sq);	//参数的存储和sql语句存储,这是我自己封装的方法,不必太在意
            SqlDataReader Return_result = sql_com.ExecuteReader();
            if (Return_result.HasRows)	//使用HasRows方法判断是否有值返回
            {
                while (Return_result.Read())	//通过循环一条一条的读数据,
                {
                    LoginList data = new LoginList();
                    data.User_Id = (int)Return_result["id"];
                    data.User_Name = Return_result["First_name"].ToString() + " " + Return_result["Last_name"].ToString();
                    data.Role = Return_result["Role"].ToString();
                    result_list.Add(data);
                }
            }
            sql_con.Close();

泛型集合list<>

	class LoginList
    {
        public int User_Id;
        public string User_Name;
        public string Role;
    }

ExecuteReader()执行方法返回的类型是SqlDateReader,通过流得方式对查询结果进行连接后访问,只读,适合数据量比较小的情况下,只能一条一条的读数据,感觉有点类似指针。
适用于select查询的情况,通过循环一条一条的读取存入list内就行

以下部分摘抄自网络:https://blog.csdn.net/yhj198927/article/details/72844155
SqlDataReader与SqlDataAdapter+DataSet的区别
一,SqlDataReader //基于连接,只读访问 适合数据量较小。(连接模式)
SqlDataAdapter //基于非连接,适于数据量较大时,可以另行修改,最后再把修改结果返回给数据库。要求资源也大一点 (断开模式)

二,SqlDataAdapter 读取数据后将数据集放入DataSet ,DataSet 的数据存在本地客服机内存。

三,SqlDataReader返回的是一个数据读写器,只能一条条的读,操作起来不灵活,一般在只读的时候才用到。
SqlDataAdapter返回的是数据集或者表,可以对其中的数据作任意操作

四,写法上不同:

SqlDatReader执行前须先打开数据库,然后须生成一个command对象。再由command.ExecuteReader()方法赋值。完成后须手动关闭联接。

 		SqlCommand cmd = new SqlCommand("select * from stu", conn);
        conn.Open();
        SqlDataReader rdr = cmd.ExecuteReader();
        //。。。。。
        conn.close();

SqlDataAdapter 执行时,自动打数据库,且不用Command的ExecuteReader方法进行赋值,完成后自动断开联接。

 	SqlDataAdapter adptr = new SqlDataAdapter(sql, conn);
    DataSet ds = new DataSet();
    adptr.Fill(ds, "stu");

以上便是我总结得一点东西,如果有不对的地方请帮忙指出,相互进步,谢谢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章