vb.net - sqlite - 在一个连接中选择多个值

时间:2013-10-24 18:54:49

标签: vb.net sqlite

我目前正在开发一个数据库挖掘程序,用于从sqlite数据库中提取数据并填充表单。这需要同时从几个不同的表中提取几种类型的数据,而且似乎有点资源密集。有没有更好的方法来解决这个问题?我应该使用后台工作程序来运行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

2 个答案:

答案 0 :(得分: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'”& _                         “按FileDescription_LTH排序”    使用SQLiteDataReader reader = SQLcmd.ExecuteReader()        如果reader.Read()那么            fileaVrsn = reader(0).ToString()            如果reader.Read()那么               filebVrsn = reader(0).ToString()            万一        万一    结束使用    ...

第二种方法可能是一种改进,但只有在不需要LIMIT 1时才可行

答案 1 :(得分:0)

抱歉,我不知道sqlite,但是SQL Server和Oracle允许您通过放置“;”一次获得多个数据表您的SELECT语句之间。 IE,“SELECT * FROM X; SELECT * FROM Y”。如果使用dataadapter填充数据集,则会在其中创建2个表。 (SQL Server也允许使用VBCRLF或Environment.NewLine)也许您可以进行一些测试或搜索以查看sqlite是否也这样做。

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