日期:2014-05-18  浏览次数:21048 次

关于在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 (CodeDat