现在我有三张表:工程表,测期表,观测日期表
表之间的关系为:工程表(1)——测期表(n),测期表(1)——观测日期表(n)
我在C# winform中使用treeview绑定,实现的思路是:先绑定工程信息,再根据工程编号绑定测期信息,再根据测期编号绑定观测日期信息。嵌套了三层循环,结果我有30个工程,每个工程有30个测期,每个测期现在只有一个观测日期。把这些数据加载上去花费的时间将近要10秒钟,感觉太长了。现要求如下:绑定时间控制越短越好,最好是1-2秒?
提供:数据库(access),分!!!静候佳音!!!

解决方案 »

  1.   

    如果我在另外一个界面中在某个测期下添加了观测日期,我要立马在treeview中看到,那岂不还是要加载工程,测期,观测日期信息啊,这样才能看到新添加的观测日期,如果不这样,那该怎么实现?
    继续请教了。
      

  2.   

    首先测试读取数据库的速度,如果速度很慢,那就是sql语句写得有问题。
    如果只要几毫秒。那你肯定在绑定的时候循环了n多次。
      

  3.   

    有谁能给小弟写个你们认为比较快的程序。。在此谢过了。
    示例代码也行。
    要winform的不要webwinform的。
      

  4.   

    DataAccess 部分封装成存储过程,那样会将数据访问优化得稍微好些!
      

  5.   

    这种数据,在sql里测试应该显示0MS,
      

  6.   

      用委托可以解决  ,新增一个数据时候触发一个事件我要立马在treeview中看到
      

  7.   

    貌似顺序的操作,当你在UI线程里写,就要重新设计为 Timer 控制的多段操作。
      

  8.   

    使用Timer跟开启线程是同样的道理。因此,你也可以这样:foreach(var x in 已经加载的工程表节点)
      ThreadPool.QueueUserWorkItem(new WaitCallback(加载测期表),x);也就是说,所有第二层节点都是分别在不同的线程中加载的。这样,系统也会立刻显示界面,而且也不需要用户点击才加载。
      

  9.   

    access ,没有存储过程的。
      

  10.   

    把你的sql语句贴出来看看,这么点数据10年前的机器也用不了10秒啊
      

  11.   

    //获取工程信息
    string str_sql1 = "select projectid,projectname from project";
    //根据工程编号获取测期信息
    str_sql2 = "SELECT  distinct tg.Table_GaugeDate_Id,tg.Table_GuageDate_Name FROM Table_Project tp INNER JOIN Table_GaugeDate tg " + " ON tp.Table_Project_Id = tg.Table_Project_Id where tp.Table_Project_Id =" + _projectId;
    //根据测期编号获取观测日期信息
    str_sql = "SELECT Table_GuageDateTime.Table_GuageDateTime_Id, Table_GuageDateTime.Table_GuageDateTime FROM" + " Table_GaugeDate INNER JOIN Table_GuageDateTime ON Table_GaugeDate.Table_GaugeDate_Id = Table_GuageDateTime.Table_GaugeDate_Id" + " WHERE Table_GaugeDate.Table_GaugeDate_Id = " + guageDateId + "";sql语句是这样的!我也是觉得啊,这么点数据怎么会要这么长时间呢?
      

  12.   

    别用内联,分别从两个表中取数据:
    select * into temp from Table_Project where able_Project_Id = @projectId
    SELECT  distinct tg.Table_GaugeDate_Id,tg.Table_GuageDate_Name FROM temp tp INNER JOIN Table_GaugeDate tg  ON tp.Table_Project_Id = tg.Table_Project_Id
    试试
      

  13.   

    呵呵,老大。你30*30就是900次查询...
    你的问题出在数据库查询上!!
    str_sql2 = "SELECT  distinct tg.Table_GaugeDate_Id,tg.Table_GuageDate_Name FROM Table_Project tp INNER JOIN Table_GaugeDate tg " + " ON tp.Table_Project_Id = tg.Table_Project_Id where tp.Table_Project_Id =" + _projectId; 这样拼写意味着30个工程就得重新连接30次数据库,是吧?...
    你可以这样:
    select * from 工程表;select * from 测期表,select * from 观测日期表
    这样查询出来的一个DataSet里边就有3个表.然后你给DataSet加上关系。叫做DataRealation,相当于数据库的
    外键连接。这样ds.Table["工程表"].Rows[0].GetChilds(DataRealation),得到的就是全部的对应测期表记录!再试试看看行不! 好运!
      

  14.   

    select * from 工程表;select * from 测期表 ; select * from 观测日期表 
    这样查询出来的一个DataSet里边就有3个表.然后你给DataSet加上关系。叫做DataRealation,相当于数据库的 
    外键连接。这样ds.Table["工程表"].Rows[0].GetChilds(DataRealation),得到的就是全部的对应测期表记录! 给工程表 和   测期表加上了DataRealation
    那么同样的方式去给测期表 和  观测日期表 加上DataRealation
    ds.Table["工程表"].Rows[0].GetChilds(DataRealation),得到的就是全部的对应测期表记录! 
    同样再用得到的
    foreach(DataRow drEach in ds.Table["工程表"].Rows[0].GetChilds(DataRealation) )
    {
        drEach .GetChilds(DataRealation2)  //得到的就是全部的对应观测日期表记录! 
    }