我在Access 2010中使用动态传递查询从后端数据库中检索一个或多个记录。经过多次试验和错误后,我抄袭了足够的正确代码来检索相应的记录,并在OnLoad事件期间将它们分配到我的数据表表单上的未绑定文本框。剩下的唯一问题是显示多个记录。我已经确认我正在检索多个记录,但是每个记录的字段的内容都会覆盖存储在表单文本框控件中的先前值,所以当我希望从任何地方看到时,我总是只有一条记录显示在我的数据表中一到十。
我确信这是一个简单的解决方案。有人可以指出我吗?
Private Sub Form_Load()
Dim sqlString As String
sqlString = "SELECT Transmitter_ID, Receiver_ID, UTC_Date, Local_Date from Detections"
If Not IsNull(Me.OpenArgs) Then
sqlString = sqlString & " where " & OpenArgs
End If
Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As ADODB.Recordset
'Define and open connection
cnn.ConnectionString = "DRIVER={SQLite3 ODBC Driver};Database=z:\EWAMP\EWAMP_be_dev.sqlite"
cnn.Open
'Define ADO command
cmd.ActiveConnection = cnn
cmd.CommandText = sqlString
'Populate and enumerate through recordset
Set rst = cmd.Execute
If rst.EOF Then
MsgBox "Nothing found...", vbInformation + vbOKOnly
Exit Sub
Else
Do While Not rst.EOF
'// I'm guessing the problem is with my control assignments, here.
Me.cntl_Receiver_ID.Value = rst("Receiver_ID")
Me.cntl_Transmitter_ID.Value = rst("Transmitter_ID")
Me.cntl_UTC_Date.Value = rst("UTC_Date")
Me.cntl_Local_Date.Value = rst("Local_Date")
Debug.Print {Show me the four control values}
rst.MoveNext
Loop
End If
End Sub
干杯!
DUHdley
答案 0 :(得分:0)
我不相信数据表视图中的表单可以用作未绑定的表单。但您可以使用ADO记录集作为表单记录集。
Set Me.Recordset = rst
然后小心不要关闭名为rst的变量,直到表单关闭。
另一种替代解决方案是使用内存中,制造的,断开连接的ADO记录集。基本上,您最终会创建一个新的记录集,为其添加字段以匹配您现有的记录集,然后将所有数据移动到您的新记录集中。但是如果你已经有一个有效的,填充的ADO记录集,我真的不明白这一点。
如果您确实需要/想要以未绑定的形式显示多个记录,我认为您必须使用ActiveX控件,如GridView,ListView,TreeView或MSFlexGrid。我注意到,大多数技术熟练的专业Access开发人员尽可能远离ActiveX控件。如果他们确实使用它们,他们通常只将它限制为TreeView和ListView,我认为因为它们是关于唯一的ActiveX控件,它们增加了足够的价值,值得忍受它们可能引入的任何问题。
我建议你看一下这篇关于DAO和ADO之间差异的文章。 http://www.utteraccess.com/wiki/index.php/Choosing_between_DAO_and_ADO
答案 1 :(得分:0)
另一个论坛的读者向我指出了类似于HK1提出的解决方案,即Set Me.Recordset = rst
。这解决了我原来的问题,但创造了另一个问题。
首先,我在未绑定的表单上重新绑定了我的四个文本框控件,然后使用http://msdn.microsoft.com/en-us/library/ff835419.aspx中的示例显着修改了代码。修改后的代码如下所示:
Private Sub Form_Load()
Dim sqlString As String
sqlString = "SELECT Transmitter_ID, Receiver_ID, UTC_Date, Local_Date from Detections"
If Not IsNull(Me.OpenArgs) Then
sqlString = sqlString & " where " & OpenArgs
End If
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
'Define and open connection
Set cn = New ADODB.Connection
cn.ConnectionString = "DRIVER={SQLite3 ODBC Driver};Database=z:\EWAMP\EWAMP_be_dev.sqlite;"
cn.Open
'Create an instance of the ADO Recordset class,
'and set its properties
Set rs = New ADODB.Recordset
With rs
Set .ActiveConnection = cn
.Source = sqlString
'// .LockType = adLockOptimistic
.LockType = adLockReadOnly
.CursorType = adOpenKeyset
'// .CursorType = adOpenStatic
.Open
End With
'Set the form's Recordset property to the ADO recordset
Set Me.Recordset = rs
Set cn = Nothing
Set rs = Nothing
End Sub
表单现在显示四行,用于四个返回的记录,20行用于二十个记录,以及最多至少256k行(由我的参数集指定)。唯一剩下的极小问题是,对于四个或更多记录,如果我按下“最后一行”导航按钮(> |),本地光标将焦点设置为一个或多个中间行,并且控件的属性表刷新大力(每秒多次)。如果我有比屏幕上显示的更多的表格行,我无法导航或光标到最后一行。就好像记录集不断更新一样。
正如您所看到的,我使用了RecordSet LockType和CursorType属性(包括adOpenDynamic和adOpenForwardOnly,这两个属性都会导致Set Me.Recordset语句出现运行时错误)。在adLockOptimistic和AdLockReadOnly之间切换LockType,adOpenKeyset和adOpenStatic之间的CursorType在检索性能(现在非常快!)或表观刷新率(不幸的是更快)中没有区别。
也许值得一提的是,“检测”表中的sqlString“选择”来自包含~4M的记录。我之前尝试使用带有绑定到此表的直通查询的数据源的表单时感到很沮丧,因为无论我传递给表单的filter / WhereClause / OpenArgs参数如何,查询总是将整个4M记录返回给客户端。上面显示的解决方案是完美的,只要我可以关闭连接(我已经尝试过)或者在我调用它之后静默RecordSet。