ADO.NET(查询、属性扩展)

一、ADO.NET 融合面向对象的查询语句

1.只查询一条数据

//数据访问中的select方法
public stu select(string xuehao)
      {
          stu s = null;
          cmd.CommandText = "select *from stu where xuehao=@a";
          cmd.Parameters.Clear();
          cmd.Parameters.Add("@a", xuehao);
          conn.Open();
          SqlDataReader dr = cmd.ExecuteReader();
          if(dr.HasRows)
          {
              dr.Read();
              s = new stu();
              s.Xuehao=dr["xuehao"].ToString();
              s.Name=dr["name"].ToString();
              s.Banji = dr["banji"].ToString();
              s.Sex = Convert.ToBoolean(dr["sex"]);
              s.Bir = Convert.ToDateTime(dr["bir"]);
          }
          conn.Close();
          return s;

      }
C#代码:
Console.Write("请输入要查询的学号:");
           string ss=  Console.ReadLine();
            Console.WriteLine("学号" + "	" + "姓名" + "	" + "性别" + "	" + "班级" + "	" + "生日");
            stu a = sdata.select(ss);
            if(a!=null)
            {
                Console.WriteLine(a.Xuehao+"	"+a.Name+"	"+((a.Sex)?1:0)+"	"+a.Banji+"	"+a.Bir.ToString("yyyy-MM-dd"));
            }

2.查询所有语句

 数据访问中的代码:
public List<stu> Select()
      { //泛型集合,放置所有stu数据对象
          List<stu> list = new List<stu>();

          cmd.CommandText = "select *from stu";//查询语句
          conn.Open();//打开数据库
          SqlDataReader dr = cmd.ExecuteReader();//调用此方法用来查询 
          if(dr.HasRows)//如果数据表中有数据
          {
              while(dr.Read())//循环读取全部数据
              {//每读取一行数据,就制作一个stus对象
                 stu s = new stu();
                  s.Xuehao = dr["xuehao"].ToString();
                  s.Name = dr["name"].ToString();
                  s.Banji = dr["banji"].ToString();
                  s.Sex = Convert.ToBoolean(dr["sex"]);
                  s.Bir = Convert.ToDateTime(dr["bir"]);
//注意,在循环中,将制作好的每一个对象,都放到集合中去
                  list.Add(s);
              }
          }
          conn.Close();//关闭数据库
          return list;
      }
C#代码部分:
List<stu> ulist = new studata().Select(); 
            if(ulist.Count>0)
            {
                foreach(stu s in ulist)//遍历
                {
                    Console.WriteLine(s.Xuehao + "	" + s.Name + "	" + ((s.Sex) ? 1 : 0) + "	" + s.Banji + "	" +s.Bir.ToString("yyyy-MM-dd"));
                }
            }
            Console.ReadLine();

 二、小知识

1、程序的运行顺序和机制
卡断点
可以很好的处理程序中未知的BUG
并且可以很准确的找到BUG的位置

2、函数的抽象性
函数功能写的越少,那么这个函数能被应用的地方就越多

三、属性扩展**

处理:有外键关系时将代号化信息处理成原始文字,让用户可看懂的(粗略解释)

如:将性别返回的值true或false改为男或女

1.直接在实体类(如stu)中_sex私有变量再新建一个成员变量:

public string sexstr
{
get{return (_sex?"":"")}
}

2、

将Console.WriteLine(s.Xuehao + "	" + s.Name + "	" + ((s.Sex) ? 1 : 0) + "	" + s.Banji + "	" +s.Bir.ToString("yyyy-MM-dd"));中的
((s.Sex) ? 1 : 0) 改为s.sexstr.
将表中的Users民族列显示的是民族代号处理成Nation表中的民族名称
  需要在Users类里面扩展一个显示Nation名称的属性

Nation表在C#新建Nation实体类和Nationdata数据访问类
Nationdata类新建一个查询方法:
 public string Select(string code)
        {
            string end = "<无>";

            cmd.CommandText = "select *from Nation where NationCode=@a";
            cmd.Parameters.Clear();
            cmd.Parameters.Add("@a", code);

            conn.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            if (dr.HasRows)
            {
                dr.Read();
                end = dr["NationName"].ToString();
            }

            conn.Close();
            return end;
        }

再在Users内_Nation新建一个成员变量

 public string NationName//扩展的名族名称属性
        {
            get
            {
                NationData Ndata = new NationData();
                string end = Ndata.Select(_Nation);
                return end;
            }
        }