sqlce 真的是如何不成熟的数据库?

dahuiing   2009-8-2 16:56 楼主
有人可以指点一下我吗?搞这个问题都差不多三天了,都没解决.
开发平台 c#.net vs2008 数据库sqlce, pda平台wince 系统,一款叫i60的pda,

原先用sqlce,在往一个表中批插入时,只要这个表的字段大于4个以上,
比如说插入1000条,这时,在插入到300多条时就出错,或者报TypeLoadException,或者不知是什么错误.

后来换了sqlite,得确,在批插入时非常快,也没有错误.
但又换来个问题, sqlite 在单插入记录时相对慢,比如说会 到100ms多到200ms,注意是单插入,不定时插入,也就是说开事务没用.

而相对sqlce来说,单插入sqlce 速度只要50ms到100ms,
老大说sqlite这样的单插入时间不可接受,唯有用回sqlce,
但就又回到原来的问题了.............

各位哥哥姐姐们,有没有遇到过sqlce 这样的问题??
难道 我要在批插入sqlce 时,这样处理?
批插入10条,然后,close连接,再重连,再插入10条,这样...??

回复评论 (5)

附我的代码

  1.     public partial class Form1 : Form
  2.     {
  3.         public static readonly string APPPATH = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
  4.         //string cesqlconnstr = "";
  5.         public Form1()
  6.         {
  7.             InitializeComponent();
  8.             //cesqlconnstr = "DataSource=testdb.sdf";
  9.         }
  10.         public delegate void dlgShoMsg(string pMsg);
  11.         private void ShowMsg(string pMsg)
  12.         {
  13.             if (this.label1.InvokeRequired)
  14.             {
  15.                 dlgShoMsg dlg = new dlgShoMsg(ShowMsg);
  16.                 this.label1.Invoke(dlg, new object[] { pMsg });
  17.             }
  18.             else
  19.             {
  20.                 this.label1.Text = pMsg;
  21.             }
  22.         }   

  23.         private void button1_Click(object sender, EventArgs e)
  24.         {
  25.             string sFileName = "testdb.sdf";
  26.             System.IO.File.Delete(APPPATH + "\"+ sFileName);
  27.             string sPaaa = "DataSource=" + APPPATH + "\" + sFileName;

  28.             Db4SqlCE.CreateSDF(sPaaa);
  29.             Db4SqlCE db = new Db4SqlCE(sPaaa);

  30.             string sSql = @"CREATE TABLE [pubgoods] (
  31.         [goodsid] [nvarchar] (50)  NOT NULL PRIMARY KEY,
  32.         [styleid] [nvarchar] (50)  NULL ,
  33.         [styledesc] [nvarchar] (200)  NULL ,
  34.         [sizecategoryid] [nvarchar] (50)  NULL ,
  35.         [colorid] [nvarchar] (50)  NULL ,
  36.         [colordesc] [nvarchar] (50)  NULL ,
  37.         [sizeid] [nvarchar] (50)  NULL ,
  38.         [sizedesc] [nvarchar] (50)  NULL
  39. )
  40. ";
  41.             db.Execute(sSql);

  42.             System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart
  43.             (Doit));
  44.             th.IsBackground = true;
  45.             th.Start();

  46.         }

  47.         private void Doit()
  48.         {
  49.             int iRow = 1000;
  50.             string sFileName = "testdb.sdf";
  51.             string sPaaa = "DataSource=" + APPPATH + "\" + sFileName;
  52.             Db4SqlCE db = new Db4SqlCE(sPaaa);
  53.             db.ConnectionKeepOpenTf = true;

  54.             db.TransactionBegin();
  55.             try
  56.             {

  57.                 string sSql = "";

  58.                 for (int i = 1; i <= iRow; i++)
  59.                 {
  60.                     sSql = string.Format(@"INSERT INTO [pubgoods]([goodsid], [styleid], [styledesc],
  61. [sizecategoryid], [colorid], [colordesc], [sizeid], [sizedesc])
  62. select '{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}'"
  63.                         , i.ToString(), "styleid".ToString().Trim()
  64.                         , "styledesc".ToString().Trim(), "sizecategoryid".ToString().Trim()
  65.                         , "colorid".ToString().Trim(), "colordesc".ToString().Trim()
  66.                         , "sizeid".ToString().Trim(), "sizedesc".ToString().Trim());
  67.                     db.Execute(sSql,true);


  68.                     this.ShowMsg(i.ToString() + "/" + iRow.ToString());

  69.                 }
  70.             }
  71.             catch (Exception err)
  72.             {
  73.                 db.TransactionRollback();
  74.                 MessageBox.Show(err.Message);
  75.                 return;
  76.             }
  77.             db.TransactionCommit();
  78.         }
  79.     }
点赞  2009-8-2 16:58
没遇到过,一般数据库都不在CE上,在专门的服务器~
点赞  2009-8-2 23:14
LZ用的SQLCE版本是3.5的吧
试着把事务先去掉,或者SQL语句改成insert into table(……) values(……)看看结果怎么样?
没遇到过你问题
点赞  2009-8-3 09:35
单步看了一下,开事务,sqlite存储一条记录一般几十个ms,我测试过我的代码,数据少的20几个ms,最长的数据2k多,耗时要48ms。
sqlce我没测试过,我这边查询速度太慢了。
点赞  2009-8-3 11:39
...........
点赞  2009-8-6 08:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复