Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > проблема с mysql (оператор IF)


Автор: admsasha 22.1.2010, 11:32
Пишу, в теме mysql т.к. больше такой глюк нигде не проявляется

строка для подключения к базе
Код

"DRIVER={MySQL ODBC 3.51 Driver};SERVER=192.168.0.1;PORT=3306;DATABASE=mydb;UID=myname;PWD=mypwd; OPTION=3;STMT=set names cp1251;"


Есть вот такой код
Код

   StrSQL="SELECT if(1=1,'aaabbbccc',2)"
   Set Row = cnnADO.Execute(StrSQL, , adCmdText)
   

На выводе (row(0).value) получаю "????". 

Почему так ? 

Буквы латинские. С консоли показывает данные (вывод "aaabbbccc") нормально.




Автор: Akina 22.1.2010, 12:19
Цитата(admsasha @  22.1.2010,  12:32 Найти цитируемый пост)
На выводе (row(0).value) получаю "????". 

Вот именно так - строка длиной 4 байта с четырьмя знаками вопроса?

Добавлено через 37 секунд
И покажи определение переменной Row.

Автор: admsasha 22.1.2010, 13:39
Цитата(Akina @ 22.1.2010,  19:19)
Цитата(admsasha @  22.1.2010,  12:32 Найти цитируемый пост)
На выводе (row(0).value) получаю "????". 

Вот именно так - строка длиной 4 байта с четырьмя знаками вопроса?

Добавлено @ 12:19
И покажи определение переменной Row.

Да, именно так. Почему я и уточнил, что буквы английские, что это не из-за кодировки.  Причем если слово в IF будет длинным, то и знаков "?" будет больше.


Dim Row As ADODB.Recordset

Автор: Akina 22.1.2010, 14:01
Цитата(admsasha @  22.1.2010,  14:39 Найти цитируемый пост)
если слово в IF будет длинным, то и знаков "?" будет больше.

Но при "слове" в 9 символов даётся именно 4 знака вопроса, так?
А это - честные знаки вопроса, CHR(&H3F)? проверь...

Автор: admsasha 22.1.2010, 15:24
интересно, что через каждые три знака добавляется этот символ

эти проверки через "окно отладки", курсивом выделил вывод

? asc(mid(row(0).Value,1,1))
 63 

? mid(row(0).Value,1,1) = CHR(&H3F)
False


StrSQL="select IF(1=1,'1234',3)"
Set Row = cnnADO.Execute(StrSQL, , adCmdText)
? row(0).Value
??

StrSQL="select IF(1=1,'aaaaaa',3)"
Set Row = cnnADO.Execute(StrSQL, , adCmdText)
? row(0).Value
???

StrSQL="select IF(1=1,'1234567',3)"
Set Row = cnnADO.Execute(StrSQL, , adCmdText)
? row(0).Value
???

StrSQL="select IF(1=1,'123456',3)"
Set Row = cnnADO.Execute(StrSQL, , adCmdText)
? row(0).Value
???

StrSQL="select IF(1=1,'12345678',3)"
Set Row = cnnADO.Execute(StrSQL, , adCmdText)
? row(0).Value
????

StrSQL="select IF(1=1,'123456789',3)"
Set Row = cnnADO.Execute(StrSQL, , adCmdText)
? row(0).Value
????



вообще не понимаю  smile

Добавлено через 3 минуты и 52 секунды
И вот еще, версия mysql 5.1.34

Автор: Akina 22.1.2010, 16:20
Посмотрел хелп по ADO. Посмотрел пример... так вот - текстовые значения возвращаются с типом adLongVarWChar (203) - a long null-terminated Unicode string value, которое надо бы попробовать конвертировать во что-нить более пригодное к использованию. Потому как если написАть 
Код

StrSQL="SELECT if(1=1,123,456)"

результат получается предсказанно-корректный.

Добавлено через 2 минуты и 50 секунд
PS. Использовал коннектор 5.1.8.
PPS. MS Access через DSN соединяется без проблем и получает все данные корректно, в т.ч. строковые.

Добавлено через 4 минуты и 20 секунд
PPPS. Содержимое DSN-файла в общем вполне предсказуемо:
Цитата

[ODBC]
DRIVER=MySQL ODBC 5.1 Driver
UID=test
DFLT_BIGINT_BIND_STR=1
PORT=3306
DATABASE=test
SERVER=192.168.0.254

Автор: admsasha 22.1.2010, 16:39
Цитата(Akina @  22.1.2010,  23:20 Найти цитируемый пост)
StrSQL="SELECT if(1=1,123,456)"

Да, так выводит как надо и даже StrSQL="SELECT if(1=1,'aaa','bbb') выводит правильно.

Вообще в оригинале мне нужен вот такой код:
Код

SELECT IF(`date`>0,FROM_UNIXTIME(`date`),'') FROM ...


т.е. если показывать дату либо ничего не показывать... Но выводит точно также несколько знаков "?" :(

Добавлено через 3 минуты и 55 секунд
Вот что получается, если в IF типы одинаковые, то выводит нормально
т.е.

Код

SELECT IF(`date`>0,FROM_UNIXTIME(`date`),FROM_UNIXTIME(0)) FROM ...

выводит всё номально, НО мне нужно именно '' (пустое значение)

Автор: Akina 22.1.2010, 16:53
Цитата(admsasha @  22.1.2010,  17:39 Найти цитируемый пост)
мне нужно именно '' (пустое значение)

а если нечто типа
Код

SELECT IF(`date`>0, CAST(FROM_UNIXTIME(`date`) AS CHAR),'') FROM ...
?

Автор: admsasha 22.1.2010, 17:22
Поразительно ! Сработало !!!

Я так понял, "баг" обошелся через  преобразование типа в char. Но всё же интересно, зачем так, хотя уже и не так важно smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)