「学习笔记」ADO.NET查询和操作数据(多行多列或者叫复杂查询)

会使用DataReader对象检索数据(重点下面第三段代码,红色文字提示)

会使用Command对象查询数据

ExecuteReader()取数据一次取一行所有数据,可以把每一列数据专门读取出来。

跟ExecuteScalar()只能取一行一列的区别。

using System.Data.SqlClient;

//第一步:创建数据库连接对象
SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=SchoolSystemDB");
//第二步:打开数据库
conn.Open();
//第三步:创建执行脚本对象(SqlCommand 数据) 数据清单、地址
SqlCommand command = new SqlCommand("select * from Students", conn);
//第四步:执行脚本对象
SqlDataReader reader = command.ExecuteReader();//只进游标,不能往后退
//可以通过reader.HasRows来判断是否有数据
if (reader.HasRows)//如果有数据,才继续读取。HasRows()返回是一个bool值
{
    while (reader.Read()) //read()等于netx的意思,下一个。
    {
        int stuNo = (int)reader["stuNo"];
        string? stuName = reader["stuName"].ToString();
        Console.WriteLine(#34;学号:{stuNo},姓名:{stuName}");
    }
}
reader.Close();//释放游标对象
conn.Close();//释放链接对象

Read()也返回一个布尔值,所以外层的判断可以不要。Read()本身相当于下一个,如果有下一个才返回true,就可以直接写成:

while (reader.Read()) //Read()也返回一个布尔值,所以外层的判断可以不要
{
int stuNo = (int)reader["stuNo"];
string? stuName = reader["stuName"].ToString();
Console.WriteLine(#34;学号:{stuNo},姓名:{stuName}");
}
//游标的使用前提是保证链接的基础之上,根据顺序,一般先关闭游标在断开下面的链接
reader.Close();//关闭游标对象(游标在数据库中也是一个对象,使用完释放掉)
//先释放上面,在关闭数据库链接
conn.Close();//关闭链接对象

现在新版本可以使用using把上面这段括起来,使用Dispose()释放资源比Close会快一些。官方给出的解释,咱也不是很懂,建议使用推荐的这种,新的语法糖处理。可以把上面的代码简化改成:

using System.Data.SqlClient;
//第一步:创建数据库连接对象
using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=SchoolSystemDB"))
//这里使用上using,下面的conn.Close()就省略了,在大括号范围内运行
{
  //第二步:打开数据库,这个打开不能省略
  conn.Open();
  //第三步:创建执行脚本对象(SqlCommand 数据) 数据清单、地址
  SqlCommand command = new SqlCommand("select * from Students", conn);
  //第四步:执行脚本对象
  using (SqlDataReader reader = command.ExecuteReader())
  //这里也是用上using,游标关闭语句也省略了reader.Close(),在大括号内运行
  {
    while (reader.Read())
    {
    int stuNo = (int)reader["stuNo"];
    string? stuName = reader["stuName"].ToString();
    Console.WriteLine(#34;学号:{stuNo},姓名:{stuName}");
    }
  }//ExecuteReader()超出所用范围被释放掉
}//conn超出所用范围被释放掉

什么时候使用这个语法糖using呢?只要对象继承了IDisposable这个接口(可以选择对象按F12向上追踪),就能使用.Close(),只要能使用Close(),就能使用using这种语法糖方式。使用了之后,后面的释放语句就不需要了,因为不能超出作用域大括号。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章