本文主要讲述如何使用SqlDataReader方法来读取数据,来完成数据库增删改查中查的工作,这是C#读取数据库的主要方法。
一、环境介绍
- Visual Studio 2015
- SQL Server 2012
- 控制台应用程序
- 使用的数据库名称是Itcast2014
- 使用的表名称是TblPerson
- 表的字段如下图:
二、代码
注意事项:
1、代码中读取的方法是较常用的方法,除了该方法,还有其他方法,在最后介绍。
2、SqlDataReader读取数据时只读、只进,即只能读取数据,不能修改数据,并且读取数据时只能一条一条数据向后读取,不能向前读,也不能跳跃读。
3、使用SqlDataReader时必须保证连接是打开状态,使用完后要尽快关闭。
4、SqlDataReader要求独占一个连接。
/// <summary>
/// 使用SqlDataReader方式来读取数据
/// </summary>
private static void DataReader()
{
string conStr = "server=.;database=Itcast2014;integrated security=true;";
using (SqlConnection con = new SqlConnection(conStr))
{
string cmdTxt = "select * from TblPerson";
using (SqlCommand cmd = new SqlCommand(cmdTxt, con))
{
con.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
//首先判断是否有数据
if (reader.HasRows)
{
//开始读取数据,读取的方式是一行一行读,每执行一次Read(),读取一行
while (reader.Read())
{
//大部分情况下,是用reader.GetXXXXX()的方法来获取数据,也可以用其他方法
//这里的int?和bool?是确保使用?:这种三元表达式时,null的类型和后面的类型可以一致
//通过reader.GetXXXXX()方法获得数据时,如果遇到null值,将报错,需要提前判断值是否为null
Console.Write((reader.IsDBNull(0) ? null : (int?)reader.GetInt32(0)) + "\t|\t");
Console.Write((reader.IsDBNull(1) ? null : reader.GetString(1)) + "\t|\t");
Console.Write((reader.IsDBNull(2) ? null : (int?)reader.GetInt32(2)) + "\t|\t");
Console.Write((reader.IsDBNull(3) ? null : (int?)reader.GetInt32(3)) + "\t|\t");
Console.Write((reader.IsDBNull(4) ? null : (bool?)reader.GetBoolean(4)) + "\t|\t");
Console.WriteLine();
}
}
}
con.Close();
}
}
}
三、其他方法
(一)第一种方法通过reader的FieldCount属性可以获得读取到的数据有多少列,然后通过遍历每一列,用reader索引器加数字下标的方式,来获得数据。这种方法中reader[i]获得的数据是object类型,可能需要做数据转换。
//使用FieldCount字段来遍历读取到的每一列,通过reader索引器下标的方式来获得数据
for (int i = 0; i < reader.FieldCount; i++)
{
Console.Write(reader[i]+"\t|\t");
}
Console.WriteLine();
(二)第二种方法和第一种方法类似,不同的是获取数据的时候使用的是reader的GetValue(i)方法。事实上这两种方法实现的机制是相同的,唯一不同的是reader[]还可以使用列名来获得数据。
//使用FieldCount字段来遍历读取到的每一列,通过reader的GetValue(i)的方式来获得数据
//GetValue的方法和reader[i]的方法是相同的,唯一不同的是reader还可以通过列名的方式获取数据
for (int i = 0; i < reader.FieldCount; i++)
{
Console.Write(reader.GetValue(i) + "\t|\t");
}
Console.WriteLine();
(三)通过索引器加列名的方式获取数据,不过这种方式在内部实现机制上,就是通过一个reader.GetOrdinal(列名)来获得列名对应的id的方式,最后通过索引器加下标获得数据的。
//通过reader索引器加列名的方式获得数据
Console.Write(reader["autoId"]+"\t|\t");
Console.Write(reader["uName"] + "\t|\t");
Console.Write(reader["age"] + "\t|\t");
Console.Write(reader["height"] + "\t|\t");
Console.Write(reader["gender"] + "\t|\t");
Console.WriteLine();
注意:
以上三种方法返回的都是object类型,可能需要类型转换,使用时没有上面的第一种强类型的方法方便,一般情况下,我们会使用第一种方法,更严谨方便,还有一点不同的是最后三种方法在遇到null值时,会自动显示为空。