Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 通过VBA设置窗体的记录集也就是设置其记录源_Sql Server_Vba_Ms Access - Fatal编程技术网

Sql server 通过VBA设置窗体的记录集也就是设置其记录源

Sql server 通过VBA设置窗体的记录集也就是设置其记录源,sql-server,vba,ms-access,Sql Server,Vba,Ms Access,我有一个连接到SQLAzure后端的Access 2010数据库是的,我知道这并不理想,而且它正在慢慢地被淘汰。在后端,我有一个存储过程,希望在每次加载新记录时使用该存储过程填充只读子窗体。我试图通过在VBA中生成一个记录集,然后设置子窗体的记录集属性来实现这一点。它确实有效,但有一个令人讨厌的副作用 当我设置RecordSet属性时,它似乎也在设置子窗体的RecordSource属性。RecordSource是Access无法解析的,因为它是对后端的调用。如果尝试使用DAO直通查询生成记录集,

我有一个连接到SQLAzure后端的Access 2010数据库是的,我知道这并不理想,而且它正在慢慢地被淘汰。在后端,我有一个存储过程,希望在每次加载新记录时使用该存储过程填充只读子窗体。我试图通过在VBA中生成一个记录集,然后设置子窗体的记录集属性来实现这一点。它确实有效,但有一个令人讨厌的副作用

当我设置RecordSet属性时,它似乎也在设置子窗体的RecordSource属性。RecordSource是Access无法解析的,因为它是对后端的调用。如果尝试使用DAO直通查询生成记录集,则记录源如下所示:

EXEC dbo.GetDuplicateAddressesByManufacturer N'...', N'...', N'...'
{ call dbo.GetDuplicateAddressesByManufacturer ?, ?, ? }
如果我尝试使用ADO命令生成记录集,它看起来像:

EXEC dbo.GetDuplicateAddressesByManufacturer N'...', N'...', N'...'
{ call dbo.GetDuplicateAddressesByManufacturer ?, ?, ? }
当我尝试移动到下一条记录时,Access就会抛出一个错误,因为它试图首先为子窗体加载一条新记录,并且无法打开它所看到的子窗体的记录源。如果我尝试DAO路由,它会告诉我SQL语句无效,如果我使用ADO,它会告诉我数据提供程序无法初始化

有人知道我该怎么解决这个问题吗?难道没有一种方法可以在不设置记录源的情况下设置记录集属性吗?我可以发誓我以前做过,但也许我从来没有注意到记录源也被设置过

如果做不到这一点,是否可以在Form_Current事件之前插入一些代码来删除子窗体的RecordSource?每次我用来设置记录集的代码都非常有效——问题是在我的代码工作之前出现的错误。一旦我消除了错误消息,一切正常,但显然我不希望用户每次更改记录时都收到错误消息


如果所有其他方法都失败了,我想我总是可以使用查询来填充本地临时表,但是每次有人移动到新记录时,似乎都要花费大量的开销。

为什么要费心使用存储过程呢?只需将子表单链接到表,并设置链接主/子设置。您只需要下拉所需的记录

如果子表单是一个包含多个表的复杂查询,那么您肯定希望数据联接等发生在服务器端,然后再次简单地创建一个视图,并再次将子表单源设置为该视图,链接主/子设置将再次为您完成所有的脏活

并且没有理由不能创建传递查询并简单地将其分配给forms recordSource

在查询中放置什么“垃圾”并不重要,这包括原始的T-SQL

虽然您可以用这个通行证思想加载DAO reocrdset,但实际上不需要这样做。我想,出于某种高兴的原因,您正在这样做,至少如果您必须这样做,那么RecordsRouce将成为传递的名称,而不是原始的T-SQL

但是,实际上,只需转储所有记录集垃圾,然后继续:

Me.MySubForm.Form.RecordSource = "my pass though query". 
因此,上面只有一行

你这么做是为了提高性能,那么在一天结束时,为什么你的主窗体允许导航?您应该构建一个搜索屏幕,显示结果,让用户选择一行,然后启动主窗体来编辑/显示一条记录以及子窗体数据

当它们关闭时,它们将返回搜索下一个客户等。这种方法也因此解决了您混乱的导航问题。这也解释了为什么web和大多数软件以这种方式工作--它减少了带宽问题

但是,如果您必须具有导航功能,并且由于某种原因无法使用视图,并且无法让Access使用链接主/子设置来执行脏工作,您会这样做吗

然后,在“当前事件窗体”中,您可以修改传递并将其重新分配给子窗体

 Me.MySubForm.Form.RecordSource = above
例如:

现在,在上面的例子中,我是如何在传递查询中使用原始T-SQL的,然后简单地将传递分配给窗体recordsource(在您分配给子窗体的情况下)

 Me.MySubForm.Form.RecordSource = above
没有理由说上面的.SQL不能作为存储过程

.SQL = "Exec your-storedProcedure " & strVbaStringParmater
然后再次指定窗体或子窗体recordSource


因此,您真的不需要在代码中创建一些reocrdset,它不会给您带来任何性能提升,但会导致您编写更多的代码,并出现您在文章中概述的问题。

谢谢,Albert。我需要导航和存储过程是有原因的,但是当我回到电脑前时,我会尝试使用querydef方法。