1

我目前正在开发一个数据库挖掘程序,以从 sqlite db 中提取数据并填充表单。这需要同时从几个不同的表中提取几种类型的数据,并且看起来已经有点资源密集型了。有没有更好的方法来解决这个问题?我应该使用后台工作人员来运行 sql 查询吗?我正在运行多个 SQLiteCommand.ExecuteReader 实例,是否可以避免这种情况?

代码:

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
4

2 回答 2

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 语句

编辑另一个可能的改进是再次使用 SQLiteDataReader,但只执行一次对数据库的调用

.... SQLcmd.CommandText = "Select FileVersion_LTH FROM FsFileVersion " & _ "WHERE FileDescription_LTH = 'filea' OR " & _ "FileDescription_LTH = 'fileb' " & _ "ORDER BY FileDescription_LTH" 使用 SQLiteDataReader reader = SQLcmd.ExecuteReader() if reader.Read() Then fileaVrsn = reader(0).ToString() if reader.Read() Then filebVrsn = reader(0).ToString() End If End If End Using ...

第二种方法可能是一种改进,但只有在 LIMIT 1 不是真正需要的情况下才可行

于 2013-10-24T19:56:06.057 回答
0

抱歉,我不知道 sqlite,但 SQL Server 和 Oracle 允许您通过输入“;”一次获取多个数据表 在您的 SELECT 语句之间。即,“从 X 中选择 *;从 Y 中选择 *”。如果您使用数据适配器填充数据集,它将在其中创建 2 个表。(SQL Server 也允许使用 VBCRLF 或 Environment.NewLine)也许你可以做一些测试或搜索,看看 sqlite 是否也可以。

其次,我做了很多测试,如果您使用数据读取器返回每条记录,通常只使用数据适配器并填充数据表会 稍微快一些。如果您没有阅读阅读器中的每条记录,则应重新评估 SQL 的 WHERE 子句。

于 2013-10-24T20:53:34.160 回答