Sql OLEDB连接没有刷新日期

Sql OLEDB连接没有刷新日期,sql,excel,vba,oledb,Sql,Excel,Vba,Oledb,我需要通过编程检查Excel到SQL表和视图中许多OLEDB数据连接的刷新日期。它们都以相同的方式配置并使用相同的连接字符串,我正在VBA中使用以下方法检查它们: Connections.OLEDBConnection.RefreshDate 然而,其中一些连接没有刷新日期,我并不是说RefreshDate属性返回NULL,该属性甚至不存在。VBA抛出和“应用程序定义或对象定义错误”,当我检查连接属性时,“上次刷新”字段为空: 无论我如何构建连接或刷新连接多少次,与这些特定SQL表和视图的连

我需要通过编程检查Excel到SQL表和视图中许多OLEDB数据连接的刷新日期。它们都以相同的方式配置并使用相同的连接字符串,我正在VBA中使用以下方法检查它们:

Connections.OLEDBConnection.RefreshDate
然而,其中一些连接没有刷新日期,我并不是说RefreshDate属性返回NULL,该属性甚至不存在。VBA抛出和“应用程序定义或对象定义错误”,当我检查连接属性时,“上次刷新”字段为空:


无论我如何构建连接或刷新连接多少次,与这些特定SQL表和视图的连接都是一致的。我一直在使用OLEDB,而且我们的一些机器与Power Query存在兼容性问题。有人知道是什么导致了这种情况,或者我需要在Excel或SQL中更改什么吗?

我还没有找到令人满意的解决方案,但如果您迫切需要知道连接是否已更新,这可能会对您有所帮助。这也可能取决于您的连接类型。免责声明此解决方案与其说是专业的解决方案,不如说是黑客的解决方案,但似乎一直有效到现在。计划如下:

1虚拟显示器 在工作表中显示连接中的一段数据。此工作表
Sheet1
可能是
隐藏的
非常隐藏的
。没关系

2活动 修改
工作表\u Change
事件,如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)
RefreshDate (Now())
End Sub
3模 除此之外,您还需要一个模块,该模块提供存储和访问另一张工作表上的
RefreshDate
属性的功能。您可能希望使用存储在
Thisworkbook
属性中的对象执行此操作,但据我所知,这并不是从销毁中保存的

代码如下:

Sub RefreshDate(D As Date)
Sheet2.Range("A1").Value = D
End Sub

Public Function GetRefreshDate() As Date
GetRefreshDate = Sheet2.Range("A1").Value
End Function
4冲洗并重复所有连接 现在,您需要对所有不能使用
RefreshDate
的连接执行此操作。您可能希望将所有日期保存在一个工作表中,并且每个连接都有一个工作表

这个解决方案难看吗?是的。它有用吗?是的

基本思想如下:每次连接刷新时,工作表都会更改,这将触发事件:
工作表\u更改
现在您可以保存日期以便以后访问。


如果在刷新连接时找到其他方法来访问事件,那么这也应该起到作用。如果您找到其他方法来保存
RefreshDate
,它就会起作用

如果未填写
刷新日期
,则可能是您运气不好

作为一种解决方法,您可以自己跟踪刷新。起始点是表的
afterRefresh
-事件。为此,您必须将以下代码添加到
工作簿
-模块中(不适用于常规模块,因为带有事件的
需要

选项显式
Private WithEvents表为Excel.QueryTable
刷新后的私有子表_(ByVal Success作为布尔值)
Debug.Print table.WorkbookConnection.name&“刷新”(成功:“&success&”)
如果成功的话
调用trackRefreshDate(table.WorkbookConnection.name,现在)
如果结束
端接头
现在,您只需要一个逻辑来保存刷新事件。在我的示例中,我将其保存为工作簿级别的名称,当然您也可以将其保存在(隐藏)工作表中。将其放入常规模块:

子trackRefreshDate(表名为字符串)
Dim nameObj作为名称,nName作为字符串
Set nameObj=Nothing
nName=“刷新”&tableName
出错时继续下一步
'检查名称是否已存在
Set nameObj=ThisWorkbook.Names(nName)
错误转到0
暗v
v=格式(现在为“dd.mm.yyyy hh:mm:ss”)
如果nameObj什么都不是,那么
'否:创建新的
调用此工作簿。名称。添加(nName,v)
其他的
nameObj.Value=v
如果结束
端接头
函数getRefreshDate(表名为字符串)
把我当作绳子
nName=“刷新”&tableName
出错时继续下一步
getRefreshDate=Replace(Mid(ThisWorkbook.Names(nName),2),“”,“”)
错误转到0
端函数

为什么不简单地在您连接到的SQL源中添加一列(无论是视图还是过程)?。在那里添加列
refreshttime=GETDATE()
。每次用户从SQL中提取数据时,返回的结果中都有
refreshttime

如果用户刷新SQL源时需要存储信息,也可以在SQL数据库中存储信息。生成存储过程:

create stored procedure ShareMySource as
-- part one, prepare data
select * from MySQLTable;

-- part two, get user data
insert into dbo.LogBook
select 
RefreshTime=getdate(), 
User = ORIGINAL_LOGIN()

必须首先创建表日志。

没有显示此信息的连接有什么共同点?我能够复制此行为,因此这可能不是您的问题。如果他有权访问其源,这当然是可能的。有时您没有权限或访问源。例如,如果您使用外部源。但如果您没有访问外部源的权限,则无法刷新。但您仍然可以看到具有访问权限的人上次为您刷新该源的时间。