将数据库加载到对象中

时间:2017-05-02 11:35:50

标签: c# winforms sqlite

我想问一下是否可以将数据库加载到数组或列表中,然后对其运行查询?我有以下代码。

string cs = "Data Source=dataBase.sqlite;Version=3;";   
SQLiteConnection con;
SQLiteDataAdapter adapt;
DataTable dt;

private void textBox1_TextChanged(object sender, EventArgs e)
{
    con = new SQLiteConnection(cs);
    con.Open();
    adapt = new SQLiteDataAdapter("select * from Table1 where CnName1 like '" + textBox1.Text + "%'", con);
    dt = new DataTable();
    adapt.Fill(dt);
    dataGridView1.DataSource = dt;
    con.Close();
}

这样可行,但无论何时运行查询,它都会创建一个新的dataTable,问题代码为:

dt = new DataTable(); 

该程序意味着不断运行,因此效率低下,因为它会占用大量内存。如何将数据库加载到对象中,然后对该对象运行查询?该表仅包含1列,运行的查询仅用作搜索功能。我只想加载数据库一次,即程序启动时,然后关闭连接,其他一切都将通过程序完成,而不是数据库。

编辑:我想说明查看此问题的其他人也可以查看saab669的答案,因为它也提供了有用的信息,但是我不能选择两个答案。

2 个答案:

答案 0 :(得分:1)

假设您有一个包含文本框的表单。声明一个类级变量来存储数据表。

mu = 0;
sigma = 1;
pd = makedist('Normal',mu,sigma);
fileID = fopen('TLSDeliveryTime.txt', 'r');
formatSpec = '%d';
x1 = fscanf(fileID,formatSpec);
fclose(fileID);
y1 = cumsum(x1) / sum(x1); %cumulative sum, normalized to 1
figure
semilogx(x1,y1,'LineWidth',2)
set(gca,'xscale','log')

创建一个类来封装数据库连接和数据检索。

 private DataTable _data;

在文本框更改事件中,调用db代码并将其分配给类级别var

 public class MyDataBaseConnection
    {
        public DataTable ReturnMyData(string valueFromTextBox)
        {

        var cs = "Data Source=dataBase.sqlite;Version=3;";
        SQLiteConnection con;
        SQLiteDataAdapter adapt;
        DataTable dt;  

        try
         {

            con = new SQLiteConnection(cs);
            con.Open();
            adapt = new SQLiteDataAdapter("select * from Table1 where CnName1 like '" + textBox1.Text + "%'", con);
            dt = new DataTable();
            adapt.Fill(dt);
            con.Close();

            return dt;
         }
         catch (Exception ex)
         {
            //Log here.
            throw;
         }
         finally
         {
            con = null;
            adapt = null;
            //Or Dispose. I dont have SQL lite so dont know if they implement IDispose
         }
    }
}

当文本更改事件再次触发时,数据将在网格中更改。

希望有所帮助。

答案 1 :(得分:0)

我的回复太长,无法发表评论,但我想回复你说的一些事情:

  

但是每当运行查询时它会创建一个新的dataTable,问题代码是dt = new DataTable();该程序意味着不断运行,因此效率低下,因为它会占用大量内存。

排序。您只有一个DataTable对象。只是每当事件触发时,它都会重新查询数据库。因此,您不会消耗过多的内存(除非您的数据库太大了!),或者至少不是您认为的那样。

  

如何将数据库加载到对象中,然后对该对象运行查询?

正如我在评论中提到的那样,你已经这样做了。只是在一个不太理想的事件处理程序中。根据您希望应用程序的行为方式,您应该将其移动到定义为here的表单加载事件。或者,使用click event的按钮可能更有意义。表单加载可能会给应用程序启动带来很长的延迟,并且用户可能认为它会冻结,具体取决于从数据库中获取所有记录所需的时间。

另外,从您提供的代码段中,我是否正确假设您在类级别定义事件处理程序的DataTable dt;

无论如何,根据我在评论中链接的MSDN文章,一旦你填充了DataTable,你可以简单地做这样的事情:

DataRow[] foundRows;
foundRows = dataSet1.Tables["TableName"].Select("ColumnName LIKE 'your_search_value%'");

最后,我不能强调你提供的代码:不要连接将针对数据库执行的查询的字符串。我不在乎是否只是为了完成家庭作业或只使用一个小工具,没有理由没有花费额外的时间来学习如何以正确的方式去做。没有理由建立一个糟糕的习惯,因为这很容易被SQL注入,这很容易被保护。你绝对应该花30分钟来了解parameterized queries