powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация кода
9 сообщений из 9, страница 1 из 1
Оптимизация кода
    #32012621
V. Motchulsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К примеру есть функция:

Function Identity() As Long
Dim Rst As Recordset
Set Rst = Application.CurrentProject.Connection.Execute("Select @@Identity as N")
Identity = Rst!N
Rst.Close
Set Rst = Nothing
End Function

Нужен ли оператор Set Rst = Nothing. Он что-то еще делает кроме присвоения пустого указателя? Если нет - то оператор лишний. Все равно к переменой после выхода из функции нет доступа.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32012632
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужен. По идее ссылка на обьект должна умереть автоматом, но это от чего-то происходит не всегда. Так что так надежней. Да и оптимизация кода не в этом. Зачем из-за @@Identity создавать такой тяжелый обьект как рекордсет? самое оптимальное в этом случае - использовать команду с выходным параметром.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32012640
V. Motchulsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, Павел, я согласен обьект тяжелый - из-за одной переменной целый Recordset.
Но как по другому написать не знаю. Придерживаюсь мнения что чем короче программа тем лучше, ну кроме конечно исключений.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32012657
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На сервере создаем процедурку:

Create Procedure dbo.sp_Identity
As
Return @@Identity

и дергаем ее таким кодом:
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
cmd.ActiveConnection = CurrentProject.Connection
cmd.CommandText = "dbo.sp_Identity"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter(, adInteger, adParamReturnValue)
cmd.Prepared = False
cmd.Execute , , adExecuteNoRecords
MsgBox cmd.Parameters(0)
Set cmd = Nothing

Можно конечно загнать по максимуму значения прямо в метод Execute, но с моей точки зрения он станет совершенно нечитаем. А так все наглядно. Вот это, по моему, и есть оптимизация кода.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32012747
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно оптимизировать и дальше. Я берусь утверждать, что запрашивать @@Identity с сервера незачем. Если только вы не организовали логику приложения на клиенте. А это не только не оптимально, но и принципиально неправильно.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32012797
V. Motchulsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сначала на счет оптимизации.
У нас с Вами могут быть разные критерии. Я придерживаюсь критерия что большинство рутинной работы должен делать компютер, в том числе и при написании програм. Для меня програмирование сначала часть бизнеса а потом искуство.
С точки зрения бизнеса надо написать в кратчайший срок действуюшее приложение, с точки зрения искуства - что на это все и еще было приятно посмотреть. Поэтому я редко переписываю то что работает, но писать всегда надо лучше чем вчера.
Обьект Command посмотрел, чесно говоря он мне не понравился. Уж слишком много подготовительной работы. Функция которую я написал в примере немного простовата для обсуждения - один параметр. А если три параметра? Не кажется Вам что немного сложновато указывать, что возвращаемый параметр - это строка, и что ее длина столько то символов, и что в конце-концов это еще и возвращаемый параметр. В добавку этот параметр надо еще к списку приклеить. Что-то уж больно старыми временами попахивает, когда "тупой" машине все надо было разжовывать до последнего байта (тем более что эта информация уже есть на сервере!). А зачем тогда SQL - что б упростить работу с наборами данных, а зачем ADO - что б ее (работу) вернуть обратно что ли к ручной манипуляции данными.

...берусь утверждать, что запрашивать @@Identity с сервера незачем.
Как выяснилось действительно незачем. Написал функцию на этапе перехода от БД Accessa до SQL, когда изучал тригеры. Документация (Help) в Accessе по отношению к adp прямо таки никудышняя. Тут то выяснилось что тригеры вещь хорошая но со стандартными средствами не работают. Открываем таблицу, редагируем запись - и какая то страная ошибка, типа указатель на запись неверный или что-то еще, уже к счастью не помню. И вообще не понимаю, почему например в окне Access не сделать вьюшку тригеров, или хотя бы пометить таблицы в которых есть тригеры.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32012841
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>У нас с Вами могут быть разные критерии.

