sql - 如何在 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 数据引擎无论如何都不支持相对路径。相对路径将是
\数据\mydb.mdb
因此,上面将是一个文件夹,称为当前位置的数据。使用 relative 向下的一个文件夹是:
..\数据\mydb.mdb
但是,ACE/Access 不支持相对路径。但是,当我们希望软件从当前文件夹中运行时,我们会怎么做?我们在 APPLICATION 启动时简单获取并使用全路径名。因此,您可以获取/获取当前文件夹。在 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 在同一个文件夹中?假设是,那么这将起作用:
strExcelPath = CurrentProject.Path & "\SalesBudget2018.xlsx"
所以,现在文件夹可以在桌面上,我的文档——没关系。因此,您可以将上述用作连接字符串的一部分。不清楚您是链接到 Excel(链接表),还是使用 VBA 并说 ADO 代码。不过,真的没关系。在应用程序启动时,您会得到上面的连接字符串,对照链接表检查它——如果相同则什么也不做。如果不同,则重新链接该表。因此,如果文件夹被移动,您只需重新链接一次。无论您将文件夹移动到哪里?只要您假设 Excel 工作表与访问应用程序位于同一文件夹中,那么您就可以开始了。如前所述,您可以在上面添加一个子文件夹,例如 ExcelSheets。再一次,无论您将这个文件夹与 Access 部分一起移动到哪里,只要子文件夹在同一个目录/文件夹中,
推荐阅读
- routes - Quartus 拥塞解决方案
- node.js - 反应静态构建错误:ERR_REQUIRE_ESM 或 ReferenceError:未定义窗口
- arrays - 如何在 Swift 中动态地将项目添加到类类型的数组中
- swift - 包含 @State 属性的 ScrollView 会导致滚动出现故障 - SwiftUI
- java - @Value 没有在 SpringBoot 测试上下文中注入
- proxy - RabbitMq localhost:15672 启用管理插件后无法访问
- python-3.x - 如何在 pyttsx3 中使用 OpenCV
- spring-boot - Spring boot keycloak dockerization 不起作用:无法从 http://localhost:8180/auth/realms/heroes/.well-known/openid-configuration 加载 URL
- node.js - 如何在节点中启动柴测试?
- javascript - saveas 函数的 node.js 文件保护程序问题