四时宝库

程序员的知识宝库

SQL - 通过ExecuteScalar()与ExecuteReader()方法查询数据 166

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()实现的

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接