Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка при поиске текстовых переменных в текстовых полях таблиц MySql / 4 сообщений из 4, страница 1 из 1
20.07.2018, 17:44
    #39677046
tinkandr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при поиске текстовых переменных в текстовых полях таблиц MySql
Братцы, помогите, пожалуйста!! Совсем уже выбился из сил… Не могу уже видеть эту ошибку… Вторые сутки не сплю и не ем.
По порядку:

Подключаюсь к базе MySQL из VBA (MS Excel) посредством “MySQL ODBC 5.3 ANSI Driver” (последняя версия 5.03.09.00 от 18.07.2017). Сам MySQL сервер на компьютере не установлен, но это не мешало на протяжении многих лет подключаться к базе, считывать и добавлять данные в таблицы SQL.

Процедура подключения:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Public Sub AdobConnect()
  Set conn = New ADODB.Connection
     conn.ConnectionString = "DRIVER={MySQL ODBC 5.3 ANSI Driver};" & _
        "SERVER=servername;" & _
        "DATABASE=dbname;" & _
        "UID=uid;" & _
        "PWD=pass;" & _
        "PORT=3306;" & _
        "OPTION=3"
     conn.Open
End Sub



Процедура поиска текстовой строки в таблице SQL
Код: vbnet
1.
2.
3.
4.
5.
6.
Public Sub IDКатегории()
        Call AdobConnect   'Подключение к Серверу SQL
        Set rs9 = New ADODB.Recordset
        rs9.Open "SELECT COUNT(*) AS Chk FROM category_description WHERE name = " & "Test", conn, adOpenDynamic, adLockOptimistic
        If rs9.Fields("Chk") <> 0 Then CatId = rs9("category_id")
End sub


Строка
rs9.Open "SELECT COUNT(*) AS Chk FROM category_description WHERE name = " & "test", conn, adOpenDynamic, adLockOptimistic
вызывает ошибку “Драйвер ODBC не поддерживает требуемые свойства”

Работа над ошибкой:

Как видите, “проблемная” строка пытается найти количество вхождений строки “test” в текстовом поле “name” таблицы “category_description”. Структура таблицы “category_description” такая:


Команда SHOW VARIABLES LIKE 'char%' как для таблицы “category_description” так и для всей базы выдает такое:


Замечено, что строка макроса, выдающая ошибку, корректно работает с нетекстовыми полями таблиц SQL и поиском в них только цифровых значений. К примеру, в поле “category_id” та же “проблемная” строка легко находит значение “222”:

Код: vbnet
1.
rs9.Open "SELECT COUNT(*) AS Chk FROM category_description WHERE category_id = " & "222", conn, adOpenDynamic, adLockOptimistic

Возвращает rs9.Fields("Chk") = 2

При попытке искать текстовые значения в любых полях таблицы, любые комбинации “проблемной" строки процедуры:
rs9.Open "SELECT COUNT(*) AS Chk FROM category_description WHERE category_id = " & "test", conn, adOpenDynamic, adLockOptimistic
rs9.Open "SELECT COUNT(*) AS Chk FROM category_description WHERE name = " & "test", conn, adOpenDynamic, adLockOptimistic
rs9.Open "SELECT COUNT(*) AS Chk FROM category_description WHERE name = " & "тест", conn, adOpenDynamic, adLockOptimistic
возвращают все ту же ошибку «Драйвер ODBC не поддерживает требуемые свойства». Сделал вывод, что проблема связана с кодировками…

Танцы с бубнами вокруг изначального подключения коннектора к базе SQL:

1. Начитался про параметр SET NAMES utf8. Согласно инструкциям подключаюсь к базе так:


Подключение происходит нормально, но на “проблемная” строка кода выдает все ту же ошибку, ровно как и с другими параметрами:
"STMT=SET character_set_results = 'utf8';" & _
"STMT=SET character_set_client = 'utf8';" & _
"STMT=SET character_set_connection = 'utf8';" & _
"STMT=SET character_set_database = 'utf8';" & _
"STMT=SET character_set_server = 'utf8';" & _

