使用基于传递查询的表单访问2010膨胀

时间:2014-06-11 14:45:12

标签: vba ms-access memory access-vba ms-access-2010

我的访问2010数据库有超级大量的膨胀。在VBA的几次运行中,它从44mb变为282mb。这就是我设置的内容:

本地表 - 这些表计算表单上的统计信息,通常不会移动太多。

通过查询 - 我的个人嫌疑人。在查看表单时,如果用户单击记录,则使用用户单击的记录运行传递查询。所以用户点击“joe”,用sql string =“select * from sqlserver where name =”& [forms]![myform]![firstname]

进行查询运行

运行此查询后,我的vba删除传递查询,然后在选择另一条记录后重新创建它。所以用户返回名称列表,然后单击BRIAN。然后我的vba删除传递查询并创建另一个来从sql server中选择所有名为brian的记录,使用与上面相同的代码。

表单 - 我的表单使用传递查询作为源。

我做的不是很聪明吗?如何更好地构建它以防止文件大小爆炸的访问?我尝试了紧凑和修复,以及分析访问2010年的数据库性能。任何帮助都很感激,我一直在谷歌搜索access2010膨胀,并阅读有关临时表以及关闭DAO(我正在使用,我做了明确地关闭)。谢谢!

以下是我正在使用的其中一种表单的代码 -

Private Sub name_Click()
'set dims
Dim db As DAO.Database
Dim qdExtData As QueryDef
Dim strSQL As String
Dim qdf As DAO.QueryDef
'close form so it will refresh
DoCmd.Close acForm, "myform", acSaveNo
'delete old query so a new one can be created with the same name

For Each qdf In CurrentDb.QueryDefs
If qdf.Name = "QRY_PASS_THROUGH" Then
    DoCmd.Close acQuery, "QRY_PASS_THROUGH", acSaveNo
    DoCmd.SetWarnings False
    DoCmd.DeleteObject acQuery, "QRY_PASS_THROUGH"
    DoCmd.SetWarnings True
Exit For
End If
Next

Set db = CurrentDb
'sql for the data
strSQL = "select fields from (table1 inner join table2 on stuff=stuff and stuff=stuff)     left join table3 on stuff=stuff and stuff=stuff where flag='P' and table.firstname = " &     [Forms]![myform]![firstname]
Set qdExtData = db.CreateQueryDef("QRY_PASS_THROUGH")
'how you connect to odbc
qdExtData.Connect = "ODBC;DSN=server;UID=username;PWD=hunter2;"
qdExtData.SQL = strSQL

DoCmd.OpenForm ("names")
Forms!returns!Auto_Header0.Caption = "Names for " & Me.name & " in year " & Me.year
qdExtData.Close
db.Close
qdf.Close

Set db = Nothing
Set qdf = Nothing


End Sub

1 个答案:

答案 0 :(得分:1)

没有理由我可以想到不将表单绑定到视图并使用open form命令的“where子句”。它将消除所有代码。

然后你可以简单地使用:

strWhere = "table.FirstName = '" & me.FirstName & "'"
Docmd.OpenForm "Names”,,,strWhere 

此外,C + R不会返回空闲空间也几乎没有意义。这里的其他事情是严重错误的。

此外,您实际上不需要每次都删除查询。假设传递总是存在,然后使用它:

strSQl = “your sql goes here as you have now”
Currentdb.Querydef("MyPass").SQL = strSQL

Docmd.Openform “your form”

以上就是你所需要的。我在这里计算了大约3行代码,它们将取代你现在拥有的所有代码。请注意,连接字符串信息当然与pass-though一起保存,不需要每次都设置或搞乱。

我也会对你的数据库进行反编译。我在所有开发机器上都有快捷设置,所以我可以右键单击进行反编译。以下是关于反编译的一些信息:

http://www.granite.ab.ca/access/decompile.htm

所以,我真的不知道你为什么不使用开放表格的where子句?只需将表单绑定到SQL视图,无需任何条件。然后使用open form命令 - 您只需将符合条件的网络管道中的记录拉出来。

并注意如何将SQL直接填充到查询def的.SQL属性中,如上所示 - 再次不需要删除代码,这也意味着您不会在代码中弄乱连接信息。总共约3行。