第一次运行应用程序从DLL缓慢

时间:2018-01-18 04:51:05

标签: c# sql winforms

我是C#的新手。

我想问的是我创建一个表单并将其编译为 dll 并尝试从另一个应用程序(来自公司应用程序)调用它。

我想问的是,当我尝试第一次打开我的表单时需要一段时间(比如1-2分钟)然后关闭表单(不是应用程序)并重新尝试再次打开第二次表单,它比第一次更快。

如果我关闭应用完全并重新打开我的表单第一次需要一段时间(如1-2)分钟)。

对于 dll 本身,正在选择数据库。代码如下

public partial class Genre : Form
{
    SqlConnection myConnection = new SqlConnection(class.Conn);
    DataTable dt_main = new DataTable();

    Bitmap gbr_inf = new Bitmap(Properties.Resources.info_icon, 25, 25);
    Bitmap gbr_error = new Bitmap(Properties.Resources.close, 25, 25);

    RepositoryItemComboBox repositoryItemComboBox1 = new RepositoryItemComboBox();
    RepositoryItemComboBox repositoryItemComboBox2 = new RepositoryItemComboBox();


    public Genre()
    {            
        InitializeComponent();
        repositoryItemComboBox1.ButtonClick += RepositoryItemComboBox1_ButtonClick;
        repositoryItemComboBox2.ButtonClick += RepositoryItemComboBox2_ButtonClick;
    }

 private void Genre_Load(object sender, EventArgs e)
    {
        SDB();         
        fill_repo();
    }

 public void SDB()
    {
        SqlCommand command = new SqlCommand();
        SqlDataAdapter adapter = new SqlDataAdapter();
        try
        {
            dt_main.Clear();
            myConnection.Open();

            command.Connection = myConnection;
            command.CommandText = "Select * from Genre with (nolock) order by code";                
            adapter.SelectCommand = command;
            adapter.Fill(dt_main);
            gridControl1.DataSource = dt_main;               
        }
        catch (Exception ex)
        {
            MessageBox.Show("error" + ex);
        }
        finally
        {
            myConnection.Close();
        }
    }

  public void fill_repo()
    {
        DataTable dtrepo = new DataTable();
        dtrepo.Clear();
        dtrepo = dt_main.Copy();

        for (int i = 0; i < dtrepo.Rows.Count; i++)
        {                                
            string code = dtrepo.Rows[i]["code"].ToString();
            string genre = dtrepo.Rows[i]["genre"].ToString();

            if (!repositoryItemComboBox1.Items.Contains(code))
            {
                repositoryItemComboBox1.Items.Add(code);
            }
            if (!repositoryItemComboBox2.Items.Contains(genre))
            {
                repositoryItemComboBox2.Items.Add(genre);
            }

        }
    }

 private void gridView1_CustomRowCellEdit(object sender, CustomRowCellEditEventArgs e)
    {           
        if (e.Column.FieldName == "code" && view.IsFilterRow(e.RowHandle))
        {
            e.RepositoryItem = repositoryItemComboBox1;
        }
        if (e.Column.FieldName == "genre" && view.IsFilterRow(e.RowHandle))
        {
            e.RepositoryItem = repositoryItemComboBox2;
        }          
    }
}

似乎是什么问题?

1 个答案:

答案 0 :(得分:0)

致电SDB时:

public void SDB()
{
    SqlCommand command = new SqlCommand();
    SqlDataAdapter adapter = new SqlDataAdapter();
    try
    {
        dt_main.Clear();
        myConnection.Open();

        command.Connection = myConnection;
        command.CommandText = "Select * from Genre with (nolock) order by code";                
        adapter.SelectCommand = command;
        adapter.Fill(dt_main);
        gridControl1.DataSource = dt_main;               
    }
    catch (Exception ex)
    {
        MessageBox.Show("error" + ex);
    }
    finally
    {
        myConnection.Close();
    }
}

您正在从Genre表中复制所有字段和所有行并将它们放入dt_main DataTable中。这可能是一项昂贵的操作,具体取决于Genre表的大小。

如果您希望应用程序运行良好,通常应该通过在任何给定时间仅选择您感兴趣的字段和行来避免非常大的查询。在这种情况下,您只使用codegenre字段,因此使用

可以获得更好的性能
"Select code, genre with (nolock) order by code"

此外,您在填充下拉列表之前正在复制整个表

dtrepo = dt_main.Copy();

这完全没必要。

缓存数据也很重要,因此您不会在每次表单加载时都访问数据库。你正在做(意外),但你真的应该有一个更好的计划。