Запрос SQL для файла, доступного только для чтения Excel, не использует актуальную версию файла - PullRequest
0 голосов
/ 09 ноября 2018

Я использую ADODB (в Excel) для выполнения запроса SQL на два файла Excel: файл A (.xlsb) и файл B (.xlsm). Этот запрос выполняется из файла B. Код запускается и выполняет первый запрос в файле A довольно легко! Однако, когда дело доходит до выполнения запроса к файлу B (то есть к самому себе), если этот файл доступен только для чтения, запрос возвращает 0x80040E07 (-2147219793), Несоответствие типов данных в ошибке выражения критерия. Однако, если файл B открывается с разрешением на чтение и запись, запрос проходит легко. Как тот факт, что файл доступен только для чтения, может вызвать ошибку несоответствия данных?

Итак, вот мой минимальный рабочий пример. Сначала в разделе «Ссылки» моего проекта я добавил библиотеку Microsoft ActiveX Data Objects 2.8.

Вот строки подключения:

Файл A:

DBconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & sourcefile & ";" & _
            "Extended Properties=""Excel 12.0;HDR=Yes;Empty Text Mode=EmptyAsNull"";"

Файл B:

SourceFile_Self = ThisWorkbook.FullName
Connect_Self = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
               "Data Source=" & SourceFile_Self & ";" & _
               "Extended Properties=""Excel 12.0;HDR=Yes;Empty Text Mode=EmptyAsNull"";"

Открытие обоих соединений работает нормально, вот когда я пытаюсь получить запрос на выполнение файла B, в котором я получаю ошибки:

Файл A:

Dim objconnection as ADODB.Connection
Set objconnection = new ADODB.Connection
objconnection.CursorLocation = adUseClient
objconnection.Open (DBconnect)


Dim objRecordset As New ADODB.Recordset

szSQL = "SELECT [Equivalent bore diameter] " & _
        "FROM " & SourceSheet & _
        " WHERE [Shaft dia] = " & MotorShaftDia & ";"

Set objRecordset = objconnection.Execute(szSQL)

Файл B:

Set objselfConnection = New ADODB.Connection
objselfConnection.CursorLocation = adUseClient
objselfConnection.Open (Connect_Self)


Dim objRecordSetSheetMetal As ADODB.Recordset
Set objRecordSetSheetMetal = New ADODB.Recordset

SQLQuery = "SELECT [" & SeekedColumnTitle & "] as PartNumber, SUM([Total net area (SQ FT)]) as TotalQTY, [Standard Material Description], [OPER], [Sundries], [Unit], [To be ordered (if selected)] as OrderedBOM " & _
            "FROM [" & CabinetWorksheetName & "$] " & _
            "WHERE [Selected] ='X' " & _
            "GROUP BY [" & SeekedColumnTitle & "], [Standard Material Description], [OPER],[Sundries], [Unit], [To be ordered (if selected)];"


Set objRecordSetSheetMetal = objselfConnection.Execute(SQLQuery) '<--- That's where my problem is happening

Я не пытался преобразовать свой код в синтаксис Recordset.Open, чтобы проверить, сохраняется ли моя проблема, поскольку я подозреваю, что это больше связано с тем, как ADOBD выполняет запрос к файлу, чем с какой-то арифметической ошибкой.

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

EDIT: Во всяком случае, я попытался сосредоточиться на устранении неполадок передового опыта! Я пытался удалить детали до тех пор, пока они не сработали, затем добавил их обратно, пока не получилось Наконец, я обнаружил, что проблема, кажется, здесь:

SUM([Total net area (SQ FT)]) as TotalQTY

Это поле рассчитывается в моем файле (его формула, которая дает его значение). Значение этого поля «# N / A» [тип adVarWChar] в файле только для чтения, а в файле «чтение-запись» - 28,866 [тип adDouble]. Вы не можете сделать сумму строк символов! Поле представляет собой формулу, которая принимает 2 значения (высоту и ширину) и умножает их. Похоже, что эти два параметра, поступающие с другой страницы, не обновляются, что приводит к ошибке «# N / A».

Это действительно похоже на то, что таблица, запрашиваемая ADODB, не самая последняя [кажется, что она ссылается на набор данных, каким он был до открытия файла]. Я попытался сохранить файл (используя «Сохранить как»), затем снова открыл этот файл как доступный только для чтения и запрос прошел (потому что поля теперь оцениваются как двойные). Но если я изменю одно из значений, это обновленное значение не будет отображаться в результатах, что подтверждает мою гипотезу о том, что ADODB выполняет запрос к последней сохраненной версии файла (не текущей / отображаемой).

...