zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    datetime函数和random.seed()函数的应用
    TP5 display()
    _STORAGE_WRITE_ERROR_
    nginx下基于ThinkPHP框架的网站url重写
    Thinkphp3.2版本Controller和Action的访问方法
    Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'
    如何将word公式粘贴到TinyMCE里面
    如何将word公式粘贴到eWebEditor里面
    如何将word公式粘贴到wangEditor里面
    如何将word公式粘贴到xhEditor里面
  • 原文地址:https://www.cnblogs.com/yaoxc/p/3137329.html
Copyright © 2011-2022 走看看