2013-10-24 34 views
1

我目前正在从事数据库挖掘程序从sqlite数据库中提取数据并填充表单。这需要从几张不同的表中同时提取几种类型的数据,而且似乎需要大量资源。有没有更好的方法来解决这个问题?我应该使用后台工作来运行sql查询吗?我正在运行多个SQLiteCommand.ExecuteReader实例,是否可以避免这种情况?vb.net - sqlite - 在一个连接中选择多个值

代码:

Public Shared Sub SQLInq() 

    'Database Information 
    Dim connection As String = "Data Source=" & _Compression.path 
    Dim SQLConn As New SQLiteConnection(connection) 
    Dim SQLcmd As New SQLiteCommand(SQLConn) 
    Dim SQLdr As SQLiteDataReader 

    'Connect to Database 
    SQLConn.Open() 
    SQLcmd.Connection = SQLConn 

    'Run query 
    SQLcmd.CommandText = "Select * FROM FsFileVersion WHERE FileDescription_LTH = 'filea' LIMIT 1;" 
    SQLdr = SQLcmd.ExecuteReader() 
    While SQLdr.Read() 
     fileaVrsn = (SQLdr.GetString(SQLdr.GetOrdinal("FileVersion_LTH"))) 
    End While 
    SQLdr.Close() 

    'Run query 
    SQLcmd.CommandText = "Select * FROM FsFileVersion WHERE FileDescription_LTH = 'fileb' LIMIT 1;" 
    SQLdr = SQLcmd.ExecuteReader() 
    While SQLdr.Read() 
     filebVrsn = (SQLdr.GetString(SQLdr.GetOrdinal("FileVersion_LTH"))) 
    End While 
    SQLdr.Close() 

    'Close connection 
    SQLConn.Close() 

    'Revert cursor wait to arror 
    Application.Current.MainWindow.Cursor = Cursors.Arrow 
End Sub 
+0

不知道你的问题是什么。如果它锁定了UI,那么是的,使用BackgroundWorker。 – LarsTech

+0

@LarsTech有没有更好的方法来解决这个问题?我应该使用后台工作来运行sql查询吗?我正在运行多个SQLiteCommand.ExecuteReader实例,是否可以避免这种情况?我想最大的问题是可以在一个执行读取器中运行多个命令,而不是多个执行读取器? – GamerJ5

+0

不知道我明白为什么有多个实例会出错。你能避免它吗?当然。为连接,命令和读者使用“使用...最终使用”格式。 – LarsTech

回答

1

如果你是唯一一个记录(LIMIT 1),只有一列(FileVersion_LTH)很感兴趣,那么你可以删除ExecuteReader,并只使用ExecuteScalar

Dim connection As String = "Data Source=" & _Compression.path 
Using SQLConn = New SQLiteConnection(connection) 
Using SQLcmd = New SQLiteCommand(SQLConn) 
    SQLConn.Open() 
    SQLcmd.CommandText = "Select FileVersion_LTH FROM FsFileVersion " & _ 
         "WHERE FileDescription_LTH = 'filea' LIMIT 1;" 
    Dim result = SQLcmd.ExecuteScalar() 
    if result IsNot Nothing Then 
     fileaVrsn = result.ToString() 
    End if 

    ... repeat for 'fileb' 
End Using 
End Using 

然而我不确定这是否是一项性能改进。毕竟,你的代码似乎并没有那么糟糕。只要记住使用using statement

编辑另一个可能的改进是再次使用SQLiteDataReader,但在执行只需一个电话到数据库

.... SQLcmd.CommandText =“选择FileVersion_LTH FROM FsFileVersion” & _ “WHERE FileDescription_LTH = 'FILEA' OR” & _ “FileDescription_LTH = 'FILEB'” & _ “ORDER BY FileDescription_LTH” 使用SQLiteDataReader读者= SQLcmd.ExecuteReader() 如果reader.Read()然后 fileaVrsn =阅读器(0)的ToString() 如果reader.Read()然后 filebVrsn =阅读器(0)的ToString() 结束如果 结束如果结束 使用 .. 。

这第二种方法可能是一种进步,但只有在LIMIT 1是不是真的需要

+0

良好的信息和绝对的追求。结果是从第一列向我提供信息,而不是从我在当前代码中指定的列作为FileVersion_LTH。 *编辑* Nevermind,注意到你对查询字符串所做的更改。谢谢! – GamerJ5

+0

另一个可能的改进是再次使用SQLiteDataReader,但只对数据库执行一次调用。我会更新答案 – Steve

0

对不起,我不知道的SQLite,但SQL Server和Oracle允许你通过puting一次得到多个数据表是可行的“ ;”在你的SELECT语句之间。 IE,“选择*从X;选择*从Y”。如果您使用数据适配器来填充数据集,它将在那里创建2个表格。 (SQL Server还允许VBCRLF或Environment.NewLine)也许你可以做一些测试或搜索,看看sqlite是否也是如此。

其次,我也做了很多的测试,如果你正在使用DataReader返回的每一条记录,它是通常稍快只使用一个DataAdapter和填充的DataTable。如果您没有阅读读者中的每条记录,则应重新评估SQL的WHERE子句。