powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Каркас приложения для работы с sql cервером
25 сообщений из 34, страница 1 из 2
Каркас приложения для работы с sql cервером
    #35083558
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите есть ли в природе какие-нибудь наработки по взаимодействию с sql
сервером ( 2005 ).

Интересуют "комплексные" решения по подключению, взаимодействию, обработке
ошибок, обработке обрыва связи и т.п.

Приступаю к написанию клиента - хотелось бы посмотреть как граммотно
реализовать работу.

Думаю, что должно быть реализованно через класс - прослойку, который и
возьмет на себя всю работу по синхронной/асинхронной передаче, обработке
ошибок и т.д.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35083593
Galyamov Rinat
Подскажите есть ли в природе какие-нибудь наработки по взаимодействию с sql
сервером ( 2005 ).

Интересуют "комплексные" решения по подключению, взаимодействию, обработке
ошибок, обработке обрыва связи и т.п.

Приступаю к написанию клиента - хотелось бы посмотреть как граммотно
реализовать работу.

Думаю, что должно быть реализованно через класс - прослойку, который и
возьмет на себя всю работу по синхронной/асинхронной передаче, обработке
ошибок и т.д.


Posted via ActualForum NNTP Server 1.4
"Все уже изобретено до нас..." (не помню чьё)
Есть АДО, можно им работать;
В Фоксе есть работа через ОДБЦ. См. в справке статьи по SqlStringConnect, SqlExec и т.д.
В "старших" версиях есть еще курсорадаптеры, но с ними я не работал. А вот АДО и ОДБЦ юзал...
ОДБС в Фоксе проще...
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35084092
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень хорошие и серьезные наработки в этом плане у Алексея Климова - ходи на его сайт и прозрееш :)
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35084402
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Станислав С...кий" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:5195147@sql.ru...

"Все уже изобретено до нас..." (не помню чьё)
В Фоксе есть работа через ОДБЦ. См. в справке статьи по SqlStringConnect,
SqlExec и т.д.

Года три назад писал клиента с доступом к sql 2000. Все команды на сервер
передавал через свой собственный класс, которыйотлавливал ошибки связи и
проч. Работал в синхронном/асинхронном режиме и т.д.

Сейчас все забылось. Востановить оссобых проблем нет, но кто сказал, что я
выбрал правильную идеологию в то время?

Хотелось бы посмотреть готовые каркасы, классы по работе с sql сервером,
которые возможно где-нить обсуждались, коллективно дорабатывались именно с
целью ознакомления с технологией наиболее оптимального решения по
взаимодейстию клиента с сервером.

Понятно, что после все перелопачу (а может и не все) под собственные нужды.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35084420
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"CTAC-KO" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:5196173@sql.ru...
Автор: CTAC-KO
Очень хорошие и серьезные наработки в этом плане у Алексея Климова - ходи на
его сайт и прозрееш :)
Тема Ответить Сообщение



А вот за это спасибо - посмотрю!!!

Может кто еще подскажет куда можно посмотреть?


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35084524
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
...
Это взаимодействие происходит с помощью драйвера ODBC посредством передачи команд SQL с использованием функции SQLEXEC.
Использование этой функции приводит к необходимости трудоемкого чтения и обновления данных в таблицах БД. Такой подход приводит к необходимости использовать разработчиков, имеющих достаточную квалификацию, понимающие принципы взаимодействия и владеющие знаниями для работы с SQL сервером. Т.к. способ хранения данных, типы полей в таблицах SQL сервера отличаются от типов данных, с которыми может производить вычисления среда FoxPro, разработчики вынуждены контролировать эти различия, производить трудоемки и ресурсоемкие преобразования. Разработчики вынуждены изменять данные на сервере также с помощью отдельных и сложных команд, приемов и способов. Абстракция при таком способе отсутствует. Никаких абстрактных классов, объектов в клиентской части ПО .... не создано и не используется. Трудоемкость и невозможность разработчиками уследить все ситуации приводит к появлению многочисленных ошибок. Незначительные изменения структуры таблиц, хранящихся на сервере SQL приводят к большим трудозатратам по изменению SQL запросов, приведению типов данных к нужному виду, переписыванию отдельных модулей клиентской части (иногда к значительному изменению алгоритмов).

