Таємниця знаку питання, FoxPro, Бази даних, статті

Володимир Журавльов, Visual FoxPro CLUB

Заздалегідь прошу вибачення у асів клієнт-сервер. Їм зовсім нема чого читати ці нотатки і лаяти мене за виклад тривіальних речей.
Безумовно цей матеріал для початківців робити клієнт-сервер. Ну не відразу ж, зрештою, людина стає асом. Коли то потрібно з чогось починати.
Можливо я не зовсім знайомий з нашим рівнем знань, але особисто для мене таємниця знаку питання стала свого роду одкровенням близько двох з половиною років тому. А коли я її усвідомив, то став її застосовувати і наліво і направо і заощадив купу часу і коду.
Написання клієнт-сервер з Фокса потребує двох речей – знання Фокса і знання сервера. Але наш Російський замовник, втім як і закордонний, буває дуже не стабільний. Ось говорить він тобі-я твердо вирішив взяти сервером Інтербейс. І якщо що маєш проти – гуляй далі-програмістів навалом.
Ось сидиш ти, сидиш, мучишся з кодом, і нарешті, деякий успіх. Начебто навчився плавати і чекаєш від боса або клієнта хоч маленької похвали. (На матеріальні винагороди тільки слабка надія.) І тут це громадянин (ка) або контора раптом і каже, ми вирішили-Оракл. (А ти їх сам благав і просив до цього про це) І все-код-коту під хвіст. Тільки ти освоївся з Оракл, а вони як примхлива дівчина кажуть-ми твердо вирішили-MS SQL.
Ну от, поскільки у нас в країні будь-який навіть самий зубожілий замовник або клієнт дуже рідкісний, ти на все соглашаешья і мовчки вчиш все це поспіль. У такій сітуевіне потрібно все, що тільки можна зробити менш залежним від сервера (хоча реальної інваріатності коду все одно немає) і все, що тільки можна засунути в класи бібліотек, які працюють з серверами. Тоді будь-який виворіт вже й не страшний.
Так от величезну роль в цій самій інваріантності коду грає знак питання. Дещо про нього знайдете в посиланнях:
support.microsoft.com/subbort/kb/articles/q156/6/31.asp?LNG=ENG&AS=PER
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

Всі змінні зі знаком питання-це змінні Фокса.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*