Sql server MS Access提供#名称?在某些情况下,SQL SP馈送表单出错

Sql server MS Access提供#名称?在某些情况下,SQL SP馈送表单出错,sql-server,vba,ms-access,ms-access-forms,Sql Server,Vba,Ms Access,Ms Access Forms,我正在调用一系列SP来填充我的访问表单。这些都是沿着同一代码行调用的,这是典型的: 公共子cssLoadAllJobs(长为lngCID,格式为frm) '请参阅cssLoadClient下的方法和说明 将rst设置为新ADODB.Recordset 用rst Set.ActiveConnection=gcn .Source=“EXEC mysp_ActiveJobsForClient”&Nz(lngCID)”使用参数运行sp .LockType=adlockType .CursorType=a

我正在调用一系列SP来填充我的访问表单。这些都是沿着同一代码行调用的,这是典型的:

公共子cssLoadAllJobs(长为lngCID,格式为frm)
'请参阅cssLoadClient下的方法和说明
将rst设置为新ADODB.Recordset
用rst
Set.ActiveConnection=gcn
.Source=“EXEC mysp_ActiveJobsForClient”&Nz(lngCID)”使用参数运行sp
.LockType=adlockType
.CursorType=adOpenKeyset
打开
以
设置frm。记录集=rst
设置rst=无
端接头
这些都很好,没有问题

然而,在我的主窗体上,我正在依次加载其中的一些内容,如客户端、站点和作业

对于这些作业,我有两个不同的SP。一个是按客户端过滤,然后按站点过滤,然后按此站点上的设备过滤。另一个仅由客户端过滤

现在发生的事情是,如果我将一个带有大量过滤器的窗体加载到主窗体中,主窗体工作正常。但是,如果仅加载按客户端筛选的作业,则主窗体将在所有客户端记录字段上抛出
#Name?
,并且作业子窗体字段也将全部发送到
#Name?

考虑到这应该很容易诊断,我注释掉了加载作业子窗体的行,一切都很好。如果我为完整的过滤子表单添加代码,那么主表单工作正常

不要被打败,毕竟这一定是一个简单的错误,我制作了一个作业子表单的副本,并用“仅按客户端筛选”加载它,它显示了准确的记录,没有问题

为了使这一点更加清楚:

  • SP1=按客户端筛选
  • SP2=按客户过滤,按现场过滤,按设备过滤

  • 带SP2工程的主窗体

  • 带有SP1
    #Name?

  • 表单SP1工作时加载子表单

  • 表单SP2工作时加载子表单

我想一个简单的测试是创建一个新的子表单并交换它们,但是…为什么呢?

不要将ADODB对象
声明为新的
,这会使它们自动实例化。在程序末尾添加“代码> Debug .Read PrimeRST为“< < /代码>”,您将看到为什么。请考虑使用<代码> ADODB。命令< /代码>,并使用实际的<代码> ADODB。参数< /代码>,而不是将可执行SQL语句部分拼接在一起——这是一个非常常见的错误原因,并且它是一个严重的安全漏洞。有关更多信息,请参阅“SQL注入攻击”。但为什么还要费心编写这些额外的代码呢?只需将访问表单绑定到链接表。如果您使用where子句(如“ID=”&lnCID)打开表单,那么Access将获得相同的性能,并且不需要所有额外的代码和工作(在这里尝试拯救世界贫困)。与简单的链接表相比,使用该存储过程并不能获得更好的性能。这个简单链接的表允许表单无需额外编码即可更新表。所以,我们根本不清楚为什么要使用存储过程和所有这些额外的工作。通过这种方法,加载时间缩短了15秒。我明白他们在说什么。但它不能满足这种特殊的需要。