Данный способ работы с SQL сервером в версии FoxPro группой разработчиков среды считается неоптимальным и для этого в новых версиях создан абстрактный базовый класс – курсорадаптер. В случае использования VFoxPro 9 можно предложить альтернативный вариант разработки клиентской части с применением улучшенного класса – курсорадаптера.
Курсорадаптер – это визуальный класс, который облегчает разработку клиент-серверного приложения, позволяет создавать абстрактные классы, которые автоматически производят преобразование типов данных, изменение данных в таблицах на MS SQL сервере. Курсорадаптер позволяет получать буферизованные (обновляемые) курсоры, с пом. данного класса легко и логично строятся алгоритмы работы с сервером. Курсорадаптер позволяет создать библиотеки визуальных классов и перейти к объектно-ориентированному программированию.

Класс курсорадаптер поддерживает обработку широкого ряда источников данных, как если бы они были родными курсорами Visual FoxPro. Типы этих источников данных перечислены ниже:
- Родные VFP
- Open Database Connectivity (ODBC)
- ActiveX Data Object (ADO)
- Extensible Markup Language (XML)

Объекты CursorAdapter позволяют:
- Динамическое использование различных источников данных.
- Использование источника данных либо объекта CursorAdapter, либо DataEnvironment.
- Совместное использование источников данных в предедах технологии источника данных.
- Необязательное определение структуры курсора, связанного с объектом CursorAdapter.
- Управление загрузкой данных из источника данных в курсор Visual FoxPro, связанный с объектом CursorAdapter.
- Разбор данных, полученных из различных источников данных в курсоры Visual FoxPro, основанный на типе источника данных.
- Управление через свойства и методы CursorAdapter добавлением, обновлением и удалением данных.
- Возможность добавлять объекты CursorAdapter в контейнеры отличные от DataEnvironment, такие как формы, наборы форма и прочие контейнеры.
Использование класса CursorAdapter, как самостоятельного класса без связи с Data Environment.
- С объектами CursorAdapter, источник данных представляется просто трубой к слою трансляции, который предоставляет данные из источника данных в курсор Visual FoxPro.

При использовании курсорадаптера, Visual FoxPro автоматически генерирует SQL INSERT, UPDATE и DELETE команды для местных (local) и удаленных (remote) представлений. При работе с объектами CursorAdapter можно настраивать и управлять тем, как Visual FoxPro генерирует эти SQL INSERT, UPDATE и DELETE команды.
Класс курсорадаптер автоматически отслеживает определенные события, происходящие в процессе взаимодействия с источником данных.
В Visual Foxpro 9 класс курсорадаптер имеет возможность автоматически конвертировать(преобразовывать) типы данных из таблиц сервера к необходимым типам в локальные(родные) курсоры Visual Foxpro.
В Visual Foxpro 9 класс курсорадаптер имеет возможность обновлять данные в локальном курсоре (делать актуальными) (отдельные или весь курсор в целом). Имеется возможность иметь всегда актуальные данные на клиенте, отслеживать попытки изменения пользователями записей, измененные другими пользователями в момент простоя рабочих станций.
Применение такого способа взаимодействия с сервером дает возможность разрабатывать клиентскую часть программистам, имеющим низкую квалификацию (не имеющим обширных знаний Tsql). При написании библиотек визуальных классов с использованием принципов и правил объектно-ориентированного программирования, позволит программистам настраивать Data-сущности(объекты) с помощью визуальных компонентов значительно ускорится разработка и исправление допущенных ошибок. Применение определенных подходов (буферизация, хранение и выполнение только скомпилированного Byte-кода) значительно оптимизирует работу клиентской части ПО.
Крайне необходимые улучшения базового класса курсорадаптера появились только в 9-й версии VoxPro. Без этих улучшений невозможно создать оптимальные библиотеки визуальных классов.
......
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35084527
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35084729
foxwizard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я работаю через самописный класс


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SET CLASSLIB TO 'appclass' addi

*Создаю глобальный объект
public oApp as appclass 
Oapp=CREATEOBJECT('appclass')


* А в программе, например так:

param= 123 

*Подключаемся к серверу
oApp.con()

*Заносим текст запроса в oapp.tsql
TEXT TO oapp.tsql noshow

