«Сұрақ белгісінің жұмбағы…»

Новости мира

Клиент-сервер ace үшін алдын ала кешірім сұраймын. Олардың бұл жазбаларды оқып, маған болмашы нәрселерді ұсынғаным үшін ұрысуына еш себеп жоқ.
Әрине, бұл материал жаңадан бастаушыларға клиент-сервер жасауға арналған. Бірден емес, адам эйске айналады. Кейде бір жерден бастау керек.
Мен біздің білім деңгейімізбен толық таныс емес шығармын, бірақ жеке мен үшін сұрақ белгісінің жұмбағы екі жарым жыл бұрын ашылғандай болды. Мен оны түсінген кезде мен оны солға да, оңға да қолдана бастадым және көп уақыт пен кодты үнемдедім.
Fox-тан клиент-сервер жазу екі нәрсені қажет етеді — Fox-ты білу және серверді білу. Бірақ біздің ресейлік тұтынушы, алайда, шетелдік сияқты, өте тұрақсыз болуы мүмкін. Міне, ол сізге айтады — мен Interbase-ті сервер ретінде қабылдауды шештім. Ал егер сізде қарсы бірдеңе болса — жүре беріңіз — бағдарламашылар жаппай.

Мұнда сіз отырасыз, отырасыз, кодпен азап шегесіз, ақырында, біраз табысқа жетесіз. Сіз жүзуді үйренген сияқтысыз және сіз бастықтан немесе клиенттен аз да болса мақтау күтетін сияқтысыз. (Материалдық сыйға деген үміті шамалы.) Сосын бұл азамат (ка) немесе кеңсе кенеттен, біз шештік — Oracle дейді. (Және сіз өзіңіз оларға жалынғансыз және бұл туралы бұрын сұрадыңыз) Және барлық код ағында. Сіз Orakl-ға үйренгеніңізде, олар капризді қыз сияқты, біз 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

Өкінішке орай, осы сілтемелердің барлығында mytable.pid=?m.pid орналасқан mytable ішінен SELECT * сияқты сервер пәрмендері үшін сұрақ белгісі бар мысалдар бар. Дегенмен, қарапайым тест сұрақ белгісі басқа командаларда да жұмыс істейтінін көрсетеді. Егер менің қалауым болса, мен де кез келген жалқау бағдарламашы сияқты дәл осы сұрақ белгісін ойлап тапқан және жүзеге асырған әзірлеушіге ескерткіш орнатар едім.
Енді біздің қойларға жақынырақ. Ол бізге не береді.
Oracle-ға (басқа серверлерге немесе басқа жерге) күн типті өрісі бар тұрақты айнымалыны, MS SQL-ке қос жалғыз немесе кері таңбалары бар айнымалыны, жалпы мәтіні бар тұтас файлды жіберуді қалай айтуға болады. екілік Oracle өрісінде қандай арнайы таңбалар мен тырнақшалар бар екені мүлде белгісіз. Әдетте ұсынылатын әдіс — мәтінді бұзатын бір дәйексөзді екіншісімен ауыстыру. Барлығы сервер пәрмені бар SQLEXEC функциясы бар екенін біледі, ал пәрмен мәтіндік жол болып табылады. Біз бұл жолды Fox-та жасаймыз деп ойлаймыз және бәрі де солай.
Бізде Fox-тың vfpdateofbirth айнымалысы күн түрінің бар делік және оны Oracle серверіндегі қызметкердің туған күніне тағайындағымыз келеді. Келесі мәтін түрінің айнымалысын жазып, оны Oracle-ға жіберейік

