加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – SQL Server CE性能,从表中选择需要8s为7000条记录

发布时间:2020-12-15 17:25:47 所属栏目:百科 来源:网络整理
导读:我有SQL Server CE 3.5数据库.我运行以下代码: private void Load(string sql){ if (connection.State != ConnectionState.Open) connection.Open(); SqlCeDataAdapter sqlCeDataAdapter = new SqlCeDataAdapter(sql,connection); Stopwatch watch = new St
我有SQL Server CE 3.5数据库.我运行以下代码:

private void Load(string sql)
{
  if (connection.State != ConnectionState.Open)
    connection.Open();
  SqlCeDataAdapter sqlCeDataAdapter = new SqlCeDataAdapter(sql,connection);

  Stopwatch watch = new Stopwatch();

  DataSet dataSet = new DataSet();
  try
  {
    Cursor.Current = Cursors.WaitCursor;
    watch.Start();

    sqlCeDataAdapter.Fill(dataSet,"items");
    sqlCeDataAdapter.Dispose();

    var myBind = new BindingSource(dataSet,"items");
    grid.DataSource = myBind;
  }
  finally
  {
    watch.Stop();
    Cursor.Current = Cursors.Default;
    MessageBox.Show(watch.ElapsedMilliseconds.ToString());
  }      
}

Load ("select a1,a2 from table");

SQL Server CE是否很长,还是应该加载更快?

我该怎么做才能让这个选择更快?

当我使用其他表的连接时,时间急剧增长……

编辑:

我已经更改了以下新版本的代码,但仍然是7.5秒. …

private void Load2 (string sql)
{
  if (connection.State != System.Data.ConnectionState.Open)
  {
    connection.Open();
  }

  using (SqlCeCommand command = new SqlCeCommand(sql,connection))
  {
    Stopwatch watch = new Stopwatch();

    Cursor.Current = Cursors.WaitCursor;
    watch.Start();
    using (SqlCeDataReader reader = command.ExecuteReader())
    {
      DataSet dataSet = new DataSet();

      dataSet.Tables.Add("items");

      dataSet.Tables["items"].Columns.Add("s1");
      dataSet.Tables["items"].Columns.Add("s2");

      while (reader.Read())
      {
        string s1 = reader.GetString(0);
        string s2 = reader.GetString(1);

        dataSet.Tables["items"].Rows.Add(s1,s2);
      }
      watch.Stop();
      Cursor.Current = Cursors.Default;
      MessageBox.Show(watch.ElapsedMilliseconds.ToString());

      BindingSource binding = new BindingSource(dataSet,"items");
      grid.DataSource = binding;
    }
  }
}

解决方法

SqlCeDataAdapter.Fill(…)只是出了名的慢.如果您真的需要性能,则需要使用 SqlCeDataReader.

private void Load(string sql) {
    if (connection.State != System.Data.ConnectionState.Open) {
        connection.Open();
    }

    using (SqlCeCommand command = new SqlCeCommand(sql,connection)) {
        using (SqlCeDataReader reader = command.ExecuteReader()) {
            DataSet dataSet = new DataSet();

            dataSet.Tables.Add("items");

            while (reader.Read()) {
                DataRow row = dataSet.Tables["items"].NewRow();
                // fill your row

                dataSet.Tables["items"].Rows.Add(row);
            }

            BindingSource binding = new BindingSource(dataSet,"items");
            grid.DataSource = binding;
        }
    }
}

当然,添加正确的错误处理,并根据自己的喜好进行清理.与DbDataAdapter实现相比,还有Entity Framework在性能上相当不错.

因为您使用的是SqlCe,所以您还有其他限制因素,例如磁盘IO,并且您没有服务器处理任何类型的优化的SQL事务.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读