我目前正在开发一个数据库挖掘程序,用于从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
答案 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子句。