C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Stored Procedure
Konstantine
Отправлено: 14.11.2005, 17:51


Мастер участка

Группа: Модератор
Сообщений: 545



MS SQL 2000
скажите плиз:
для чего нужны хранимые процедуры? что ими можно сделать? и как их писать?
можно ссылку...
Kuks
Отправлено: 15.11.2005, 09:34


Станционный диспетчер

Группа: Участник
Сообщений: 108



Все что угодно. Работа с таблицами, представлениями и т.д.
Только выполняются они на стороне сервера, в отличие от
функции CPP.
Gedeon
Отправлено: 15.11.2005, 12:28


Ветеран

Группа: Модератор
Сообщений: 1742



Да тут так просто и не напишешь, надо книги почитать да и не поймешь пока не поработаешь с ними.
olegenty
Отправлено: 15.11.2005, 16:35


Ветеран

Группа: Модератор
Сообщений: 2412



я ими (+ UDF + простмотры) делаю всё. клиентское приложение даже близко не представляет, что являет собой структура БД.

основное, в моём случае, назначение
1. Логика БД, если присутствуют отличные от реляционных связи между объектами БД.
2. Интерфейс разработчика, в конечном итоге обеспечивающий информацией пользовательский интерфейс.
exp
Отправлено: 14.05.2006, 12:05


Мастер участка

Группа: Участник
Сообщений: 304



Здравствуйте.
Вот тоже приспичило сделать хранимую процедуру. Покопал хэлп, а там пример "времён очаковских и покоренья Крыма", который не работает sad.gif.
Моя процедура просто выбирает из таблицы записи, где опред. поле равно параметру процедуры. Но как её вызвать из билдера и нарисовать в сетке ?
Если можно примерчик небольшой. Очень прошу smile.gif

Использую MS SQL Server, TADOStoredProc через TADOConnection

Отредактировано exp — 14/05/2006, 12:08
olegenty
Отправлено: 14.05.2006, 13:44


Ветеран

Группа: Модератор
Сообщений: 2412



вот простейшая процедура с одним параметром типа int, возвращающая все значения из таблицы dbo.SomeTable, у которой значения некоторого целого поля SomeIntField равно значению параметра @IntParam
SQL
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
create procedute dbo.usps_Something
@IntParam int
as select * from dbo.SomeTable where SomeIntField = @IntParam
go


у своей TADOStoredProc в ProcedureName пишешь dbo.usps_Something, проверяешь Parameters, если там нет @IntParam — добавь. параметры появляются автоматически только при наличии активного соединения с БД.

затем в коде программы пишешь
CODE

   YoursProcedure->Parameters->ParamByName("@IntParam")->Value = SomeIntValue;
   YoursProcedure->Open();


вуаля, набор данных открыт.

для отображения можешь воспользоваться TDBGrid. Для этого кидаешь на форму TDataSource *YoursSource, настраиваешь его на YoursProcedure, кидаешь на форму TDBGrid, настраиваешь на YoursSource и видишь результат в гриде.
exp
Отправлено: 14.05.2006, 15:44


Мастер участка

Группа: Участник
Сообщений: 304



Большое спасибо !!!! Аккурат то, что нужно!
Оказалось, что я писал параметры без '@'...... не вовремя..... и не туда smile.gif)

Отредактировано exp — 14/05/2006, 16:15
olegenty
Отправлено: 15.05.2006, 07:42


Ветеран

Группа: Модератор
Сообщений: 2412



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

ну и при попытке воспользоваться хранимой процедурой посредством TADOQuery всё будет чуть-чуть иначе. в SQL пишешь:
CODE

exec dbo.usps_Something :IntParam


как видишь, наличие "@" — не обязательно. а можно было и с ним:
CODE

exec dbo.usps_Something :@IntParam


это скорее дело вкуса, чем чего-то ещё. да и само имя можно написать, как Бог на душу положит:
CODE

exec dbo.usps_Something :SomeMotherfuckingIntParam

- так тоже всё будет корректно работать. разница будет лишь в обращении к параметру из программы.
в первом случае — ParamByName("IntParam")
во втором — ParamByName("@IntParam")
в третьем — ParamByName("SomeMotherfuckingIntParam")

конечный результат будет тот же.

Вернуться в Работа с базами данных в C++Builder