Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 13-10-2010 10:30 » |
|
неожиданное, но приятное открыл открытие: как птица (1.5+), так и MySQL 5+ (за другие версии не знаю) умеют понимать обёрнутые в апострофы значения в select, insert и update, а также переданные в процедуру параметры )) наглядно, вот о чём я select * from T where num=1 and text='qqq'; update T set num=1, text='qqq'; этому будет эквивалентно: select * from T where num= '1 ' and text='qqq'; update T set num= '1 ', text='qqq'; то есть, отныне не надо мне выбирать, что обернуть в апострофы, а что нет - можно тупо все параметры обернуть и всё Только интересно, как это согласуется со стандартом
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #1 : 13-10-2010 11:24 » |
|
Текста стандарта под рукой сейчас нет. Посмотрел справку на MS SQL 2008, который не был мной уличен в существенных отличиях от стандарта. Там указано, что типы char и varchar неявно конвертируются почти во все типы, кроме binary, varbinary и timestamp. Все числовые типы заведомо входят в этот список. Так что открытие, возможно, и приятное, но весьма ожиданное.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Антон (LogRus)
|
|
« Ответ #2 : 13-10-2010 14:22 » |
|
надеюсь тут нет подводных камней в виде ты ожила что поле сконвертится в одно, а оно сконвертилось в другое
|
|
|
Записан
|
Странно всё это....
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #3 : 13-10-2010 15:08 » |
|
а причем тут c++? Имхо это в другом разделе обсуждать надо...
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 13-10-2010 17:07 » |
|
Антон (LogRus), да фиг знает...
lapulya, да тут все озарения собраны)) Может, стОит и перенести - просто я изначально тут создал, так и поехало
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 13-10-2010 17:55 » |
|
Леш, это для неизвестного числа параметров так можно было бы сделать, да и то очень ненадежно. Учитывая, что ты пользуешься MySQL, вот лишь некоторые возможные подводные камни: 1. Преобразование hex-константы. 0x80 - VARBINARY (1 байт со значением 0x80). "0x80" - VARCHAR. 2. Преобразование BINARY в целое и интерпретация hex-строк в числа. 0 + 0x80 даст 128. Если BINARY длиннее 8 (размер BIG INT), то используются последние 8 байт. Если короче 8 байт, то старшие байты равны 0. 0 + "0x80" даст 0.0. В данном случае это особенность MySQL: если текст не является валидным целым числом, то результат считается плавающими значениями, а интерпретация прерывается на первом неверном символе с генерацией предупреждения (не ошибки!). Правильно будет использовать bind переменных. SELECT a, b FROM tab WHERE id = ? UPDATE tab SET a = ?, b = ? WHERE id = ? Составителю SQL здесь пофиг на тип переменной - этим займется клиентская библиотека или серверная часть базы, а надоумить ее должна клиентская программа.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 13-10-2010 18:03 » |
|
ну, вообще-то, я для птицы делаю Просто заодно и на MySQL проверил 1) так у меня не будет, никогда в hex формате в строку SQL не пишу 2) для MySQL - учту. Для птицы у меня для числовых типов только десятичные циферки в строке SQL бывают Добавлено через 5 дней, 11 часов, 48 минут и 54 секунды:встретил в птице1,5 неприятную особенность (плюс к тому, что тут всего один уровень транзакции - никаких вложенных) - если внутри транзакции происходит исключение, оно не вырывается наружу, и кажется, что всё ок. Но после коммита оказывается, что сделалось ничего! в частности, создавал процедру P2, которая в своём теле вызывает процедуру P1(a,b), в то время как P1 ещё было только в стадии заготовки (пустое тело, параметры не описаны). Исключения не выпало. Догадался отключить транзакцию const bool bUseTrans=false; //ТРАНЗАКЦИЮ ОТКЛЮЧИЛИ
bool bSuccess=false; if(!bUseTrans || pbase->BeginTrans()) { TRY { //тут много операций //...
//если дошли до контрольной точки bSuccess=true; } CATCH(CDBException, e) { } END_CATCH
if(bSuccess) { if(bUseTrans)pbase->CommitTrans(); } else { if(bUseTrans)pbase->Rollback(); } }
ошибка сразу выскочила и отладилась. Разрешил снова транзакцию - всё получилось Добавлено через 34 секунды:а в MySQL как с похожей ситуацией дело обстоит ?
|
|
« Последнее редактирование: 19-10-2010 05:52 от Алексей1153 »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #7 : 19-10-2010 07:54 » |
|
Леш, если ты про транзакции, то она по стандарту и по определению не может быть вложенной. В некоторых навороченных СУБД все же их реализуют - в Оракл встречал вложенные.
Мне не совсем понятны твои трудности. Обычно ведь как: стартовал транзакцию, выполнил N операторов, commit или по исключению rollback. Что в данной модели тебя не устраивает?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 19-10-2010 08:36 » |
|
так я и не жалуюсь, что нет вложенной. Мне непонятно, почему ошибка не выскочила, когда должна была.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #9 : 19-10-2010 19:56 » |
|
Леш, а что за странные TRY-CATCH?
Добавлено через 2 минуты и 32 секунды: В MySQL на все будет либо ошибка, либо предупреждение. Но в процедуре, функции или в любом их блоке можно обработать любую (наверно только кроме синтаксической) ошибку и тогда она не будет распространяться дальше.
|
|
« Последнее редактирование: 19-10-2010 19:58 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 19-10-2010 20:14 » |
|
TRY-CATCH-AND_CATCH-CATCH_ALL-END_CATCH http://msdn.microsoft.com/en-us/library/19z28s5c(v=VS.80).aspx - это MFC-ишная приблуда. По МСДН - эти макросы якобы оставлены для совместимости с предыдущими версиями MFC. На практике же, если пользоваться не ими, а try-catch , то будет утечка памяти, если только не удалить эксепшен явно вот таким образом: try { } catch(CDBExeption* e) { ... e->Delete(); }
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 22-10-2010 03:16 » |
|
в птице 1,5 наткнулся на странную вещь:
пусть, имеется таблица T(a,b,c,d). Добавляю ещё поля в транзакции и заполняю их там:
начать трз alter table T add E1 smallint; alter table T add E2 smallint; alter table T add E3 smallint;
update T set E1=null; update T set E2=10; коммит трз
после коммита оказывается, что поля-то добавились, но отредактированы значения других полей, которые были до транзакции! А это ж абзац Или так нельзя делать, как я делаю ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 22-10-2010 04:43 » |
|
ещё одна жуткая подстава (тут транзакция не используется):
alter table T add F1 SMALLINT default 0 или даже так alter table T add F1 SMALLINT default 0 not null
в таблице появляется поле, заполненное NULL. Его можно, конечно, отдельно заполнить после создания (так и приходится), но это же неправильно что-то
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #13 : 22-10-2010 09:07 » |
|
Леш, ALTER TABLE относится к DDL и в транзакциях не участвует. Соотв., транзакцию надо открывать после. То, что у тебя получилось - видимо кривизна FB. Попробуй через DEFAULT. ALTER TABLE T ADD E1 SMALLINT DEFAULT NULL ADD E2 SMALLINT DEFAULT 10 ADD E3 SMALLINT;
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 22-10-2010 09:57 » |
|
так ведь не ставиться из дефолта во вновь созданное поле - смотри пост 12 Придётся при загрузке более тщательно на null проверять
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #15 : 22-10-2010 10:10 » |
|
Значить FB очень далека от стандартов. Нужно изучать ее особенности.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #16 : 22-10-2010 11:49 » |
|
В некоторых навороченных СУБД все же их реализуют - в Оракл встречал вложенные.
ты имеешь ввиду автономные тразакции или что то другое?
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #17 : 22-10-2010 21:31 » |
|
McZim, их самых.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|