日期:2014-05-18 浏览次数:20490 次
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { System.Data.DataSet ds=new DataSet(); System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(); public Form1() { InitializeComponent(); Form1.CheckForIllegalCrossThreadCalls = false; } private void button1_Click(object sender, EventArgs e) { conn.ConnectionString = "server=.;uid=sa;pwd=sqltest;database=media"; conn.Open(); using (System.Data.SqlClient.SqlCommand command = conn.CreateCommand()) { command.CommandText = "select * from v_test"; using (System.Data.SqlClient.SqlDataAdapter adp = new System.Data.SqlClient.SqlDataAdapter(command)) { adp.FillSchema(ds, SchemaType.Source); } this.dataGridView1.DataSource = ds.Tables[0]; new System.Threading.Thread(new System.Threading.ThreadStart(Query)).Start(); } } void Query() { using (System.Data.SqlClient.SqlCommand command = conn.CreateCommand()) { command.CommandText = "select top 10000 * from v_test"; using (System.Data.SqlClient.SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { object[] v=new object[reader.FieldCount]; reader.GetValues(v); ds.Tables[0].LoadDataRow(v, true); this.label1.Text = string.Format("{0}行",this.ds.Tables[0].Rows.Count); } } conn.Close(); } } } }
------解决方案--------------------
那还是把树默认收起来吧,展开的时候再查询
------解决方案--------------------
你要解决数据库超时的问题,说明这些数据肯定不能一次性的从数据库读取出来。那就肯定要分次读取了。
你需要根据实际情况考虑如何分次去读,是按固定记录量分开,还是根据上下级树型结构分。这于使用时候的需求有关
至于告诉用户正在进行处理,只需要有一个进度条就行了
做成多线程的,防止UI无相应
------解决方案--------------------
那还是把树默认收起来吧,展开的时候再查询
------解决方案--------------------
启动多个线程去取数据,每个线程取完数据的时候,UI刷新它那一块,相当于异步响应。每个线程取自己的那部分数据,这样用户体验好一些。
------解决方案--------------------
怕超时的话由两方面入手,一是检查当前的查询SQL速度能否再提升,包括优化写法和增加索引。二是把读取动作分解,一次只读一部分,分多次读完。参考分页的读取方法,用子线程读取一部分填充一部分,这样就不会让用户等到所有数据加载完成才能看到了。
------解决方案--------------------