关于在windows mobile5.0 上使用SQLite查询的问题?
- C# code
DataManagement dm = new DataManagement(); bindingSource1.DataSource = dm.GetPatientOrder(patientId, "", conn); dataGrid1.DataSource = bindingSource1.DataSource; //============================================================== public DataTable GetPatientOrder(string patientId, string orderNo, SQLiteConnection conn) { string sqlSearch = ""; if (orderNo.Trim() != String.Empty) { sqlSearch += " AND Order_no=" + orderNo + " "; } string sql = @"SELECT *,case repeat_indicator when 1 then '长期' ELSE '临时' end repInd, '记录' as Performs FROM ORDERS where PATIENT_ID='" + patientId + "' " + sqlSearch + " "; SQLiteCommand cmd = new SQLiteCommand(sql, conn); SQLiteDataReader rdr = cmd.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(rdr); rdr.Close(); return dt; }
用以上代码查询少量数据是很快的,但是查询一万条左右的数据要20多秒,经调试发现在 dt.Load(rdr);这里耗时了10多秒,bindingSource1.DataSource = dm.GetPatientOrder(patientId, "", conn);赋值的时候也耗时了10多秒.。。。
请大家帮忙看下程序为何如此的慢,代码是否可以优化提高性能呢?谢谢了~~
[解决办法]
sqlite中是有事务的
开启事务的时间,性能会更高
[解决办法]
先begin
最后commit
可以减少sqlite内部的更新次数
[解决办法]
帮顶一下呀,
[解决办法]
关注学习..
[解决办法]
你试试自己写这两个慢的地方 看看效率怎么样
[解决办法]
帮你顶上来。。。。加油。。。
[解决办法]
不要急哈。。慢慢来。。。呵呵。。
再顶一个。。。我也帮不到你。。真是惭愧。。。
[解决办法]
把LoadDataRow也改了 自己写
[解决办法]
既然在数据库里查询慢,那就别用数据库,用文件二分查找。
基础数据通过PC程序排序
DataView dv = new DataView(dt);
dv.Sort = "barcode Asc"; //根据barcode这个字段来排序。
再写入到文本文件里。
PDA直接在程序里打开文本文件来二分查找
前提:
1、文件里面每一行的字符必须是相等的,不等的用空格占位
2、条码必须从小到大按顺序排列
3、注意,有1个地方需要灵活改动:(char)59 是 分号分隔符
- C# code
#region 二分查找 /// <summary> /// 二分查找 /// </summary> /// <param name="CodeData">需查找的条码</param> /// <param name="InfoList">用于存放查询到的该条码的整条数据</param> /// <param name="RowLenght">控制每一行的总长度+2(回车算2个字符)</param> public void Bsearch(string CodeData, ArrayList InfoList,int RowLenght) { try { InfoList.Clear(); FileStream fs = new FileStream(@"MyAppData\data\down\lib.txt", FileMode.Open); long txtLenth = fs.Seek(0, SeekOrigin.End) / RowLenght; string tmp = ""; Byte[] rowData = new Byte[RowLenght]; long low = 0; long high = txtLenth - 1; long mid = 0; bool flag = false; long tmpMid = 0; Encoding chCode = Encoding.GetEncoding("GB2312"); while (low <= high) { mid = (low + high) / 2; fs.Seek(mid * RowLenght, SeekOrigin.Begin); fs.Read(rowData, 0, RowLenght); tmp = ""; tmp = chCode.GetString(rowData, 0, rowData.Length).Trim(); if (CodeData == tmp.Split((char)59)[0].Trim()) { InfoList.Add(tmp); flag = true; break; } else if (CodeData.CompareTo(tmp.Split((char)59)[0].Trim()) > 0) { low = mid + 1; } else { high = mid - 1; } } if (flag) { tmpMid = mid - 1; while (flag) { if (tmpMid < 0) { break; } fs.Seek(tmpMid * RowLenght, SeekOrigin.Begin); fs.Read(rowData, 0, RowLenght); tmp = ""; tmp = chCode.GetString(rowData, 0, rowData.Length).Trim(); if (CodeData == tmp.Split((char)59)[0].Trim()) { InfoList.Add(tmp); tmpMid--; } else { break; } } tmpMid = mid + 1; while (flag) { if (tmpMid > high) { break; } fs.Seek(tmpMid * RowLenght, SeekOrigin.Begin); fs.Read(rowData, 0, RowLenght); tmp = ""; tmp = chCode.GetString(rowData, 0, rowData.Length).Trim(); if (CodeData == tmp.Split((char)59)[0].Trim()) { InfoList.Add(tmp); tmpMid++; } else { break; } } fs.Close(); return; } else { fs.Close(); return; } } catch (IOException ex) { InfoList.Clear(); MessageBox.Show(ex.ToString()); return; } } #endregion
[解决办法]
学习!关注中!
[解决办法]
PDA最大的问题就是效率的问题,关注中.
看到Alan_pft文件二分查找方法,想到了R-tree查找方法.
帮顶.