Тайна вопросительного знака
Владимир Журавлев, Visual FoxPro CLUB
Заранее прошу прощения у ассов клиент-сервер. Им совсем незачем читать эти заметки и ругать меня за изложение тривиальных вещей. Безусловно этот материал для начинающих делать клиент-сервер. Ну не сразу же в конце концов человек становиться ассом. Когда то нужно с чего то начинать. Возможно я не совсем знаком с нашим уровнем знаний, но лично для меня тайна вопросительного знака стала своего рода откровением около двух с половиной лет назад. А когда я ее осознал, то стал ее применять и налево и направо и сэкономил кучу времени и кода. Написание клиент -сервер из Фокса требует двух вещей - знание Фокса и знание сервера. Но наш Российский заказчик , впрочем как и зарубежный, бывает очень не стабилен. Вот говорит он тебе- я твердо решил взять сервером Интербейс. И если что имеешь против - гуляй дальше-программистов навалом. Вот сидишь ты , сидишь, мучаешься с кодом, и наконец, некоторый успех. Вроде научился плавать и ждешь от босса или клиента хоть маленькой похвалы. ( на материальные вознаграждения только слабая надежда.) И тут это гражданин(ка) или контора вдруг и говорит , мы решили -Оракл. ( а ты их сам умолял и просил до этого про это) И все -код-коту под хвост. Только ты освоился с Оракл, а они как капризная девица говорят- мы твердо решили -MS SQL. Ну вот, посколько у нас в стране любой даже самый захудалый заказчик или клиент очень редок, ты на все соглашаешья и молча учишь все это подряд. В такой ситуевине нужно все, что только можно сделать менее зависимым от сервера ( хотя реальной инвариатности кода все равно нет) и все , что только можно засунуть в классы библиотек, работающих с серверами. Тогда любой выворот уже и не страшен. Так вот огромную роль в этой самой инвариантности кода играет вопросительный знак. Кое что про него найдете в ссылках : http://support.microsoft.com/subbort/kb/articles/q156/6/31.asp?LNG=ENG&AS=PER http://support.microsoft.com/support/kb/articles/q157/5/25.asp?LNG=ENG&AS=PER К большому сожалению во всех этих ссылках есть примеры с вопросительным знаком для команд сервера типа SELECT * from mytable where mytable.pid=?m.pid. Однако простая проверка показывает, что вопросительный знак работает и в других командах. Будь моя воля, я как всякий ленивый программист поставил бы памятник тому разработчику, кто придумал и реализовал этот самый вопросительный знак. Ну а теперь поближе к нашим баранам. Что это нам дает . Как скажем послать на Оракл ( другие сервера или куда подальше ) обычную переменную с полем типа дата , на MS SQL переменную с парой двойных одинарных или обратных апострофов, вообще целый файл с текстом, в котором вообще не известно какие спец символы и кавычки есть в бинарное поле Оракл. Техника , которую обычно советуют-замена одних кавычек на другие , что ломает текст. Ну всем известно, что есть функция SQLEXEC с командой сервера, а команда -это текстовая строка. Ну думаем мы-сделаем эту строку на Фоксе и все дела . Пусть мы имеем фоксовскую переменную vfpdateofbirth типа дата и хотим ее присвоить дню рождения работника на сервере Оракл . Напишем следующую переменную типа текст и пошлем ее на Оракл m.sql=insert into demo.employee (dateofbirth) values(+dtoc(vfpdateofbirth)+) - Переменная хоть куда - весь текст с чем надо. Посылаем на сервер =sqlexec(con,m.sql) И:. Оракл посылает нас к чертовой бабушке. Открываем справочник по Оракл и обнаруживаем, что данный сервер жутко чувствителен к формату Нужно еще знать Оракловскую функцию to_date и кучу ее правильных форматов,не всякий из которых годиться для Фокс переменной. То есть нужно написать что то вроде Cdt=dtoc(vfpdateofbirth) (to_date("+cdt+",DD.MM.YYYY))". А то может быть и to_date("+cdt+","DD.MM.YYYY HH24.MM.SS). если фоксовская переменная типа дэйттайм. Дальше-больше , для Интербейс нужно знать функцию преобразования типов cast , для MS SQL функцию convert. Так или иначе, все это все равно узнаешь, но ей богу это мнговато для такого старого маразматика , как я. Но вопросительный знак сам делает всю работу дез всяких таких функций. Перепишем нашу первую команду так m.sql=insert into demo.employee (dateofbirth) values (?dtoc(vfpdateofbirth) =sqlexec(con,m.sql) Посылаем на любой сервер- и все хорошо. Есть правда несколько несколько небольших тонкостей на разных серверах. Скажем если послать пустую дату на MS SQL SERVER , он вместо нее запишет дату начала века ( зависит от текущих серверных установок). Следует заменить ее на NULL Проблема с апострофами для вопросительного знака не существует m.sql0=insert into table (fieldname) values (m.sql2=")" m.sql= "" +" "+ . . . .! Сколько хочешь любых одиночных и парных апострофов m.sqlr=m.sql0+?m.sql+msql2 sqlexec(con,.mqlr) Переменная m.sqlr может быть даже содержанием файла, в котором бох знает что лежит . Вот фрагмент одной моей программы , где Фоксовые переменные разного типа посылаются на разные типы полей в MS SQL server aa=insert into thisform.port(Karti) SELECT karti rc=recc() j=0 GO top bb+aa+documents(documentcodeid,controltime,dateofcreation,outgono,incomno,corrdate,soprovno,contents, execdate,documenttypeid,soprovnodate,folder,correspondent) values(DO while not eof(karti) j=j+1 select karti kd=0 IF seek(int(val(kodd)),docc,numcode) kd=docc.documentcodeid ELSE kd=0 ENDIF sod=sodd++sodd1++sodd2++sodd3 dl+iif(isdigit(delo),delo,00) *** Решение проблемы пустой даты, чтобы не было 01.01.1900 01.01.2000 srokt=iif(empty(sroki),null,sroki) datpt+iif(empty(datp),null,datp) soprdatt+iif(empty(soprdat),null,soprdat) datot=iif(empty(dato),null,dato) dap1t=iif(empty(dap1),null,dap1) select karti cc=bb+"?kd,?srokt,?datpt,?isn,?vxn,?datot,?soprnom,?sod,?dap1t,1,?sorpdatt,?dl,?korr1)" IF sqlexec(con,cc)>0 ELSE thisform.write_error("karti",line()) *messagebox(str(recno(karti))) ENDIF Все переменные с вопросительным знаком -это переменные Фокса.
www.sdteam.com
Базы данных 28-01-2007 В России началось первое внедрение SAP for Insurance 24-09-2008 Базы данных Сегодня компании «Национальная страховая группа», SAP и группа Energy Consulting объявили о начале этапа опытно-промышленной эксплуатации первого в России проекта внедрения специализированного отраслевого решения для страховых компаний SAP for Insurance.Проект создания в «Национальной страховой группе» корпоративной информационной системы на базе решений SAP стартовал в 2007 году и реализуется поэтапно. В рамках проекта внед...
"Комстар-ОТС" завершил внедрение системы Oracle E-Business Suite 07-07-2008 Базы данных Оператор связи «Комстар-Объединенные ТелеСистемы» завершил проект по внедрению полнофункциональной ERP-системы Oracle E-Business Suite. Общий объем инвестиций в проект, включая услуги, лицензии, обучение, поддержку и оборудование, составил около 12 млн. долларов. Внедрение ERP-системы в «Комстар-ОТС» началось в 2005 году. Проект был выполнен в несколько этапов. Генеральным подрядчиком выступила компания «Квазар-Микро» (теперь работающая под б...
Oracle купила компанию Bridgestream 09-09-2007 Базы данных Корпорация Oracle сегодня объявила о покупке компании Brigestream, частной компании, разрабатывающей программное обеспечение для разграничения прав доступа. Сумма покупки компаниями не сообщается.Купленная Bridgestream довольно хорошо известна на западном корпоративном рынке за счет разработок, которые внедряются в корпоративные системы управления и разграничивают доступ сотрудников к тем или иным данным в зависимости от должностных обязанностей ...
Oracle открывает научно-исследовательскую сеть в азиатско-тихоокеанском регионе 24-07-2007 Базы данных Компания Oracle сегодня объявила об открытии научно-исследовательской сети, объединившей 19 исследовательских и внедренческих центров, расположенных на материковой Азии и в Японии.Как сообщает компания, новая сеть центров займется тестированием самых передовых разработок и технологий в области программного и аппаратного обеспечения в регионе.Наиболее крупные центры расположены в Пекине (Китай), Гургаоне (Индия), Сеуле (Южная К...
Использование технологий WWW для доступа к базам данных 06-06-2007 Базы данных Глава 1. Основы использования WWW - технологий для доступа к существующим базам данныхГлава 2. Подготовка гипертекстовых документов для World Wide WebГлава 3. Установка и администрирование WWW - сервераГлава 4. Использование CGI при создании интерактивных интерфейсовГлава 5. Использование пакета Cold Fusion для MS Windows при построении WWW - интерфейсов к базам данныхГлава 6. Использование языка PerlГлава 7. Использование пакета We... |