从这个小案例我学到了不少知识。这些无论如何无法从书里得来。正所谓实践出真知,学习编程需要大量实践这句话永不过时。

首先:好的代码和坏的代码带来的性能上的差异很明显。好的策略可以让你的程序运行速度大大加快。而差的代码则能让你的程序直接卡死。

这是我写的递归填充TreeView:

        private void GetNode1(TreeNode tNod, int id)
{
using (SqlConnection conn = new SqlConnection("server=.\\sqlexpress;database=WebSite;uid=sa;pwd=123456"))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select ar_id,ar_name,ar_uid from Area where ar_uid="+id;
conn.Open();
SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read())
{
TreeNode newTNod = new TreeNode(dr.GetString());
GetNode1(newTNod, dr.GetInt32());
tNod.Nodes.Add(newTNod);
} }
}
}

运行程序,等了不下10秒界面才出。原因是执行查询次数太多,sqlconnection本身就耗费较大的资源。并且dr的结果集放在服务器每次去取,也很耗时。搞不好就是死递归,对服务器资源极大的浪费

改进后:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Data.SqlClient; namespace TreeView控件
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private List<Area> list = new List<Area>(); private void Form1_Load(object sender, EventArgs e)
{
using (SqlConnection conn = new SqlConnection("server=.\\sqlexpress;database=WebSite;uid=sa;pwd=123456"))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select ar_id,ar_name,ar_uid from Area";
conn.Open();
SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read())
{
list.Add(new Area { ar_id = dr.GetInt32(), ar_name = dr.GetString(), ar_uid = dr.GetInt32() });
}
}
} TreeNode t = new TreeNode("全国");
GetNode(t, );
TreeView.Nodes.Add(t);
} private void GetNode(TreeNode tNod, int id)
{
foreach (Area item in list)
{
if (item.ar_uid == id)
{
TreeNode newTNow = new TreeNode(item.ar_name);
GetNode(newTNow, item.ar_id);
tNod.Nodes.Add(newTNow);
}
}
}
}
}

先一次性从数据库中取出数据,存放到list<>泛型集合,然后对list操作。这样速度快效率高。值得借鉴!

总结一下我对递归的理解:递归就是调用和自己代码相同的方法。不能把它理解为调用自己。

数据库的小案例(三):用递归实现TreeView层级显示的更多相关文章

  1. SqlDependency缓存数据库表小案例

    SqlDependency的简介: SqlDependency是outputcache网页缓存的一个参数,它的作用是指定缓存失效的数据库依赖项,可以具体到数据库和表. SqlDependency能解决 ...

  2. 3)小案例三,加乐前端入口index.php

    之前的代码没有什么改动,唯一改动的就是我在之前的目录结构中加了  index.php作为前端的入口文件 目前,我的文件目录关系是: 然后我的index.php代码内容是: <?php /** * ...

  3. 案例学python——案例三:豆瓣电影信息入库

    闲扯皮 昨晚给高中的妹妹微信讲题,函数题,小姑娘都十二点了还迷迷糊糊.今天凌晨三点多,被连续的警报声给惊醒了,以为上海拉了防空警报,难不成地震,空袭?难道是楼下那个车主车子被堵了,长按喇叭?开窗看看, ...

  4. MySQL 数据库增量数据恢复案例

    MySQL 数据库增量数据恢复案例 一.场景概述 MySQL数据库每日零点自动全备 某天上午10点,小明莫名其妙地drop了一个数据库 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢 ...

  5. SQL开发中容易忽视的一些小地方( 三)

    原文:SQL开发中容易忽视的一些小地方( 三) 目的:这篇文章我想说说我在工作中关于in和union all 的用法. 索引定义 : 微软的SQL SERVER提供了两种索引:聚集索引(cluster ...

  6. Eclipse使用JDBC小案例

    JDBC(Java Database Connectivity:Java访问数据库的解决方案)定义一套标准接口,即访问数据库的通用API,不同数据库厂商根据各自数据的特点去实现这些接口. JDBC是J ...

  7. MySQL 之数据库增量数据恢复案例

    MySQL 数据库增量数据恢复案例 一.场景概述 MySQL数据库每日零点自动全备 某天上午10点,小明莫名其妙地drop了一个数据库 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢 ...

  8. session的两个小案例

    学完了session,写两个小案例加深一下对session的巩固. 1. 用户登陆案例 登陆html页面提交后,将参数带给处理登陆的servlet,该servlet将获得登陆的用户名和密码,并将这些信 ...

  9. 黑马day14 踢人小案例

    本案例介绍: 使用监听器来实现踢人小案例,仅仅有管理员才有踢人的功能. 1.搭建开发环境,导入本案例须要的jar包.以及一个准备好的数据库工具类:提供数据源的方法...当中我已经在数据库中加入了三个用 ...

随机推荐

  1. java8快速实现分组、过滤、list转map

    public class TestEntity { private String c1; private String c2; public TestEntity(){} public TestEnt ...

  2. C++-HDU1166-敌兵布阵[数据结构][树状数组]

    单点修改+区间查询=树状数组 空间复杂度O(n) 时间复杂度O(mlogn) #include <set> #include <map> #include <cmath& ...

  3. 哥廷根: Heroes in My Heart

    哥廷根: Heroes in My Heart (本篇的文字部分均出自北大未名BBS的连载 Heroes in my heart 中哥廷根的部分,作者 ukim. 话说,有任何人能够联系上 ukim ...

  4. selenium的元素定位方法-By

    如果在定位元素属性中包含了如ID等元素属性,那么在一个测试中,定位方法具体有哪几种,可以参考by模块中的By类,By的代码如下: class By(object): """ ...

  5. [AGC027A]Candy Distribution Again

    Description AGC027A 你有一些糖果,你要把这些糖果一个不剩分给一些熊孩子,但是这帮熊孩子只要特定数目的糖果,否则就会不开心,求最多的开心人数. Solution 如果\(\sum a ...

  6. Java数组转集合之Arrays.asList()用法

    Arrays.asList()用法 使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合. 而一开始asList的设计时用于打印数组而设计 ...

  7. 在x64的Ubuntu系统下安装64bit的交叉编译工具aarch64-linux-gnu-gcc【转】

    sudo apt-cache search aarch64 查看哪些版本可以安装: sudo apt--aarch64-linux-gnu 安装一个gcc开头的5版本的支持64bit ARM linu ...

  8. Redis非关系型缓存数据库集群部署、参数、命令工具

    <关系型数据库与非关系型数据库> 关系数据库:mysql.oracle.DB2.SQL Server非关系数据库:Redis(缓存数据库).MongodDB(处理海量数据).Memcach ...

  9. Django中的check指令和sqlmigrate指令

    官方文档的解释如下: Django 有一个自动执行数据库迁移并同步管理你的数据库结构的命令 - 这个命令是 migrate,我们马上就会接触它 - 但是首先,让我们看看迁移命令会执行哪些 SQL 语句 ...

  10. 第二十篇 Linux条件测试语句相关知识点介绍

      条件测试语句的格式如下: [ 条件表达式 ]        # 条件表达式两侧各有一个空格 按测试对象不同,条件测试语句共分为4中类型: 文件测试语句 逻辑测试语句 整数值比较语句 字符串比较语句 ...