SELECT name FROM customer WHERE customer_id=?param

ENDTEXT
*Выполняем запрос
oapp.dosql('result')
* получаем курсор result

*Отключаемся
oApp.discon() 
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35086587
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"foxwizard" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:5197577@sql.ru...
Автор: foxwizard
Я работаю через самописный класс
.....


Вот спасибо, У меня класс уже готовый, навороченный, а самое главное
идеологически правильный.
А теперь я умею создавать объект этого класса и вызывать на выполнение его
методы!!!



Ты бы методы класса привел - вот это была бы тема!


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35086600
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимоК сообщению приложен файл (ODBC.ZIP)

Спасибо. На досуге обязательно проанализирую!
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35086619
foxwizard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oApp.ncon- дискриптор подключения


метод con - подключение к серверу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
IF this.ncon >  0 
= MESSAGEBOX('Предидущий коннект не завершен',  16 , 'Ошибка !!!')
return
ENDIF

Store SQLSTRINGCONNECT(oapp.stringconnect) TO this.ncon
IF this.ncon <=  0 
= MESSAGEBOX('Не могу установить соединение с сервером',  16 , 'Ошибка подключения к SQL-Server')
return
else
= SQLSETPROP(this.ncon, 'asynchronous', .F.)
ENDIF


discon Method
Class: appclass

Source Code
Код: plaintext
1.
2.
3.
4.
5.
6.
IF this.ncon =  0 
= MESSAGEBOX('Повторный дисконнкет !!!',  16 , 'Ошибка подключения к SQL-Server')
*set step on
return
ENDIF
a= SQLDISCONNECT(this.ncon)
this.ncon= 0 

dosql Method
Class: appclass

Source Code
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
LPARAMETERS curname
IF TYPE('curname')='L'
curname='ml'
ENDIF



IF this.ncon <=  0 
= MESSAGEBOX('Не могу установить соединение с сервером',  16 , 'Ошибка подключения к SQL-Server')
return
ELSE

IF !EMPTY(this.db)
cSql="use "+this.db
this.sqlrez= SQLEXEC(this.ncon,cSql) 
endif




this.sqlrez= SQLEXEC(this.ncon,this.tsql,curname)
IF this.sqlrez< 0 

=AERROR(myeer)
=MESSAGEBOX(myeer( 1 , 3 )+CHR( 13 )+CHR( 13 )+THIS.TSql, 16 ,"ОШИБКА В ЗАПРОСЕ")
CANCEL
endif


IF USED (curname)
this.nrec=RECCOUNT(curname)
ELSE
this.nrec= 0 

ENDIF


a=SQLEXEC(this.ncon," SELECT @@IDENTITY AS 'newid'",'tokey32')
this.newid=tokey32.newid
SELECT tokey32
use

IF this.sqlrez<= 0 
CREATE CURSOR (curname) (errorsql i)   
select (curname)
APPEND BLANK 
REPLACE errorsql WITH this.sqlrez
endif

ENDIF
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35086941
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор: foxwizard


Ну и метод con, естественно вызывается в событии init ???

А в destroy вызывается disconect ?


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35086969
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор: foxwizard



Ну как минимум сразу недостатки:
Нет реализации асинхронного доступа к данным (а ведь не везде нужен
синхронный)

нет обработки ошибок подлючения/выполнения запросов, кроме MessageBox.

Функции всегда возвращают .t. , хотя правильнее при неудаче возвращать "код
ошибки" или хотябы .f.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35087020
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galyamov RinatНу как минимум сразу недостатки: ...
Разработку фреймворков уже не раз обсуждали. Поиск по форуму поможет.

Самый идеальный вариант, когда разработчик сам его напишет, т.к. работа класса-оболочки учитывает особенности стиля программирования и предпочтений конкретного разработчика.
Любая оболочка создает ограничения использования по сравнению с имеющимися средствами фокса, избавление от ограничений (полное повторение функционала фокса) означает создание инструмента такого же уровня сложности, что и средства фокса.
Упрощения требуют только те операции, которые выполняются одинаково во многих местах кода. Чтобы не копипастить постоянно.

Например, если в одном месте одного проекта нужен асинхронный запрос, то там его и надо прописать, а не пытаться включить его в класс используемый во всех своих проектах.
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35087434
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Dima T" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:5201833@sql.ru...

