现在有一个要求,用户可以输入多个产品序列号,查询检测结果。现在的逻辑使用union连接所有的序列号进行查询,结果绑在gridview上面。但是如果输入的序列号过多,比如2、3百以上,查询经常超时(表中有4亿数据,年代久远不能改了)。
我想问能否实现,不使用union,每一个序列号查询完后,绑定一次,显示在页面上。下一个序列号查询完后,再绑定一次,接着上一个序列号的返回结果后面显示在页面上。
1000个序列号就查询1000次,绑定1000次,显示1000次,这样用户体验也好,能实时看到数据返回。如果可以实现,怎么实现绑定数据呢?如果不行,有什么好的替代方法吗?

解决方案 »

  1.   

    多个序列号为什么用union呢,不都是一个表里的内容吗,可以用 id in (1,2,3,4)的形式,不管怎样,4亿条记录,怎么也不会快,如果你数据库优化的非常好,再加上分页查询,异步查询,不要一次性都拿过来
      

  2.   

    可以使用分页,或者查询条件。
    "每一个序列号查询完后,绑定一次"这个应该是没法实现的。
    绑定后Gridview或者其它控件的内容就变成新的了。
      

  3.   

    现在是因为不知道谁建的表,可能是10年前的了,没有主键。要实现先要的逻辑还要自连接,条件要写在子查询里,若果用in拿到的结果不全,有一个字段会重复,最后拿查询来的时候会去重。总之很烂的的一个表,没主键,没范式。我现在想出一个办法,每次序列号查出的数据放到一个DataTable里,都查完的时候绑定。这样单一一个序列号不会超时,总的也不会超时。但是用的是GridView自带的分页,每次换页都要重新查询,序列号多的时候很慢。这种情况怎么写分页。相当于一个序列号查一次放到DataTable里,页面不显示,再一个还放到同一个DataTable里,1000个序列号就查1000次,最后再绑定。想不出这样的逻辑怎么写分页。
      

  4.   

    union很慢,GridView自带的分页也很慢。
    可以把GridView绑定到DataTable,DataTable是可以合并的,查询一次合并一次,后再绑定,分页不受影响。
      

  5.   

    你的想法很好。但是我不建议你再考虑asp.net编程。应该完全基于javascript来编写程序。而Asp.net页面顶多不过是下载第一个序列号的数据在<div><span>这样的嵌套数据中,然后使用脚本循环读取数据、在浏览器端产生<table><tr>。这样之后的所有序列号分别是异步ajax查询来的数据,然后逐行添加到table的末尾了。
      

  6.   

    实际上,会写几行ashx编程就够了。其它的asp.net的“技术”可以扔掉了!
      

  7.   

    你完了。还是传统的asp.netGridView啊。那么你就好好看看GridView教程呗。
      

  8.   

    union很慢,GridView自带的分页也很慢。
    可以把GridView绑定到DataTable,DataTable是可以合并的,查询一次合并一次,后再绑定,分页不受影响。