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");
以上便是我总结得一点东西,如果有不对的地方请帮忙指出,相互进步,谢谢。