m.sql=’demo.employee (туған күні) мәндеріне кірістіру(‘+dtoc(vfpdateofbirth)+’)’ — Кез келген жердегі айнымалы — сізге қажет мәтіннің барлығы. Серверге жіберу
=sqlexec(con,m.sql)
Және:
Oracle бізді тозаққа жібереді. Біз Oracle сілтемесін ашамыз және бұл сервер пішімге өте сезімтал екенін анықтаймыз.Сонымен қатар біз Oracle to_date функциясын және оның барлық дұрыс пішімдерін білуіміз керек, бірақ олардың барлығы Fox айнымалысына сәйкес келмейді. Яғни, бірдеңе жазу керек
Cdt=dtoc(туған күні)
(бүгінгі_күн(‘»+cdt+»‘,’КК.АА.ЖЖЖЖ’))». Немесе бүгінгі күні(‘»+cdt+»‘,»КК.АА.ЖЖЖЖ 24.АА.СС’).
егер fox’s datetime түрінің айнымалысы.
Бұдан басқа, Interbase үшін cast түрін түрлендіру функциясын, MS SQL үшін түрлендіру функциясын білу қажет. Әйтеуір, мұның бәрін біліп аларсың, құдай-ау, мен сияқты қарт кісіге бұл тым көп. Бірақ сұрақ белгісінің өзі барлық жұмысты мұндай функцияларсыз орындайды. Бірінші командамызды осылай қайта жазайық

m.sql=’demo.employee (туған күні) мәндеріне кірістіру (?dtoc(vfpdateofbirth)’
=sqlexec(con,m.sql)

Біз кез келген серверге жібереміз — бәрі жақсы.
Әртүрлі серверлерде шын мәнінде бірнеше ұсақ нәзіктіктер бар. Айталық, егер сіз MS SQL SERVER -ге бос күнді жіберсеңіз, ол оның орнына ғасырдың басындағы күнді жазады (сервердің ағымдағы параметрлеріне байланысты). NULL мәнімен ауыстырылуы керек
Сұрақ белгісі үшін апострофтармен мәселе жоқ

m.sql0=’кестеге (өріс атауы) мәндерді енгізу (‘m.sql2=»)»
m.sql=’ «» ‘+» » «+ . . . .! Қанша жалғыз және қос апостроф керек
m.sqlr=m.sql0+’?m.sql’+msql2
sqlexec(con,.mqlr)
m.sqlr айнымалысы тіпті boh ішінде не бар екенін білетін файлдың мазмұны болуы мүмкін. Міне, менің бағдарламаларымның бірінің фрагменті, мұнда әртүрлі типтегі Fox айнымалылары MS SQL серверіндегі өрістердің әртүрлі түрлеріне жіберіледі.

aa=»thisform.port(‘Karti’) ішіне кірістіру
ТАҢДАУ картасы
rc=recc()
j=0
Жоғарыға GO
bb+aa+’құжаттар(documentcodeid,басқару уақыты,жасау күні,outgono,incomno,корrdate,soprovno,contents,execdate,documenttypeid,soprovnodate,қалта,корреспондент) мәндері(‘DO, while eof(‘karti’))
d=d+1
карти таңдаңыз
kd=0
IF search(int(val(kodd)),’docc’,’numcode’)
kd=docc.documentcodeid
БАСҚА
kd=0
ENDIF
сод=сод+»+сод1+»+сод2+»+сод3
dl+iif(сан(жұмыс),жұмыс,’00’)
*** 01.01.1900 болмайтындай бос күн мәселесін шешу 01.01.2000
srokt=iif(бос(sroki),null,sroki)
datpt+iif(бос(datp), null,datp)
soprdatt+iif(бос(soprdat),null,soprdat)
datat=iif(бос(деректер),нөл,деректер)
dap1t=iif(бос(dap1), null,dap1)
карти таңдаңыз
cc=bb+»?kd,?srokt,?datpt,?isn,?vxn,?datot,?soprnom,?sod,?dap1t,1,?sorpdatt,?dl,?korr1)»
IF sqlexec(con,cc)>0
БАСҚА
thisform.write_error(«karti»,line())
*messagebox(str(recno(карти)))
ENDIF

Сұрақ белгісі бар барлық айнымалылар Fox айнымалылары болып табылады.