2. Прочел, что при проблемах с кодировками, многим помог параметр CHARSET=utf8. У меня с этим параметром подключение происходит нормально, но поиск текста вызывает все ту же ошибку «Драйвер ODBC не поддерживает требуемые свойства»:


Танцы с бубнами вокруг дампов:

Пробовал решить проблему, как описывалось на многих форумах, посредством редактирования дампов таблицы. Подумал, что необходимо все мои кодировки (типа “utf8mb4”) свести к “UTF-8”. Чтобы команда “SHOW VARIABLES LIKE 'char%'” выдавала результат, подобный этому (результат не мой, взял для примера):


Создал дамп таблицы “category_description”. В нем строка с “utf8mb4” встречается только один раз.

Пробовал заменить эту строку на SET NAMES utf8; и выгрузить дамп обратно в базу, но не помогло. При запросе “VARIABLES” наблюдается все та же картинка с кодировками “utf8mb4”

Многие советуют внести исправления в файл настройки SQL "my.ini". Но, на моем локальном компьютере этого файла нет (сервер SQL не установлен), а на самом сервере я также не могу его найти.

Подскажите, пожалуйста, хотя бы в какую сторону копать. Я не программист, многие вещи делаю наугад и методом “проб и ошибок”. Вторые сутки воюю с этой ошибкой, совсем потерялся и уже не знаю, что делать…
...
Рейтинг: 0 / 0
20.07.2018, 20:45
    #39677098
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при поиске текстовых переменных в текстовых полях таблиц MySql
tinkandrКак видите, “проблемная” строка пытается найти количество вхождений строки “test” в текстовом поле “name”Не видим.
Строка - это 'test'. А test без кавычек (или в обратных кавычках) - это имя поля таблицы.
Ваша конкатенация запроса из кусочковавтор
Код: sql
1.
"SELECT COUNT(*) AS Chk FROM category_description WHERE name = " & "Test"

эквивалентна
Код: sql
1.
"SELECT COUNT(*) AS Chk FROM category_description WHERE name = Test"

Чтобы строку искал должно быть
Код: sql
1.
"SELECT COUNT(*) AS Chk FROM category_description WHERE name = 'Test'"

Ну с регистром разберетесь. А то в одном месте Test, в другом test. Хотя, для ci это без разницы.
...
Рейтинг: 0 / 0
20.07.2018, 21:22
    #39677112
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при поиске текстовых переменных в текстовых полях таблиц MySql
tinkandr
Код: vbnet
1.
"SELECT COUNT(*) AS Chk FROM category_description WHERE name = " & "Test"

Собирайте текст запроса в отдельную переменную. Тогда можно будет вывести его куда-нибудь для отладки.
...
Рейтинг: 0 / 0
21.07.2018, 13:43
    #39677230
tinkandr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при поиске текстовых переменных в текстовых полях таблиц MySql
vkle, ну, конечно же!! Одинарные кавычки! Ура!!! )))
Спасибо огромное за подсказку! Выложил свой пример с конкатенацией, т.к. в рабочем макросе вместо "тест" использую переменную. Сбило то, что с числами макрос работал и без кавычек. Числам не нужны одинарные кавычки! Блин, как же все просто! ) А я в такие дебри залез!!

Вот, рабочий вид процедуры (за одним, перешел на более лучший способ проверки наличия строки в результатах запроса):
Код: vbnet
1.
2.
3.
4.
5.
6.
Public Sub IDКатегории()
       Set conn = Nothing: Call AdobConnect             'Подключение к Серверу SQL
       Set rs1 = New ADODB.Recordset: TestStr = "Бязь"  'Строковая переменная
       rs1.Open "SELECT * FROM category_description WHERE name = '" & TestStr & "'", conn, adOpenDynamic, adLockOptimistic
       If Not (rs1.EOF = True And rs1.BOF = True) Then CatId = rs1("category_id")
End Sub


Спасибо всем огромное за ответы и помощь!) Мой сумасшедший проект спасен! )
vkle, будете в Москве, обязательно заходите на пиво/чай/кофе )
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка при поиске текстовых переменных в текстовых полях таблиц MySql / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]