Как использовать относительный путь в SQL — ODBC?

#sql #excel #ms-access #odbc

#sql #excel #ms-access #odbc

Вопрос:

У меня проблема с Excel (ODBC / Access). Я хотел бы обновить данные из любой папки на моем компьютере. У меня есть файл, который я использую с рабочего стола, но я хотел бы обновить данные из того же файла, когда они будут перенесены в документы и т.д. Пожалуйста, не могли бы вы указать, что я должен делать?

У меня есть подключение к файлу, как показано ниже:

DSN=Excel Files;DBQ=C:UsersUserDesktopTask1SalesBudget2018.xlsx;DefaultDir=C:UsersUserDesktopTask1;DriverId=1046;MaxBufferSize=2048;PageTimeout=5;

Спасибо.

ПРАВКА1: Спасибо. Я попытался использовать ваше решение и получил сообщение об ошибке: «ошибка времени выполнения 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=" amp; Path amp; "SalesBudget2018.xlsx" amp; ";" amp; "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 amp; RunSELECT(0) amp; ";" amp; RunSELECT(1) amp; ";" amp; RunSELECT(2) amp; vbNewLine
   Debug.Print RunSELECT(0); ";" amp; RunSELECT(1) amp; ";" amp; RunSELECT(2)
   rs.Movenext
Loop Until rs.EOF
    
End Sub
  

Ответ №1:

Ваш путь на самом деле совсем не относительный. Но ACE / JET data engine в любом случае не поддерживает относительные пути. Относительный путь будет

Datamydb.mdb

Итак, выше будет одна папка с именем data из текущего местоположения. И одна папка с использованием relative будет:

..Datamydb.mdb

Однако с ACE / Access относительные пути не поддерживаются. Однако, что мы делаем, когда хотим, чтобы программное обеспечение работало, скажем, из текущей папки? Мы просто получаем и используем полное имя пути при запуске приложения. Итак, вы можете получить / захватить текущую папку. В Excel VBA вы можете использовать это:

 ActiveWorkbook.Path
  

Итак, выше будет указан текущий путь. И, таким образом, вы используете это в коде для установки строки подключения. Итак, даже в access, если мы хотим, чтобы программное обеспечение работало в любой папке? Мы просто получаем / захватываем полное имя пути при запуске. В результате программное обеспечение работает в любой папке, и вы эффективно получаете относительный адрес, поскольку вам «все равно», где находится программное обеспечение, поскольку вы всегда получаете / сохраняете полное имя пути в любом случае. Итак, с помощью вышесказанного вы могли бы добавить имя папки с именем data

 ActiveWorkbook.Path amp; "DataMydb.accdb"
  

Итак, из текущего расположения книги у вас всегда может быть папка с именем data, а внутри этой папки у вас может быть ваша база данных. Итак, фактически вы получаете относительную адресацию, но вы всегда указываете полное имя пути к текущей книге, как указано выше.
Конечный результат заключается в том, что вы не пропустите отсутствие какой-либо формы относительной адресации, поскольку вам не нужно использовать этот подход.

вышесказанное для Excel VBA. Чтобы получить текущий путь из Access VBA? Вы можете использовать это:

 currentproject.Path
  

Итак, ваша строка подключения к Excel может быть такой:

 dim strExcelPath   as string
strExcelPath = CurrentProject.Path amp; "Task1SalesBudget2018.xlsx"
  

Неясно, находится ли приложение access в ТОЙ же папке, что и task1?
Предполагая, что да, тогда это сработает:

 strExcelPath = CurrentProject.Path amp; "SalesBudget2018.xlsx"
  

Итак, теперь папка может находиться на рабочем столе, мои документы — это не будет иметь значения. Таким образом, вы можете использовать вышеуказанное как часть строки подключения. Неясно, ссылаетесь ли вы на Excel (связанную таблицу) или используете VBA и говорите код ADO. Однако на самом деле это не имеет значения. При запуске приложения вы получаете приведенную выше строку подключения, сверьте ее со связанной таблицей — если то же самое, то ничего не делайте. Если отличается, то вы повторно связываете эту таблицу. Таким образом, вы повторно связываете только один раз, если папка была перемещена. И не имеет значения, куда вы перемещаете папку? Пока вы предполагаете, что лист Excel находится в той же папке, что и приложение Access, тогда все готово. И, как уже отмечалось, вы могли бы добавить подпапку, скажем, ExcelSheets, в указанную выше. И еще раз, независимо от того, куда вы перемещаете эту папку с помощью части Access, пока подпапка находится в том же каталоге / папке, это будет работать, несмотря на то, что у вас нет относительной адресации.

Комментарии:

1. Привет, пожалуйста, не могли бы вы проверить мой «Edit1» под вопросом? Ваше решение работает, спасибо, но я получил другую ошибку и не уверен, как с ней справиться.

2. ActiveWorkbook. у path НЕТ конечного , поэтому insterrev вернет 0 — вы отключаете имя пути.