Согласен. Другое дело что в себя включает сам термин 'оптимизация кода'? Оптимизация кода - это не есть оптимизация бизнесс процессов. Но это отдельная и непростая тема. Скажу только, что с точки зрения мат. теории любой программный код неоптимален.

>Не кажется Вам что немного сложновато указывать, что возвращаемый параметр - это строка, и что ее длина столько то символов, и что в конце-концов это еще и возвращаемый параметр. В добавку этот параметр надо еще к списку приклеить. Что-то уж больно старыми временами попахивает, когда "тупой" машине все надо было разжовывать до последнего байта (тем более что эта информация уже есть на сервере!). А зачем тогда SQL - что б упростить работу с наборами данных, а зачем ADO - что б ее (работу) вернуть обратно что ли к ручной манипуляции данными.

Можно и не указывать. У объекта Command есть метод .Refresh, который сам зпаполнит коллекцию параметров. Однако везде рекомендуется самостоятельно заполнять эту коллекцию для, опять же, оптимизации быстродействия.

>Тут то выяснилось что тригеры вещь хорошая но со стандартными средствами не работают. Открываем таблицу, редагируем запись - и какая то страная ошибка, типа указатель на запись неверный или что-то еще, уже к счастью не помню. И вообще не понимаю, почему например в окне Access не сделать вьюшку тригеров, или хотя бы пометить таблицы в которых есть тригеры.

Можно чуточку подробнее про эти проблемы? Триггеры, например, спокойно создаются, редактируются и удаляются прямо из окна А2K. А вообще то аксесс никогда не претендовал на звание Case системы. Для описанных вами проблем существуют отличные средства - ErWin, например.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32012848
V. Motchulsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел. Разрешите Вас поблагодорить за конструктивный диалог.
Вот проблема с которой я когда-то столкнулся

CREATE TABLE [dbo].[TABLE1]
([ID] [int] IDENTITY (1, 1) NOT NULL ,
[Value] [int] NULL) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TABLE2] ([ID] [int] IDENTITY (10, 1) NOT NULL ,
[Value] [int] NULL) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TABLE1] WITH NOCHECK ADD
CONSTRAINT [PK_TABLE1] PRIMARY KEY NONCLUSTERED
([ID]) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TABLE2] WITH NOCHECK ADD
CONSTRAINT [PK_TABLE2] PRIMARY KEY NONCLUSTERED
([ID]) ON [PRIMARY]
GO
Create Trigger TABLE1_Insert
On dbo.TABLE1
For Insert
As
Insert Table2 (Value) SELECT Value FROM Inserted
GO

Открываем таблицу 1 чтобы ввести данные и получаем сообщение об ошибке.
Думая не я один наступил на эти "грабли". Войдите в положение человека ничего незнающего о @@Identity и
о механизме работы Access и что таблицы и триггер был явно посложнее чем в примере.

>Триггеры, например, спокойно создаются, редактируются и удаляются прямо из окна А2K. - Согласен. Но если в базе много таблиц (к тому же они могут быть созданы разными пользователями), память у нас тоже не идеальная, то чтоб посмотреть какие таблицы имеют триггеры надо их ручками перебрать. Немножко неудобновато.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32012859
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Думая не я один наступил на эти "грабли".

Это точно. Метод лечения:

Create Trigger TABLE1_Insert
On dbo.TABLE1
For Insert
As
Set Nocount On
Declare @Idt Int, @s VarChar(50)
Set @Idt = @@Identity

Insert Table2 (Value) SELECT Value FROM Inserted

Set @s = 'Select Identity(Int, ' + Cast(@Idt As VarChar(10)) +' ,1) As idt Into #Tmp'
Execute(@s)
Set Nocount Off

P.S.
В MSSQL 2K вместо #Table лучше использовать @Table.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация кода
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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