>Самый идеальный вариант, когда разработчик сам его напишет, т.к. работа
>класса-оболочки учитывает особенности стиля программирования и предпочтений
>конкретного >разработчика.

Ну я же так и писал: "Понятно, что после все перелопачу (а может и не все)
под собственные нужды."

Мне сейчас нужно просто посмотреть готовые решения, чтобы не изобретать
велосипед, а просто "поставить свои колеса".


>Любая оболочка создает ограничения использования по сравнению с имеющимися
>средствами фокса,
Здесь я с тобой не согласен. Во первых "имеющимиеся средства фокса" никто не
запрещает использовать. Во вторых обертывание этих средств будет скорее
обобщением, а не ограничением. Опять таки я ни разу не пожалел, что
стандартные классы "textbox", и т.д. обернул в свои и заменил/дополнил код в
некоторых событиях + изначально большинство свойств выставил по умолчанию
такими, какие мне нужны. Ну а где надо выставить другие значения свойств -
там и меняю.

>Упрощения требуют только те операции, которые выполняются одинаково во
>многих местах кода. Чтобы не копипастить постоянно.

Опять таки в тот же sqlexec() можно уже не передавать хандлер соединения, не
заботится о том валиден он или нет, произошел обрыв связи или что - то еще
случилось.
В метод класса просто передаем саму комманду, которую надо выполнить на
стороне сервера - остальное забота самого объекта этого класса!!!! (В том
числе логиррование ошибки и/или сообщение пользователю о возникших
проблеммах)

Если произошла ошибка мне уже не надо после каждого вызова sqlexec()
анализировать почему она произошла.

Метод может только вернуть булево значение удалось или нет выполнить эту
комманду.

Нужна детализация почему не получилось выполнить комманду? - даем запрос
другому методу, который вернет числовое/символьное описание ошибки.

>Например, если в одном месте одного проекта нужен асинхронный запрос, то
>там его и надо прописать, а не пытаться включить его в класс используемый
>во всех своих проектах.

poSQL.AsincSQLEcex(....), poSQL.SincSQLEcex(....) не вижу проблем (ну или
даже через необязательный параметр передавать как нужно выполнить синхронно
или же нет)

И кто говорит, что класс по работе с SQL должен обязательно использоваться
во всех моих проектах??? А даже если и так, то описание класса займет очень
не много места, а тем более добавление двух трех "специфичных" на твой
взгляд методов в этот класс.

Ну и наконец, в сам класс инкапсулируются всевозможные примочки и вкусности,
которые копи/пастом делать совсем не хочется.

Ваше мнение осатлось прежним : "Любая оболочка создает ограничения
использования"?


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35087709
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galyamov Rinat Ваше мнение осатлось прежним : "Любая оболочка создает ограничения
использования"?
Мнение не изменилось, и дискутировать по этому поводу надоело. Интересно что я думаю - поиск по форуму. Тут например почитай

Коротко: Свои классы делал я сам для себя, с учетом собственных потребностей и объяснять почему там нет того или этого не намерен - если нет значит мне не надо, будет надо - сразу добавлю. Поэтому и считаю что подобные наработки дело сугубо индивидуальное.

