Проблема с запросом SQL из VBA при попытке выбрать поля типа 'Widestring' (файл Access .mbd)

Я пытаюсь импортировать некоторые данные из.mbd-файла в Excel. Я могу скопировать всю базу данных в электронную таблицу, никаких проблем нет. Я также могу использовать такое утверждение

sSQL = "SELECT HOEHE " & "FROM h_datei WHERE HOEHE >= 53 "

Проблема возникает при использовании WHERE в поле с типом, отличным от int или float. (У меня нет MS Access, но MDB Plus сообщает мне, что тип текстовых полей в моем.mdb называется 'Widestring')

Я получаю это в MsgBox из Excel: ошибка времени выполнения '-2147217913 (80040e07)': ошибка автоматизации

Я довольно долго гуглял и ковырялся, но я застрял. Под мой код VBA. Я не знаю, имеет ли это отношение к провайдеру (Microsoft.ACE.OLEDB.12.0), но я пробовал несколько других. Я также думаю о Юникоде, так как эта база данных из немецкой геодезической программы.

sConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & _
            sPath & "Oskarb04.mdb"

sSQL = "SELECT HOEHE " & "FROM h_datei WHERE PNR >= 53 "
Set rsData = New ADODB.Recordset
Debug.Print sSQL
rsData.Open sSQL, sConnect, adOpenForwardOnly, adLockReadOnly, adCmdUnknown

1 ответ

Для сравнения строк вы обычно используете оператор "Мне нравится", например

SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern; 

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

Wildcards

Для точного соответствия вы можете использовать "="

SELECT column1, column2, ...
FROM table_name
WHERE columnN = 'myString';

Если что-то вроде ">=" работает со строковым полем, тогда я подозреваю, что поле было установлено неправильно, я предполагаю, что оно незнакомо с рассматриваемым программным обеспечением, и / или может быть выполнено неявное преобразование, которое приводит к снижению производительности и может быть взломано.

Если это строка в юникоде, что быстрый Google, кажется, подразумевает widestring тип данных, то

WHERE columnN = N'myString'

В противном случае вы всегда можете попробовать привести столбец к другому типу, например

StrConv(PNR,128) = '309' 
Другие вопросы по тегам