我想问一下是否可以将数据库加载到数组或列表中,然后对其运行查询?我有以下代码。
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的答案,因为它也提供了有用的信息,但是我不能选择两个答案。
答案 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。