Пользуюсь КА. На нем построена библиотека стандартных форм. Есть класс-обертка для SQLEXEC()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
DEFINE CLASS clssql AS custom

	*-- -1 - соединение не установлено
	PROTECTED nhandle
	nhandle = - 1 
	*-- Сообщение о последней ощибке
	PROTECTED clasterror
	clasterror = ""
	PROTECTED lwritelog
	lwritelog = .F.
	PROTECTED clogfile
	clogfile = .F.
	*-- .T. - соединение получено извне, закрывать не нужно
	PROTECTED lexternalhandle
	lexternalhandle = .F.
	Name = "clssql"


	*-- Подключение к серверу
	PROCEDURE connect
		lpara tcSQLstring
		this.Disconnect()
		this.nHandle = SqlStringConnect(tcSQLstring)
		if this.nHandle <  0 
			this.SetLastError()
		endif
		return (this.nHandle >=  0 )
	ENDPROC


	*-- закрытие соединения
	PROCEDURE disconnect
		if this.nHandle != - 1 
			SqlDisconnect(this.nHandle)
			this.nHandle = - 1 
		endif
	ENDPROC


	*-- Сохранение сообщения о последней ошибке
	PROTECTED PROCEDURE setlasterror
		lpara tcText
		local array laErr[ 7 ]
		aerror(laErr)
		this.cLastError = laErr[ 1 , 2 ] + ' (' + astr(laErr[ 1 , 1 ]) + ')'
		if at('[SQL Server]', this.cLastError) !=  0 
			this.cLastError = GetParam(this.cLastError, '[SQL Server]',  2 )
		endif
		if this.lWriteLog
			WriteToLog('!!! SQL: ' + this.cLastError, this.cLogFile)
			if !empty(tcText)
				WriteToLog(tcText, this.cLogFile, .f., .t.)
			endif
		endif
	ENDPROC


	PROCEDURE getlasterror
		return this.cLastError
	ENDPROC


	*-- Выполнение запроса
	PROCEDURE execute
		lpara tcQuery, tcCursor
		local llRet
		if this.nHandle = - 1 
			this.cLastError = 'Не установлено соединение с SQL-сервером'
		else
			if empty(tcCursor)
				tcCursor = 'SQLRESULT'
			endif
			if SqlExec(this.nHandle, tcQuery, tcCursor) >  0 
				llRet = .t.
			else
				this.SetLastError('QUERY: ' + tcQuery)
			endif
		endif
		return llRet
	ENDPROC


	PROCEDURE gethandle
		return this.nHandle
	ENDPROC


	PROCEDURE isconnected
		return (this.nHandle >=  0 )
	ENDPROC


	*-- Добавление записи. Параметры Table, FieldList, ValueList. Возвращает Id добавленной записи
	PROCEDURE insert
		lpara tcTable, tcFieldList, tcValueList
		local lnId
		lnId = - 1 
		if this.Execute('insert into ' + tcTable + '(' + tcFieldList + ') values(' + tcValueList + ')    select nNewId = SCOPE_IDENTITY()', 'tnewid')
			lnId = tnewid.nNewId
			use in tnewid
		endif
		return lnId
	ENDPROC


	PROCEDURE setlog
		lpara tcLogFile
		this.cLogFile = tcLogFile
		this.lWriteLog = .t.
	ENDPROC


	PROCEDURE update
		lpara tcTable, tcFieldList, tcValueList, lcWhere
		local lcQuery, lnPos, lcPar, lcVal 
		lcQuery = 'update ' + tcTable + ' set '
		lnPos =  1 
		do while .t.
			lcPar = alltrim(GetParam(tcFieldList, ',', lnPos))
			lcVal = alltrim(GetParam(tcValueList, ',', lnPos))
			if empty(lcPar) or empty(lcVal)
				exit
			else
				lcQuery = lcQuery + iif(lnPos =  1 , '', ', ') + lcPar + '=' + lcVal + ' '
				lnPos = lnPos +  1 
			endif
		enddo
		if !empty(lcWhere)
			lcQuery = lcQuery + 'where ' + lcWhere
		endif
		return this.Execute(lcQuery)
	ENDPROC


	PROCEDURE Init
		SQLSETPROP( 0 ,"DispLogin", 3 )
		SQLSETPROP( 0 ,"DispWarnings",.F.)
		SQLSETPROP( 0 ,"Asynchronous",.F.)
		SQLSETPROP( 0 ,"BatchMode",.T.)
	ENDPROC


	PROCEDURE Destroy
		if !this.lExternalHandle
			this.Disconnect()
		endif
	ENDPROC


	*-- Получение уже установленного соединения
	PROCEDURE sethandle
		lpara tnHandle
		this.lExternalHandle = .T.
		this.nHandle = tnHandle
	ENDPROC


ENDDEFINE
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35088267
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда то же примерялся
но мне счас нужно только на чтение (да еще из DB2)- поэтому своего фреймворка нет

а посмотреть чужй код ради ИДЕЙ это дело полезное -

this.Execute('insert into ' + tcTable + '(' + tcFieldList + ') values(' + tcValueList + ') select nNewId = SCOPE_IDENTITY()', 'tnewid')
lnId = tnewid.nNewId

я вот бы не додумался в 1 строке написать - это обязательно ?
или можно в разных коммандах ?


