如何在SQL-ODBC中使用相对路径?

问题描述

我对Excel(ODBC / Access)有问题。我想刷新计算机中任何文件夹中的数据。我有从台式机使用的文件,但是当要移至文档等时,我想从同一文件刷新数据。请提供我该怎么做?

我的文件连接如下:

DSN=Excel Files;DBQ=C:\Users\User\Desktop\Task1\SalesBudget2018.xlsx;DefaultDir=C:\Users\User\Desktop\Task1;DriverId=1046;MaxBufferSize=2048;PageTimeout=5;

谢谢。

EDIT1:谢谢。我尝试使用您的解决方案,但收到以下错误:“运行时错误2147467259数据库或对象是只读的”。该错误与“ .Open”行有关:

Sub RefreshData()

Dim CreateNew As Object
Dim RunSELECT As Object
Dim Data As String
Dim sql As String

FolderPath = ActiveWorkbook.path

Path = Left(FolderPath,InStrRev(FolderPath,"\") - 1)

Set CreateNew = CreateObject("ADODB.Connection")
With CreateNew
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "Data Source=" & Path & "\SalesBudget2018.xlsx" & ";" & "Extended Properties=""Excel 12.0 Xml;HDR=YES;"";"
    .Open
End With

'Run sql

sql = "SELECT * FROM [twRynki$]"
Set RunSELECT = cn.Execute(sql)
Do
   output = output & RunSELECT(0) & ";" & RunSELECT(1) & ";" & RunSELECT(2) & vbNewLine
   Debug.Print RunSELECT(0); ";" & RunSELECT(1) & ";" & RunSELECT(2)
   rs.Movenext
Loop Until rs.EOF
    
End Sub

解决方法

您的路径实际上根本不是相对的。但是ACE / JET数据引擎仍然不支持相对路径。 相对路径是

\ Data \ mydb.mdb

因此,上面是一个文件夹,该文件夹称为当前位置的数据。而使用relative的一个文件夹为:

.. \ Data \ mydb.mdb

但是,使用ACE / Access不支持相对路径。但是,当我们希望软件能够从当前文件夹运行时该怎么办?我们简单地获取并在应用程序启动时使用完整路径名。因此,您可以获取/获取当前文件夹。在Excel VBA中,您可以使用以下方法:

ActiveWorkbook.Path

因此,上面将为您提供当前路径。因此,您可以在代码中使用它来设置连接字符串。因此,即使是在访问中,我们是否也希望软件可以在任何文件夹中运行?我们只需在启动时获取/获取完整路径名即可。结果,该软件可以在任何文件夹中工作,并且您可以“相对不在乎”放置软件的位置,因此可以有效地获得相对地址,因为无论如何总会获得/获取完整路径名。因此,在上面,您可以添加一个名为data的文件夹名称

ActiveWorkbook.Path & "\Data\Mydb.accdb"

因此,从当前工作簿位置开始,您始终可以拥有一个名为data的文件夹,并且在该文件夹中您可以拥有数据库。因此,实际上,您确实获得了相对寻址,但是您总是按照上述方法获取当前工作簿的完整路径名。 最终结果是您不会错过某种形式的相对寻址,因为您不需要这种方法。

以上内容适用于Excel VBA。要从Access VBA获取当前路径?您可以使用:

currentproject.Path

因此,您与Excel的连接字符串可能是这样:

dim strExcelPath   as string
strExcelPath = CurrentProject.Path & "\Task1\SalesBudget2018.xlsx"

不清楚访问应用程序是否作为task1位于SAME文件夹中? 假设是,那么这将起作用:

strExcelPath = CurrentProject.Path & "\SalesBudget2018.xlsx"

因此,现在该文件夹可以在桌面上了,即我的文档-没关系。因此,您可以将以上用作连接字符串的一部分。不清楚是链接到Excel(链接表),还是使用VBA并说出ADO代码。但是,这并不重要。在应用程序启动时,您将获得上述连接字符串,并根据链接表进行检查-如果相同,则不执行任何操作。如果不同,则重新链接该表。因此,如果文件夹已移动,则仅重新链接一次。而且无论您将文件夹移到哪里?只要您假定Excel工作表与Access应用程序位于同一文件夹中,那么您就可以进行了。如前所述,您可以在上面添加一个子文件夹,例如ExcelSheets。再一次,无论您将文件夹与Access部件一起移到何处,只要子文件夹位于相同的目录/文件夹中,那么即使您没有相对寻址,也可以使用。