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 }