0

我有与 Ms SQL Server 连接的 Access 数据库项目。数据(表)存储在 Ms SQL 服务器中,而表单和报告存储在 Access .ADP 文件中。无法使用设计视图创建查询、表、视图,但可以使用 SQL 查询创建表和视图并将其存储在服务器上。我没有 Ms SQL Server Management Studio,也无法将它安装在我办公室的计算机上。

所以,我想要的是获取一个动态生成的 SELECT SQL 查询数据表,以临时查看结果以进行数据分析。我在表单中放置了一个文本框和一个按钮,并希望显示一个数据表,其中包含单击按钮时写入文本框中的 SQL 查询的结果。

我试过了,但它对我不起作用,而且似乎不是我想要的:
MS Access VBA - 在数据表子表单中显示动态构建的 SQL 结果

我还尝试通过将查询分配给表单的 Recordsource 属性。它显示空白数据表,但数据表下方的导航窗格显示检索到的实际记录数。所以,它正在工作,但没有显示数据。

我试过(来自http://www.pcreview.co.uk/forums/create-query-dynamically-vba-t3146896.html):

Dim db As DAO.Database
Dim qd As DAO.QueryDef
Dim strSQL As String
Set db = CurrentDb
strSQL = "select * from analysts"
Set qd = db.CreateQueryDef("NewQueryName", strSQL)
DoCmd.OpenQuery "db.NewQueryName"

它显示运行时错误 91、对象变量或未在行上设置块变量Set qd = db....

还有(来自同一页面):

Dim strSql As String
strSql = "select * from analysts"
CurrentDb.QueryDefs("qryExport").SQL = strSql
DoCmd.OpenQuery "qryExport"

在行上返回相同的错误CurrentDb.QueryDefs....

任何想法或解决方法?

4

3 回答 3

1

Access ADP 与您可能习惯使用的普通 MDB 完全不同。DAO 通常不用于 ADP,您可能必须添加对 DAO 的引用才能使上述代码的任何部分正常工作。ADP 是围绕使用 ADO 与源数据库交互而设计的。如果您只想为您的数据打开一个记录集,请使用这些方法。

Dim strSql As String
Dim rs as ADODB.Recordset
strSql = "select * from analysts"
set rs = New ADODB.Recordset
Set rs.ActiveConnection = CurrentProject.Connection
rs.Source = strsql
rs.Open

然后,您可以与该记录集进行交互。如果您想将该记录集绑定到表单以便您可以查看数据,您可以使用:

Set Me.Recordset = rs
于 2014-04-25T17:39:03.283 回答
1

这似乎效率不高,但它正在工作并且有点令人满意:

DoCmd.RunSQL "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS " & _
     "WHERE TABLE_NAME = 'tv') DROP VIEW tv"
DoCmd.RunSQL "create view tv as " & txtQry
DoCmd.OpenView "tv"

在这里,我在按钮的单击事件中创建了一个临时视图(电视)。在创建视图之前,我正在检查是否存在同名的视图;如果存在,则将其删除,以便可以使用不同的查询创建具有相同名称的新视图。

于 2014-04-26T04:13:00.243 回答
0

这是我想要的工作方式:

Dim frm As Form  ' create a form dynamically
Set frm = CreateForm
Dim rs As New ADODB.Recordset
rs.Open Replace(txtQry, vbCrLf, " "), CurrentProject.Connection  ' replace "enters" (vbCrLf) with space because it was throwing error while executing query!
Dim c As Control
For Each f In rs.Fields
    Set c = CreateControl(frm.Name, IIf(f.Type = 11, acCheckBox, acTextBox))  ' if field type is "bit", add checkbox; for other datatypes, add textbox
    c.ControlSource = f.Name
    c.Name = f.Name  ' sets column header to the same name as of field's name
Next
rs.Close
frm.RecordSource = txtQry
DoCmd.OpenForm frm.Name, acFormDS  ' open form in "DataSheet" view otherwise it will be in "Form" view

此代码放置在按钮的单击事件中。

rs.Fields(x).Type(这里, ) 的其他可能的数据类型f.Type是 (3 = int, 200 = varchar)

于 2014-04-30T06:54:05.563 回答