Проблема с SQL-запросом из VBA при попытке выбрать поля типа «Widestring» (Доступ к файлу .mbd)

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

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

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

Я получаю это в 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

person toygarden    schedule 08.03.2018    source источник
comment
Если это строка, вы не должны использовать ›= (если только неявные преобразования не поддерживаются и не применимы). Вы имеете в виду Где x 'Нравится'? Или даже '='? Каковы некоторые из примеров элементов в этом поле?   -  person QHarr    schedule 08.03.2018
comment
Теперь я мог выбрать некоторые поля, содержащие строки, я забыл кавычки! Но остается одна проблема: PNR — это столбец в базе данных, который содержит только целые числа (по крайней мере, в этом случае), но имеет тип «WideString». Я знаю, что есть значение 1169. 'SELECT hoehe FROM h_datei WHERE PNR = '1169' ничего не возвращает, а SELECT hoehe FROM h_datei WHERE PNR = 1169 выдает ошибку автоматизации   -  person toygarden    schedule 08.03.2018
comment
sSQL = "SELECT hoehe, pnr " & "FROM h_datei WHERE PNR <= '1169' " (со знаком меньше) дает мне весь столбец   -  person toygarden    schedule 08.03.2018
comment
попробуйте с N перед строкой юникода   -  person QHarr    schedule 08.03.2018
comment
sSQL = "SELECT hoehe, pnr " & "FROM h_datei WHERE PNR = '309' " Нет результатов. sSQL = "SELECT hoehe, pnr " & "FROM h_datei WHERE PNR = 309 " Ошибка автоматизации sSQL = "SELECT hoehe, pnr " & "FROM h_datei WHERE PNR LIKE '309' " Нет результатов. Столбец PNR имеет тип widestring и содержит значение 309.   -  person toygarden    schedule 08.03.2018
comment
sSQL = ВЫБЕРИТЕ hoehe, pnr & FROM h_datei, ГДЕ PNR = N'309'? Я не знаю, нужен ли N перед pnr.   -  person QHarr    schedule 08.03.2018
comment
sSQL = "SELECT hoehe, pnr " & "FROM h_datei WHERE PNR = N'309' " Выдает ошибку автоматизации   -  person toygarden    schedule 08.03.2018
comment
Попробуйте какой-нибудь гипс на колонке? sSQL = ВЫБРАТЬ hoehe, pnr & FROM h_datei ГДЕ StrConv(PNR,128) = '309'? см. здесь support.office.com/ ru/статья/   -  person QHarr    schedule 08.03.2018
comment
Кроме того, в обоих случаях стоит сохранить pnr как pnr, а не PNR, но это косметический фактор.   -  person QHarr    schedule 08.03.2018
comment
Я попробовал кастинг, который вы описали, но он все еще не дает мне никаких данных.   -  person toygarden    schedule 08.03.2018
comment
Я знаю, что преобразовал тип поля в число в MS Access, и это работает. Но это не очень хороший обходной путь, мне нужно, чтобы он был бесшовным из Excel, и, кроме того, столбец иногда будет содержать строки. Я не могу понять, что я делаю неправильно. MS Acces говорит следующее о полях: IME-mode: без контроля IME-sentencemode: без преобразования Textformat: обычный текст Это переведено с норвежского   -  person toygarden    schedule 08.03.2018
comment
Ага! Ведущие пробелы в строках! sSQL = SELECT pnr, hoehe & FROM h_datei & _ WHERE pnr = '100001' Это работает, но строки имеют разную длину. LTRIM(pnr) сработало!   -  person toygarden    schedule 08.03.2018
comment
опубликуйте как ответ, чтобы другие могли видеть :-)   -  person QHarr    schedule 08.03.2018


Ответы (1)


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

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

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

Подстановочные знаки

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

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

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

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

WHERE columnN = N'myString'

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

StrConv(PNR,128) = '309' 
person QHarr    schedule 08.03.2018
comment
Благодарю вас! Я попробую это завтра - person toygarden; 08.03.2018