Я использую ACE.OLEDB внутри Excel для запуска sql и использую свои листы, как если бы они были базой данных. На локальном диске моего ПК все работает отлично, но как только я загружаю файл в Sharepoint и запускаю его оттуда, я получаю следующую ошибку:
номер ошибки: -2147467259 Описание ошибки: «Невозможно обновить. База данных или объект доступны только для чтения».
Я проверил в сети и нашел, что некоторые люди решают эту проблему, изменяя свою строку подключения и добавляя IMEX=1 в расширенные свойства. Я пробовал некоторые предложения, но это не сработало, может быть, я не понял, поэтому мне нужна ваша помощь. Кстати, я делаю только Select с моим SQL (не Insert), поэтому я не знаю, почему ему нужно больше, чем разрешения только для чтения (если кто-нибудь из вас может мне это объяснить), и если вручную я попытаюсь создать файл или папку в Sharepoint у меня нет проблем с этим, поэтому я не думаю, что это проблема Sharepoint.
Вот остальные части кода, которые могут вас заинтересовать, чтобы помочь мне.
Я готовлю свой sql-запрос и вызываю OpenRecordset, который вызывает функцию GetConnection.
sql = "SELECT Distinct Offres FROM ['" & sMySheet & "$'] WHERE Domaine IS NOT NULL AND Domaine = '" & sTempDomaine & "';"
Set rst = OpenRecordset(sql)
Приведенная выше строка вызовет функцию OpenRecordset с запросом sql.
Public Function OpenRecordset(sql As String) As Object
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1
Set OpenRecordset = CreateObject("ADODB.Recordset")
OpenRecordset.Open sql, GetConnection(), adOpenStatic, adLockOptimistic, adCmdText
End Function
Затем OpenRecordset вызовет GetConnection, и здесь я получаю сообщение об ошибке.
Private Function GetConnection() As Object
Dim m_Connection As Object
If m_Connection Is Nothing Then
Set m_Connection = CreateObject("ADODB.Connection")
'Error at the following line
m_Connection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source = " & ThisWorkbook.FullName & ";Extended Properties = ""Excel 12.0;HDR=Yes;"";"
End If
Set GetConnection = m_Connection
End Function
Я получаю ошибку именно в строке кода:
m_Connection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source = " & ThisWorkbook.FullName & ";Extended Properties = ""Excel 12.0;HDR=Yes;"";"
Я надеюсь, что любой из вас может помочь мне решить эту проблему
Если ThisWorkbook.FullName
- это HTTP-путь, я не думаю, что вы сможете установить соединение
Я запускаю только SQL Select, код моего sql-запроса выше, что касается имени файла, если я запускаю его из точки доступа, логически полное имя будет выглядеть так: mysharepoint/myexcelfile.xlsm (есть ли вообще для есть что-то еще?) что мне попробовать?
См. google.com/… подобные предыдущие сообщения здесь. Есть предложения, связанные с созданием пути UNC из URL-адреса HTTP, но я никогда не добился успеха с ними (в основном любые предложения, связанные с DavWWWRoot
, похоже, не работают). Если папка синхронизирована на вашем локальном ПК, есть способы получить локальный путь, но все это намного сложнее, чем доступ к Excel в локальной файловой системе или из сетевой папки.
Я могу синхронизировать с помощью Office 365, но я не уверен, что то, что вы говорите, является проблемой, потому что я уже видел, прежде чем публиковать сообщения, что слишком много пользователей решают свою проблему, изменяя строку подключения, почему в моем случае это не будет работать на sharepoint а у других получилось?
Можете ли вы указать конкретный пример сообщения, где это сработало? Доступ к файлу через HTTP полностью отличается от доступа к файлу на локальном диске.
вот объяснение, но он говорит о диске, но даже если я использую синхронизацию, чтобы связать мой файл точек доступа с OneDrive, thisworkbook.filename возвращает ссылку http stackoverflow.com/questions/55794161/…
вот несколько вопросов, если вы или кто-то другой можете ответить, плз. Итак, для вас невозможно использовать файл excel на sharepoint, если он использует SQL? Я хорошо понял? Вы сказали, что проблема в моем коде связана с «ThisWorkbook.FullName», который возвращает ссылку https, верно? есть ли способ изменить «ThisWorkbook.FullName» на что-то другое?
Последний вопрос, как вы видите, я использую только выбор без обновлений, так зачем ему нужно больше прав? Я не использую вставку или обновление, мой выбор sql указан выше, в чем проблема, это только инструкция только для чтения, так почему я получаю сообщение об ошибке?
Я думаю, что сообщение об ошибке, которое вы получаете, является отвлекающим маневром - речь идет не об обновлении/отсутствии обновления, а о HTTP и обычном доступе к диску. Драйвер, который вы используете, просто не работает через HTTP. Если вам нужен обходной путь, сохраните копию файла в локальную папку Temp
: тогда вы сможете без проблем использовать подход SQL-запросов.
Спасибо за ваш комментарий. Проблема в том, что я хочу, чтобы на sharepoint работа была разделена между 4 людьми. Если я сохраню ее локально, я потеряю это преимущество. Как вы думаете, могу ли я изменить что-то в своем соединении, чтобы сообщить, что мне нужна база данных только для чтения, поэтому, возможно, в этом случае я не получу ошибку? может быть, мое соединение запрашивает разрешения на запись, поэтому я получаю сообщение об ошибке, даже если не использую вставку или обновление? Что вы думаете ?
Это совершенно не связано с чтением и записью. Этот драйвер вообще не работает через HTTP, и я не знаю ни одного, который работает.
Итак, это не связано с самим моим кодом, это просто вопрос драйверов, которые не предназначены для работы с ссылками на sharepoint, я должен попытаться подключить локальный диск и попробовать его, верно?
@TimWilliams спасибо, я решил свою проблему и опубликовал ответ, спасибо, что вы единственный, кто пытался помочь, и ваш комментарий был очень полезен для решения моей проблемы.
Я нашел решение своей проблемы, поэтому публикую ответ, потому что он может помочь кому-то еще, тем более, что никто не дал мне ответа. Исходя из комментариев Тима Вильямса, я понял, что проблема не в самом моем коде, а в ThisWorkbook.Fullname, который возвращает ссылку https шарепойнта, а не локального диска. Таким образом, я искал и закончил, найдя решение для преобразования Http на локальный диск на основе решения здесь: Я выбрал Решение 2 — Автономная функция (работает в Windows и macOS) Свойство полного имени Excel с OneDrive
В то же время мне пришлось сопоставить диск моей точки доступа, используя метод, предложенный Microsoft:
Объединив оба, я решил свою проблему.
Спасибо всем, кто прочитал этот вопрос, даже если не смог помочь мне, и спасибо Тиму Уильямсу.
Рад видеть, что вы нашли решение!
еще раз спасибо, вы были единственным, кто помог и указал мне правильное направление, до вашего комментария я был сосредоточен на поиске реальной ошибки в моем коде/логике/разрешениях
Нет, вообще пробовал с разных пользователей/компьютеров и получаю ту же ошибку