当需要从数据库中同时读取多个结果集时,比如执行如下的sql语句:

select * from tblClass;select * from tblStudent;

同时从两个表格中获取结果,会获取两个结果集,此时需要使用SqlDataReader对象的NextResult()方法跳转到下一个结果集。


一、主函数

运行环境是控制台应用程序,下面的方法是main方法。

main方法流程主要如下:

1、定义了连接数据库的字符串

2、定义了同时查询两个表的sql语句的sql命令

3、定义了一个列表,用以存储读取到的数据

4、定义了一个方法,将读取到的每一个单元格的数据添加到列表中

5、定义了一个方法,当读取到每一行数据结尾时添加一个换行符到列表中

6、执行读取数据的方法

7、遍历列表,将列表的数据显示到控制台上

/// <summary>
        /// 当同时查询多个表格,返回多个表格的数据时。
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //连接数据库语句
            string conStr = "server=.;database=Itcast2014;integrated security=true;";
            //当数据库查询语句有两条时,会返回两个结果集
            string cmdTxt = "select * from tblClass;select * from tblStudent;";
            //通过将数据增加到列表中的的方式读取数据
            List<object> lstResult = new List<object>();
            //将每一个单元格的数据后面加个制表符后添加到列表中
            Action<object> ReadCell = cell => { lstResult.Add(cell+"\t"); };
            //在每一行的结尾,将一个换行符增加到列表中
            Action RowEnd = () => { lstResult.Add("\r\n"); };
            //读取结果
            ReadAllResult(conStr,cmdTxt,ReadCell,RowEnd);
            //遍历结果集的列表
            foreach (var item in lstResult)
            {
                Console.Write(item);
            }
            Console.ReadKey();
        }

二、读取数据

这是读取数据的主要方法,和主函数在同一个命名空间下。 

ReadAllResult方法流程如下:

1、通过传入的连接数据库字符串连接数据库

2、通过传入的sql命令执行ExecuteReader方法

3、读取当前结果集的每一行数据

4、通过NextResult方法转到下一个结果集

/// <summary>
        /// 读取多个结果集的Sql语句的方法
        /// </summary>
        /// <param name="conStr">连接字符串</param>
        /// <param name="cmdTxt">sql命令</param>
        /// <param name="ReadResult">传入一个方法,指定如何处理每一行每一个单元格的数据</param>
        /// <param name="RowEnd">传入一个方法,指定到每一行结尾时,如何处理</param>
        private static void ReadAllResult(string conStr,string cmdTxt,Action<object> ReadResult,Action RowEnd)
        {
            using (SqlConnection con = new SqlConnection(conStr))
            {
                using (SqlCommand cmd = new SqlCommand(cmdTxt, con))
                {
                    con.Open();
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        //循环直到读取的结果集中没有行时
                        while (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                //对读取的当前行中遍历所有的列
                                for (int i = 0; i < reader.FieldCount; i++)
                                {
                                    //传入一个如何处理每一行每一个单元格数据的方法
                                    ReadResult(reader[i]);
                                }
                                //传入一个如何处理每一行结尾的方法
                                RowEnd();
                            }
                            //********要在这里读取下一个结果集***********
                            reader.NextResult();
                        }
                    }
                    con.Close();
                }
            }
        }

三、总结

这里主要是数据库的常用方法,以及使用了委托,来确定如何处理每一个数据,也可以直接Console.Write()。