to Galyamov Rinat кстати ты и свой код можешь выложить

ps почитал по ссылке Dima T вообщем согласен с ним - юзать чужое - иметь проблемы
pps to Dima T нельзя ли сюда тоже на базе адаптеров выложить
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35088296
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я вот бы не додумался в 1 строке написать - это обязательно ?
Нет, не обязательно.

или можно в разных коммандах ?
А там и так две разные команды. Но в одной строке. Разделены пробелом.
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35088436
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федоря вот бы не додумался в 1 строке написать - это обязательно ?
или можно в разных коммандах ? Для SCOPE_IDENTITY() обязательно. Где-то в форуме ВладимирМ обстоятельно описывал что это такое и как это едят.

Гулин Федорpps to Dima T нельзя ли сюда тоже на базе адаптеров выложить
Это библиотека форм, на 9-ке решил с нуля переделать, еще в стадии активного дописывания. На 6-ке с DBF все проекты.
Сами CA обычные без оболочек. В DE формы кладу. Генерю автоматом, потом руками причесываю (генератор в файлике). Много привязок к моим правилам именования таблиц, полей, индексов, объектов.
Т.е. это комплекс правил, выдрать из которого кусок невозможно. Точнее будет непонятно что к чему.
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35088746
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T..Для SCOPE_IDENTITY() обязательно...
Ну я бы не стал утверждать категорчино :)
А если у меня ключи в таблице генерятся не с помощью свойства таблицы IDENTITY, а например, с помощью типа данных uniqueidentifier и фунции сервера NewID().
С уважением, Алексей
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35088797
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K Dima T..Для SCOPE_IDENTITY() обязательно...
Ну я бы не стал утверждать категорчино :)
А если у меня ключи в таблице генерятся не с помощью свойства таблицы IDENTITY, а например, с помощью типа данных uniqueidentifier и фунции сервера NewID().
С уважением, Алексей Ты прочитал что написал?
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35088844
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да... пятница, пиво,... дают знать..:) "катеГОРЧИЧНО" это я сильно.

С уважением, Алексей
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35088847
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Черт.... опять ошибся... Все, на сегодня хватит...
С уважением, Алексей
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35090690
foxwizard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galyamov Rinat
Автор: foxwizard
Ну как минимум сразу недостатки:
Нет реализации асинхронного доступа к данным (а ведь не везде нужен
синхронный)

нет обработки ошибок подлючения/выполнения запросов, кроме MessageBox.

Функции всегда возвращают .t. , хотя правильнее при неудаче возвращать "код
ошибки" или хотябы .f.


Posted via ActualForum NNTP Server 1.4

Что мешает добавить в класс свойство asynchronous ?

= SQLSETPROP(this.ncon, 'asynchronous', this.asynchronous)
Мне не надо.

>нет обработки ошибок подлючения/выполнения запросов, кроме MessageBox.

А должны быть ошибки выполнения запросов?
Только в процессе разработки. Мне MessageBox с текстом запроса, вызвавшего ошибку достаточно.А пользователь, если он сможет (а ктож ему даст) выполнить запрос с ошибкой все равно ничего не это не даст.


>Ну и метод con, естественно вызывается в событии init ???
>А в destroy вызывается disconect ?
Нет.
...
Рейтинг: 0 / 0
Каркас приложения для работы с sql cервером
    #35090753
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Гулин Федор" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:5204394@sql.ru...
>
> to Galyamov Rinat кстати ты и свой код можешь выложить
>

Класс писался в 2002 - ом году и то в качестве "начальной помощи" другому
программисту в надежде, что тот доведет класс до ума.
До ума никто класс так и не довел. На данный момент этот кусок заброшен и
никем не поддерживается.

Основные идеи совпадают с реализацией Dima T. Сама реализация естественно
отличается, но это уже мелочи.

Сейчас надо написать грамотного клиента, но это происходит в промежутках
между "срочными" делами (программеров катострофически не хватает - идет
реорганизация в конторе).

Как напишу клиента, воспользовавшись идеями приведенными здесь + HELP + свои
мозги - так обязательно выложу. Хотя бы для того, чтобы услышать объективную
критику и исправить недоработки.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Каркас приложения для работы с sql cервером
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]