ExecuteScalar()方法
执行查询语句并返回结果集中第一行的第一列的值,因为不能确定返回值的类型,所以返回值是object类型,一般用于返回自动编号或聚合函数中
//1 创建连接字符串
string constr = "Data Source=.;Initial Catalog=School;Integrated Security=True";
private void btn_ExecuteScalar_Click(object sender, EventArgs e)
{
//判断文本框中是否有值
if (string.IsNullOrEmpty(txtTblName.Text.Trim()))
{
//如果没有,弹出对话框进行提醒
MessageBox.Show("请输入表名");
//将文本框设置为焦点
txtTblName.Focus();
}
else
{
using (SqlConnection con = new SqlConnection(constr))
{
//使用聚合函数,查询当前表中共有多少条数据
string sqlstr = string.Format("SELECT COUNT(*) FROM {0}", txtTblName.Text);
//获取刚刚插入数据的自动编号
//string sqlstr = "INSERT INTO dbo.Class(CName,CDesc,CIsDel )OUTPUT Inserted.CId VALUES('明','明朝',0)";
using (SqlCommand com = new SqlCommand(sqlstr, con))
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
//执行 ExecuteScalar()方法
//有数据大于0,没有数据等于0
int r = Convert.ToInt32(com.ExecuteScalar());
rtxt.Text = txtTblName.Text + " 表中共有 " + r + " 条数据";
}
}
}
}
ExecuteReader()方法(返回一个结果集)
执行过程:当执行ExecuteReader()方法时,查询到的数据暂存在数据库的内存中,返回一个SqlDataReader的对象reader
通过对象reader的HasRows属性判断执行的SQL语句是否查询出了数据,如果有数据就需要通过一个while循环执行去数据库中一条一条的取回来,每取回一条数据,数据库内存就会释放一条数据(释放占用的内存,内部优化)直至取完
如果其属性HasRows的值为false,就不会再执行循环去取数据
private void btn_ExecuteReader_Click(object sender, EventArgs e)
{
//判断文本框中是否有值
if (string.IsNullOrEmpty(txtTblName.Text.Trim()))
{
//如果没有,弹出对话框进行提醒
MessageBox.Show("请输入表名");
//将文本框设置为焦点
txtTblName.Focus();
}
else
{
using (SqlConnection con = new SqlConnection(constr))
{
//查询出当前表中所有数据
string sqlstr = string.Format("SELECT * FROM {0}", txtTblName.Text);
using (SqlCommand com = new SqlCommand(sqlstr, con))
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
//用于接收取出来的数据
StringBuilder sb = null;
//执行 ExecuteScalar()方法
using (SqlDataReader reader = com.ExecuteReader())
{
//判断是否查询出了数据
if (reader.HasRows)
{
sb = new StringBuilder();
sb.AppendLine("编号\t名称\t别名\t是否删除");
//判断查询出的结果集中是否还有
//没有从结果集中取回来的数据
while (reader.Read())
{
#region 弱类型,通过下标获取列的数据
//object obj1 = reader.GetValue(0);
//object obj2 = reader.GetValue(1);
//object obj3 = reader.GetValue(2);
//object obj4 = reader.GetValue(3);
#endregion
#region 弱类型,通过下标获取列的数据
//object obj1 = reader[0];
//object obj2 = reader[1];
//object obj3 = reader[2];
//object obj4 = reader[3];
#endregion
#region 弱类型,通过列名获取列的数据
//没有通过下标的效率高
//列名:一定要与查询结果的列名一致
//如:SELECT CId AS '编号' 带有别名的
//列名就需要填写为别名 reader["编号"];
//object obj1 = reader["CId"];
//object obj2 = reader["CName"];
//object obj3 = reader["CDesc"];
//object obj4 = reader["CIsDel"];
#endregion
#region 强类型,调用其对应类型的方法(对应下标)
int obj1 = reader.GetInt32(0);
string obj2 = reader.GetString(1);
string obj3 = reader.GetString(2);
bool obj4 = reader.GetBoolean(3);
#endregion
sb.AppendLine(obj1 + "\t" + obj2 + "\t" + obj3 + "\t" + obj4);
}
}
else
{
MessageBox.Show("在当前表中没有查询到数据");
}
}
//将数据显示在富文本框控件中
rtxt.Text = sb.ToString();
}
}
}
}
通过反编译工具查看:ExecuteScalar()方法的底层实现也是调用ExecuteReader()实现的