Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi 7 использование хранимых процедур, программно 
:(
    Опции темы
Medved
Дата 11.9.2009, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 1
Всего: 154



Привет всем.

Когда-то давно, в 2002 году написал одну программу на Delphi 7 для автоматизации приема платежей за аренду торговых мест для крупного торгового центра.

Сейчас сделал для этого программного комплекса электронную карту торговых мест, на C# (VS2008) но возникла необходимость внести в старую программу небольшие изменения, так как она до сих пор вполне справляется со своими задачами, и писать новую нет смысла.
 
На дельфи я уже давно не программировал, поэтому немного забыл этот язык. Ну плюс еще, когда я программировал на Дельфи, код писал по методу лапши, и более профессиональные приемы программирования тогда еще не знал.

Вопрос следующий. 

Вот на С# для использования хранимых процедур MS SQL сервера я использую следующий код. 
Хранимая процедура:
Код

СREATE PROCEDURE InsertTable1
  @ID int output,
  @FullName varchar(50),
  @DataBirth datetime
 AS
  INSERT Table1(FullName, DataBirth )
  VALUES ( @FullName, @DataBirth )
  SET @ID = SCOPE_IDENTITY()


Код на C#:
Код

{
   //Подключаю библиотеки
   using System.Data;
   using System.Data.Common;
   using Microsoft.Practices.CompositeUI;
   using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
   using Microsoft.Practices.EnterpriseLibrary.Data;

   //Объявляю класс, реализующего логику доступа к данным
    [Service]
    public class DatabaseService
    {
        //Объявляю переменную объекта Database который инкапсулирует доступ к базе данных.
        private Database db;

        //Метод, реализующий функционал по вставке данных с помощью ХП
        public void InsertData()
        {
           //Открываю соединение с БД
            db = DatabaseFactory.CreateDatabase("DatabaseName");
       
           //Объявляю строковую переменную, которая хранит имя ХП
           string sqlProcName = "InsertTable1";
           
           //Создаю переменную объекта DbCommand, который инкапсулирует работу с ХП
           DbCommand cmd = db.GetStoredProcCommand(sqlProcName);

           //Задаю значения входных и выходных параметров ХП 
           db.AddInParameter(cmd, "FullName", DbType. String, "Иванов Петр Сидорович");
           db. AddInParameter(cmd, "DataBirth", DbType.DateTime, DateTime.Parse("15.06.1980"));
           db.AddOutParameter(cmd, "ID", DbType.Int32, 8);

           //Выполняю хранимую процедуру
           db.ExecuteNonQuery(cmd);

           //Объявляю строковую переменную, которой присваиваю значение возвращаемое хранимой процедурой
          string results = string.Format(CultureInfo.CurrentCulture, "Код записи - {0} ",  db.GetParameterValue(cmd, "ID"));
         }


Я в свое время в Дельфи 7 использовал компоненты TADOStoredProc. Создавал модуль унаследованный от TDataModule, бросал на него компоненты TADOStoredProc и связывал их с хранимыми процедурами через свойства в Object Inspector в режиме Design Mode.
Я не хочу так реализовывать доступ к БД и непосредственно к ХП на сервере. 

Мне бы желательно создавать программно компоненты для доступа к ХП.

Какой наименее кодозатратный и мышкотыкательный способ, использования ХП в дельфи? Как например я это делаю c помощью С# в VS2008.

Благодарю.

Это сообщение отредактировал(а) Medved - 11.9.2009, 01:08


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Frees
Дата 11.9.2009, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



обычный адо квери и выполняеш в нем запрос типа

Код

EXECUTE PROCEDURE MY_PROC(:PARAM)


или просто

Код

SELECT * FROM MY_PROC(:PARAM)

 


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Medved
Дата 11.9.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 1
Всего: 154



Это понятно.

Мне нужно именно хранимые процедуры. Я не хочу писать SQL команды в коде приложения. Пусть они будут вынесены на сервер. Тогда при их изменении, или изменении полей, не надо будет перекомпилировать приложение.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Vas
Дата 11.9.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(Medved @  11.9.2009,  12:32 Найти цитируемый пост)
Я не хочу писать SQL команды в коде приложения. Пусть они будут вынесены на сервер. Тогда при их изменении, или изменении полей, не надо будет перекомпилировать приложение. 

Всегда интересно было если вы в программе передаете параметры по имени 
Код

           //Задаю значения входных и выходных параметров ХП 
           db.AddInParameter(cmd, "FullName", DbType. String, "Иванов Петр Сидорович");
           db. AddInParameter(cmd, "DataBirth", DbType.DateTime, DateTime.Parse("15.06.1980"));
           db.AddOutParameter(cmd, "ID", DbType.Int32, 8);


то как при изменении процедуры с добавление еще одного параметра вы собираетесь без перекомпиляции установить новому параметру значение?


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Akella
Дата 11.9.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



 smile 
PM MAIL   Вверх
Medved
Дата 11.9.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 1
Всего: 154



Приемущество использования хп давно известны и если ты не используешь такой подход - то тебе минус, как профессионалу. К примеру вот http://morozilnik.blog.ru/78249731.html

For VasAkella - смотрите шире.

Цитата

то как при изменении процедуры с добавление еще одного параметра вы собираетесь без перекомпиляции установить новому параметру значение?

А если изменено имя поля?

Приложение на Delphi 7 у меня написано как с использованием хранимых процедур (для манипуляции с данными), и в коде запросы писал.... на строк 30-40...
так что опыт использования запросов SQL в коде имеется... и не очень положительный... 
Если с этим еще не столкнулись - значит не пришло еще ваше время...

Желаю удачи!

И давайте пожалуйста не отходить от темы топика... 



Это сообщение отредактировал(а) Medved - 11.9.2009, 20:15


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Akella
Дата 11.9.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата

Для вызова хранимой
процедуры необходимо знать только имя и список параметров (аналогично
вызову обычных функций/методов в теле приложения).


а если в процедуре ты поменял список входных и/или выходных параметров?

Очень редко бывает, что меняешь код хранимки так, что не меняются параметры.

Добавлено через 7 минут и 57 секунд
Цитата(Medved @  11.9.2009,  12:32 Найти цитируемый пост)
Мне нужно именно хранимые процедуры. Я не хочу писать SQL команды в коде приложения. Пусть они будут вынесены на сервер. 


Код

ADOConnection1.ConnectionString := 'строка подключения';
....
...
ADOStoredProc1.procedureName := 'MyProc';
ADOStoredProc1.ExecProc;

SQL кода нет
PM MAIL   Вверх
Medved
Дата 12.9.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 1
Всего: 154



Цитата(Akella @  12.9.2009,  00:04 Найти цитируемый пост)
а если в процедуре ты поменял список входных и/или выходных параметров?

Очень редко бывает, что меняешь код хранимки так, что не меняются параметры.


По разному бывает. Те ХП, которые выполняют манипуляции с данными (INSERT, UPDATE) - там да, обычно меняются только параметры. 
Однако это как правило 30% хранимых процедур, используемых в приложении, построенном с их помощью.
Для выборки данных тоже используются ХП, их приходиться менять гораздо чаще в ходе отладки и тестирования, чем команды манипуляции.
К тому же, если писать запросы в коде приложения, то узнать, рабочий запрос ты написал, или нет, можно только после компиляции приложения (на серьезных проектах это занимает достаточно много времени), в случае с ХП, запрос тестируется по горячему. Т.е. тут же написал, тут же на сервере оттестировал, и не надо компилить все приложение целиком и использовать этот запрос из приложения, чтобы узнать верный он или нет. 

Кроме того, при ХП соблюдается принцип централизованности. Т.е. бывает зачастую так, что один и тот же запрос, используется в разных частях приложения. Если в коде его писать, то происходит дублирование кода. И в случае изменения такого запроса, его надо везде изменять, где он используется. В случае с ХП - его достаточно изменить лишь один раз - на сервере БД.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Vas
Дата 14.9.2009, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(Medved @  12.9.2009,  11:05 Найти цитируемый пост)
Для выборки данных тоже используются ХП, их приходиться менять гораздо чаще в ходе отладки и тестирования, чем команды манипуляции.

Для выборки данных обычно хватает вьюх на сервере.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Medved
Дата 14.9.2009, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 1
Всего: 154



Цитата(Akella @  12.9.2009,  00:04 Найти цитируемый пост)
Добавлено через 7 минут и 57 секунд
Цитата(Medved @  11.9.2009,  12:32 )
Мне нужно именно хранимые процедуры. Я не хочу писать SQL команды в коде приложения. Пусть они будут вынесены на сервер. 


код Pascal/Delphi
ADOConnection1.ConnectionString := 'строка подключения';
....
...
ADOStoredProc1.procedureName := 'MyProc';
ADOStoredProc1.ExecProc;

SQL кода нет 


Как задавать свойства объекту TADOStoredProc я и так знаю... 

Вот пример из соседней темы: http://forum.vingrad.ru/s/c54310447a961add...pic-158388.html
Код

var
  sp: TADOStoredProc;
begin
  sp := TADOStoredProc.Create(nil);
  try
    sp.Connection := MyConnection; // Настроенное соединение
    sp.ProcedureName := StoredProcName;
    sp.Parameters.ParamByName('@param1').Value := 'Значение параметра';
    sp.Parameters.ParamByName('@param2').Value := null;
// и т.д.
    sp.Open; // или sp.Exec если не возвращается набор данных
// тут обрабатываем данные
  finally
    sp.Free;
  end
end;


Тоже не рабочий. Пришлось разбираться. 

Прежде чем использовать параметры хранимой процедуры, их надо еще создать. Или в режиме Design Mode, или если программно создается объект TADOStoredProc, то программно. 

Добавлено @ 07:31
Вот немного о хранимых процедурах, и их использовании:
StoredProc становится удобнее
Использование хранимых процедур. Сервер InterBase.

Это сообщение отредактировал(а) Medved - 14.9.2009, 08:22


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Medved
Дата 14.9.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 1
Всего: 154



Цитата(Vas @  14.9.2009,  10:10 Найти цитируемый пост)
Для выборки данных обычно хватает вьюх на сервере.

А код запроса к этим вьюхам все равно пишешь в коде... 

Не противопоставляй представления и хранимые процедуры. Они не исключают друг друга - а взаимодополняют.

Для чего нужны ХП я уже давал ссылку выше: http://morozilnik.blog.ru/78249731.html

А вот для чего нужны представления:  http://msdn.microsoft.com/ru-ru/library/ms188250.aspx
Ну еще вот, более понятным языком: http://www.opennet.ru/docs/RUS/sql_kg/5-4-4.html

См. также: 
О представлениях:  http://msdn.microsoft.com/ru-ru/library/ms191428.aspx и http://msdn.microsoft.com/ru-ru/library/ms190174.aspx

О хранимых процедурах: http://msdn.microsoft.com/ru-ru/library/ms191436.aspx

Это сообщение отредактировал(а) Medved - 14.9.2009, 08:44


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1051 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.