SqlDataReader使用

1、执行有多行结果集的用ExecuteReader().
2、HasRow属性返回是否有行
3、
       SqlDataReader reader = cmd.ExecuteReader();...
       while (reader.Read())
      {      Console.WriteLine(reader.GetString(1));
       }
 
    reader的GetValue方法返回object类型的数据,如果想获取强类型的数据,可以使用reader的GetString、GetInt32等方法。
4、reader的GetString、GetInt32等方法只接受整数参数,也就是序号,用GetOrdinal方法根据列名动态得到序号;
    使用GetString、GetInt32等方法,当被索引的列允许为NULL时,需要使用reader的IsDBNull(index)方法判断是否为空,否则会抛出异常,
    reader的GetValue方法不会抛出异常,当被索引的列值为NULL时,返回空字符串。
5、更简单的方法reader[‘uUserName’]
6、为什么用using。Close:关闭以后还能打开。Dispose:直接销毁,不能再次使用。
   using在出了作用域以后调用Dispose,SqlConnection、 SqlDataReader等的Dispose内部都会做这样的判断:判断有没有close,
   如果没有Close就先Close再Dispose。
7、DataReader 须独享一个Connection (除非设置了允许MARS,多活动结果集,在连接字符串中)
 

                          SqlDataReader使用注意事项

l返回reader后数据在哪里?
          •数据库服务器缓存
l当使用DataReader的时候必须保证Connection为Open状态。
lreader只读(不能通过reader修改数据。)、只进
           •reader每次读取一条就释放一条所以只能向前不能后退
           •由于功能有限,所以读取速度很快,适合从数据库中读取大量数据
l使用reader根据列索引读取列数据而不是列名
l使用强类型的GetString()、GetInt32、GetFloat()、GetDouble()….
l数据库中的类型与C#的不太一样,数据库中的float,得用c#的GetDouble()来获取。
lIsDbNull()
using (SqlConnection con = new SqlConnection(constr))
            {
                string sql = "select * from TblClass";
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    con.Open();
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                //object obj1 = reader.GetValue(0);
                                //object obj2 = reader.GetValue(1);
                                //object obj3 = reader.GetValue(2);
                                int obj1 = reader.GetInt32(0);
                                string obj2 = reader.GetString(1);

                                //当当前列如果为null的话,调用强类型的获取数据的方法就报错了。,就需要获取数据之前做一个判断;通过reader.IsDBNull(index)来验证
                                string obj3 = reader.IsDBNull(2) ? "空" : reader.GetString(2);
                                Console.WriteLine("{0}-{1}-{2}", obj1, obj2, obj3);
                            }
                        }

  

如果返回多个结果集则用NextResult()方法。通过do-while循环测试。

 1   using (SqlConnection con = new SqlConnection(constr))
 2             {
 3                 string sql = "select * from Employees;select * from TblClass";
 4                 using (SqlCommand cmd = new SqlCommand(sql, con))
 5                 {
 6                     con.Open();
 7                     using (SqlDataReader reader = cmd.ExecuteReader())
 8                     {
 9                         #region 读取一个结果集
10                         //if (reader.HasRows)
11                         //{
12                         //    while (reader.Read())
13                         //    {
14                         //        //循环列
15                         //        for (int i = 0; i < reader.FieldCount; i++)
16                         //        {
17                         //            Console.Write(reader.GetValue(i));
18                         //        }
19                         //        Console.WriteLine();
20                         //    }
21 
22                         //}
23                         #endregion
24 
25 
26                         do
27                         {
28                             if (reader.HasRows)
29                             {
30                                 while (reader.Read())
31                                 {
32                                     //循环列
33                                     for (int i = 0; i < reader.FieldCount; i++)
34                                     {
35 
36                                         //根据索引,获取列名
37                                         //reader.GetName(i);
38                                         //获取当前列的数据类型
39                                         string dbType = reader.GetDataTypeName(i);
40                                         switch (dbType)
41                                         {
42                                             case "varchar":
43                                             case "nvarchar":
44                                             case "char":
45                                             case "nchar":
46                                                 Console.Write(reader.GetString(i) + "\t");
47                                                 break;
48                                             case "int":
49                                                 Console.Write(reader.GetInt32(i) + "\t");
50                                                 break;
51                                         }
52                                     }
53                                     Console.WriteLine();
54                                 }
55                             }
56                         } while (reader.NextResult()); //当多个结果集的时候可以调用NextResult
57 
58                     }
59                 }
View Code
原文地址:https://www.cnblogs.com/yaoxc/p/3137329.html