Ошибка Excel VBA/SQL в Sharepoint «Не удается обновить. База данных или объект доступны только для чтения»

Я использую 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;"";"

Я надеюсь, что любой из вас может помочь мне решить эту проблему

Нет, вообще пробовал с разных пользователей/компьютеров и получаю ту же ошибку

JustGreat 01.02.2023 18:43

Если ThisWorkbook.FullName - это HTTP-путь, я не думаю, что вы сможете установить соединение

Tim Williams 01.02.2023 18:49

Я запускаю только SQL Select, код моего sql-запроса выше, что касается имени файла, если я запускаю его из точки доступа, логически полное имя будет выглядеть так: mysharepoint/myexcelfile.xlsm (есть ли вообще для есть что-то еще?) что мне попробовать?

JustGreat 01.02.2023 18:54

См. google.com/… подобные предыдущие сообщения здесь. Есть предложения, связанные с созданием пути UNC из URL-адреса HTTP, но я никогда не добился успеха с ними (в основном любые предложения, связанные с DavWWWRoot, похоже, не работают). Если папка синхронизирована на вашем локальном ПК, есть способы получить локальный путь, но все это намного сложнее, чем доступ к Excel в локальной файловой системе или из сетевой папки.

Tim Williams 01.02.2023 19:06

Я могу синхронизировать с помощью Office 365, но я не уверен, что то, что вы говорите, является проблемой, потому что я уже видел, прежде чем публиковать сообщения, что слишком много пользователей решают свою проблему, изменяя строку подключения, почему в моем случае это не будет работать на sharepoint а у других получилось?

JustGreat 01.02.2023 19:45

Можете ли вы указать конкретный пример сообщения, где это сработало? Доступ к файлу через HTTP полностью отличается от доступа к файлу на локальном диске.

Tim Williams 01.02.2023 20:15

вот объяснение, но он говорит о диске, но даже если я использую синхронизацию, чтобы связать мой файл точек доступа с OneDrive, thisworkbook.filename возвращает ссылку http stackoverflow.com/questions/55794161/…

JustGreat 02.02.2023 15:22

вот несколько вопросов, если вы или кто-то другой можете ответить, плз. Итак, для вас невозможно использовать файл excel на sharepoint, если он использует SQL? Я хорошо понял? Вы сказали, что проблема в моем коде связана с «ThisWorkbook.FullName», который возвращает ссылку https, верно? есть ли способ изменить «ThisWorkbook.FullName» на что-то другое?

JustGreat 02.02.2023 15:23

Последний вопрос, как вы видите, я использую только выбор без обновлений, так зачем ему нужно больше прав? Я не использую вставку или обновление, мой выбор sql указан выше, в чем проблема, это только инструкция только для чтения, так почему я получаю сообщение об ошибке?

JustGreat 02.02.2023 15:24

Я думаю, что сообщение об ошибке, которое вы получаете, является отвлекающим маневром - речь идет не об обновлении/отсутствии обновления, а о HTTP и обычном доступе к диску. Драйвер, который вы используете, просто не работает через HTTP. Если вам нужен обходной путь, сохраните копию файла в локальную папку Temp: тогда вы сможете без проблем использовать подход SQL-запросов.

Tim Williams 02.02.2023 17:46

Спасибо за ваш комментарий. Проблема в том, что я хочу, чтобы на sharepoint работа была разделена между 4 людьми. Если я сохраню ее локально, я потеряю это преимущество. Как вы думаете, могу ли я изменить что-то в своем соединении, чтобы сообщить, что мне нужна база данных только для чтения, поэтому, возможно, в этом случае я не получу ошибку? может быть, мое соединение запрашивает разрешения на запись, поэтому я получаю сообщение об ошибке, даже если не использую вставку или обновление? Что вы думаете ?

JustGreat 02.02.2023 21:12

Это совершенно не связано с чтением и записью. Этот драйвер вообще не работает через HTTP, и я не знаю ни одного, который работает.

Tim Williams 02.02.2023 23:02

Итак, это не связано с самим моим кодом, это просто вопрос драйверов, которые не предназначены для работы с ссылками на sharepoint, я должен попытаться подключить локальный диск и попробовать его, верно?

JustGreat 03.02.2023 00:51

@TimWilliams спасибо, я решил свою проблему и опубликовал ответ, спасибо, что вы единственный, кто пытался помочь, и ваш комментарий был очень полезен для решения моей проблемы.

JustGreat 09.02.2023 18:30
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
14
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение своей проблемы, поэтому публикую ответ, потому что он может помочь кому-то еще, тем более, что никто не дал мне ответа. Исходя из комментариев Тима Вильямса, я понял, что проблема не в самом моем коде, а в ThisWorkbook.Fullname, который возвращает ссылку https шарепойнта, а не локального диска. Таким образом, я искал и закончил, найдя решение для преобразования Http на локальный диск на основе решения здесь: Я выбрал Решение 2 — Автономная функция (работает в Windows и macOS) Свойство полного имени Excel с OneDrive

В то же время мне пришлось сопоставить диск моей точки доступа, используя метод, предложенный Microsoft:

https://support.microsoft.com/en-us/office/map-a-network-drive-to-a-sharepoint-library-751148de-f579-42f9-bc8c-fcd80ccf0f53

Объединив оба, я решил свою проблему.

Спасибо всем, кто прочитал этот вопрос, даже если не смог помочь мне, и спасибо Тиму Уильямсу.

Рад видеть, что вы нашли решение!

Tim Williams 09.02.2023 18:40

еще раз спасибо, вы были единственным, кто помог и указал мне правильное направление, до вашего комментария я был сосредоточен на поиске реальной ошибки в моем коде/логике/разрешениях

JustGreat 09.02.2023 19:29

Другие вопросы по теме