|
Оптимизация кода
|
|||
---|---|---|---|
#18+
К примеру есть функция: 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. Он что-то еще делает кроме присвоения пустого указателя? Если нет - то оператор лишний. Все равно к переменой после выхода из функции нет доступа. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2001, 07:36 |
|
Оптимизация кода
|
|||
---|---|---|---|
#18+
Нужен. По идее ссылка на обьект должна умереть автоматом, но это от чего-то происходит не всегда. Так что так надежней. Да и оптимизация кода не в этом. Зачем из-за @@Identity создавать такой тяжелый обьект как рекордсет? самое оптимальное в этом случае - использовать команду с выходным параметром. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2001, 08:03 |
|
Оптимизация кода
|
|||
---|---|---|---|
#18+
Да, Павел, я согласен обьект тяжелый - из-за одной переменной целый Recordset. Но как по другому написать не знаю. Придерживаюсь мнения что чем короче программа тем лучше, ну кроме конечно исключений. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2001, 08:26 |
|
Оптимизация кода
|
|||
---|---|---|---|
#18+
На сервере создаем процедурку: 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, но с моей точки зрения он станет совершенно нечитаем. А так все наглядно. Вот это, по моему, и есть оптимизация кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2001, 09:39 |
|
Оптимизация кода
|
|||
---|---|---|---|
#18+
А можно оптимизировать и дальше. Я берусь утверждать, что запрашивать @@Identity с сервера незачем. Если только вы не организовали логику приложения на клиенте. А это не только не оптимально, но и принципиально неправильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2001, 06:09 |
|
Оптимизация кода
|
|||
---|---|---|---|
#18+
Сначала на счет оптимизации. У нас с Вами могут быть разные критерии. Я придерживаюсь критерия что большинство рутинной работы должен делать компютер, в том числе и при написании програм. Для меня програмирование сначала часть бизнеса а потом искуство. С точки зрения бизнеса надо написать в кратчайший срок действуюшее приложение, с точки зрения искуства - что на это все и еще было приятно посмотреть. Поэтому я редко переписываю то что работает, но писать всегда надо лучше чем вчера. Обьект Command посмотрел, чесно говоря он мне не понравился. Уж слишком много подготовительной работы. Функция которую я написал в примере немного простовата для обсуждения - один параметр. А если три параметра? Не кажется Вам что немного сложновато указывать, что возвращаемый параметр - это строка, и что ее длина столько то символов, и что в конце-концов это еще и возвращаемый параметр. В добавку этот параметр надо еще к списку приклеить. Что-то уж больно старыми временами попахивает, когда "тупой" машине все надо было разжовывать до последнего байта (тем более что эта информация уже есть на сервере!). А зачем тогда SQL - что б упростить работу с наборами данных, а зачем ADO - что б ее (работу) вернуть обратно что ли к ручной манипуляции данными. ...берусь утверждать, что запрашивать @@Identity с сервера незачем. Как выяснилось действительно незачем. Написал функцию на этапе перехода от БД Accessa до SQL, когда изучал тригеры. Документация (Help) в Accessе по отношению к adp прямо таки никудышняя. Тут то выяснилось что тригеры вещь хорошая но со стандартными средствами не работают. Открываем таблицу, редагируем запись - и какая то страная ошибка, типа указатель на запись неверный или что-то еще, уже к счастью не помню. И вообще не понимаю, почему например в окне Access не сделать вьюшку тригеров, или хотя бы пометить таблицы в которых есть тригеры. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2001, 10:25 |
|
Оптимизация кода
|
|||
---|---|---|---|
#18+
>У нас с Вами могут быть разные критерии. Согласен. Другое дело что в себя включает сам термин 'оптимизация кода'? Оптимизация кода - это не есть оптимизация бизнесс процессов. Но это отдельная и непростая тема. Скажу только, что с точки зрения мат. теории любой программный код неоптимален. >Не кажется Вам что немного сложновато указывать, что возвращаемый параметр - это строка, и что ее длина столько то символов, и что в конце-концов это еще и возвращаемый параметр. В добавку этот параметр надо еще к списку приклеить. Что-то уж больно старыми временами попахивает, когда "тупой" машине все надо было разжовывать до последнего байта (тем более что эта информация уже есть на сервере!). А зачем тогда SQL - что б упростить работу с наборами данных, а зачем ADO - что б ее (работу) вернуть обратно что ли к ручной манипуляции данными. Можно и не указывать. У объекта Command есть метод .Refresh, который сам зпаполнит коллекцию параметров. Однако везде рекомендуется самостоятельно заполнять эту коллекцию для, опять же, оптимизации быстродействия. >Тут то выяснилось что тригеры вещь хорошая но со стандартными средствами не работают. Открываем таблицу, редагируем запись - и какая то страная ошибка, типа указатель на запись неверный или что-то еще, уже к счастью не помню. И вообще не понимаю, почему например в окне Access не сделать вьюшку тригеров, или хотя бы пометить таблицы в которых есть тригеры. Можно чуточку подробнее про эти проблемы? Триггеры, например, спокойно создаются, редактируются и удаляются прямо из окна А2K. А вообще то аксесс никогда не претендовал на звание Case системы. Для описанных вами проблем существуют отличные средства - ErWin, например. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2001, 14:03 |
|
Оптимизация кода
|
|||
---|---|---|---|
#18+
Павел. Разрешите Вас поблагодорить за конструктивный диалог. Вот проблема с которой я когда-то столкнулся 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. - Согласен. Но если в базе много таблиц (к тому же они могут быть созданы разными пользователями), память у нас тоже не идеальная, то чтоб посмотреть какие таблицы имеют триггеры надо их ручками перебрать. Немножко неудобновато. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2001, 18:44 |
|
Оптимизация кода
|
|||
---|---|---|---|
#18+
>Думая не я один наступил на эти "грабли". Это точно. Метод лечения: 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2001, 01:48 |
|
|
start [/forum/topic.php?fid=45&fpage=1859&tid=1683759]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
others: | 267ms |
total: | 419ms |
0 / 0 |