На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> alter table дает warning, который в Delphi возвращается как raise
    на Дельфи7 через АДО пытаюсь добавить поле в таблицу базы MSSQL2000:
    ExpandedWrap disabled
      with ADOQuery do
         begin
         SQL.Text := 'alter table Table1';
         SQL.Add('add Field123 varchar(255) NULL');
         ExecSQL;
         end;

    Полей в таблице уже много и СКЛ выдает варнинг:
    ExpandedWrap disabled
      Warning: The table 'Table1' has been created but
      its maximum row size (54548) exceeds the
      maximum number of bytes per row (8060). INSERT or UPDATE of a row in this table will fail
      if the resulting row length exceeds 8060 bytes.


    Но в дельфи на строке AdoQuery.ExecSQL вылезает RAISE.

    Т.е. если выполнить этот запрос на самом СКЛе, то поле добавится. Ну и появится это сообщение с предупреждением о превышении кол-ва байт на запись.

    Но почему в дельфи программа останавливается и поле не добавляется?
    Подскажите, как или чем это победить?
    Сообщение отредактировано: Bas -
      Цитата Voice @
      Но почему в дельфи программа останавливается и поле не добавляется?

      Видимо, потому что компонент так реагирует на warning
      Цитата Voice @
      Подскажите, как или чем это победить?

      Видимо, разве что изменением компонента
        Цитата Voice @
        почему в дельфи программа останавливается и поле не добавляется?

        Потомy что Management Studio использует Native SQL а не ADODB..

        Цитата Voice @
        Подскажите, как или чем это победить?

        Из своей программы создай хранимую процедуру, которая добавляет нужное поле.
        Выполни хранимую процедуру из своей программы.
          Цитата MIF @
          Потомy что Management Studio использует Native SQL а не ADODB..

          Точно? Если взять другого провайдера ?
          Цитата MIF @
          Выполни хранимую процедуру из своей программы.

          И это будет правильно. Модификацию параметров таблиц лучше проводить на сервере а не на клиенте, и желательно "выкинуть" ВСЕХ активных пользователей...., а то проблем может быть гораздо больше...
          Сообщение отредактировано: Bas -
            Цитата Bas @
            И это будет правильно. Модификацию параметров таблиц лучше проводить на сервере а не на клиенте, и желательно "выкинуть" ВСЕХ активных пользователей...., а то проблем может быть гораздо больше...

            Что значит "проводить на сервере"? Залезть на сервер по удаленке? И чем это лучше?

            Может, у ТС что-то типа админской софтины. А она должна уметь манипулировать метаданными без всяких костылей типа хранимок и прочего.
            Сообщение отредактировано: Fr0sT -
              Тогда софтину нвдо переписать на .NET языке. SqlConnection также использует NativeSql
                Цитата Fr0sT @
                Что значит "проводить на сервере"? Залезть на сервер по удаленке? И чем это лучше?

                Вообще-то при любых манипуляциях по изменению структуры данных реально работающей БД необходимо отключить всех её юзеров. А то можно и до дедлайна доиграцца.
                Цитата Fr0sT @
                Может, у ТС что-то типа админской софтины. А она должна уметь манипулировать метаданными без всяких костылей типа хранимок и прочего.
                Ага, голимый код на клиентах, а на сервере - ни строчки бизнес-правил и админ парится из...как он там на MS SQL... Даррагая редакция...етс...
                Цитата MIF @
                Тогда софтину нвдо переписать на .NET языке
                Радиус кривизны рук надо постараться к бесконечности приблизить, а не с бубном скакать. Независимо от языка и способа коннекта к БД.
                  C бубном можно долго скакать...

                  Думаю что проблема не в "бубне" а в структуре таблиц.
                  Сообщение отредактировано: Bas -
                    Цитата LMM @
                    Вообще-то при любых манипуляциях по изменению структуры данных реально работающей БД необходимо отключить всех её юзеров.

                    "Отключить юзеров" и "проводить на сервере" это таки две большие разницы
                      Цитата Fr0sT @
                      "Отключить юзеров" и "проводить на сервере" это таки две большие разницы

                      С точки зрения телодвижений админа БД - ДА! Я и не спорю.
                        Цитата Fr0sT @

                        "Отключить юзеров" и "проводить на сервере" это таки две большие разницы

                        Таки Да.
                        Ex. Два(3,4,5...) пользователя пытаются проделать
                        Цитата Voice @
                        SQL.Add('add Field123 varchar(255) NULL');
                        ExecSQL;

                        Что будет в результате? DDL будет в шоке если совсем не упадет в "спячку" пытаясь разобраться с юзьверями которые пытались завершить транзакции в старую структуру и с теми которые хотят новую структуру таблицы..
                        DDL операции надобно проводить без активных пользователей.
                          А что - кто-то на самом деле реально разрешает юзерам менять структуру базы? :whistle:
                            Цитата LMM @
                            А что - кто-то на самом деле реально разрешает юзерам менять структуру базы?

                            На темплате таблицах можно, но используется ОЧЕНЬ даже очень РЕДКО , почти НИКОГДА. Это - чесать правой рукой левое ухо.

                            Добавлено
                            Хотя... это возможно но надо соблюдать определенные правила.
                              Цитата Bas @
                              Это - чесать правой рукой левое ухо
                              Это очень мягко сказано! :D

                              Цитата LMM @
                              Хотя... это возможно но надо соблюдать определенные правила
                              Не-а, я на такое не пойду никогда. Потом гемору не оберёшься.
                              Сообщение отредактировано: LMM -
                                Цитата LMM @
                                Цитата LMM @ Сегодня, 21:20
                                Хотя... это возможно но надо соблюдать определенные правила
                                Не-а, я на такое не пойду никогда. Потом гемору не оберёшься.

                                Тоже этого не понимаю. Но это можно, можно даже создать БД через
                                Цитата Voice @
                                ExecSQL
                                . Зачем? Это другой вопрос.
                                  Цитата Bas @
                                  Зачем? Это другой вопрос.
                                  Разве что - в учебных целях. Попробовать что ли создать оракловую базу скриптом? :D Со всеми причиндалами...
                                    Цитата LMM @
                                    Разве что - в учебных целях.


                                    Мир огромен и разнообразен. Ни oдин человек не может об’ять и понять все детали мира.

                                    ЗЫ: MS распространяет апгрейты своего продукта Great Planes не путем передачи скриттов администраторам баз даннных клиентов, а путем рассылки экзешника, который выполняет DDL скрипты.

                                    ЗЫЫ: Ето - как черный лебедь. Никто ме мог и подумать, что черные лебеди существуют, пока не открылы Австралию.
                                    Сообщение отредактировано: MIF -
                                      Мож в холивары переберёмся? :popcorn:
                                        Да уж, давайте без специфики отечественных форумов - человек спрашивает, как сделать X, а ему многословно доказывают, что он дурак :)
                                          Цитата Fr0sT @
                                          Да уж, давайте без специфики отечественных форумов - человек спрашивает, как сделать X

                                          Х это мало, возьмем Z. Мы предложили варианты.

                                          Добавлено
                                          Цитата Fr0sT @
                                          что он дура

                                          Это Форум, тут нет дураков ,тут есть общение ....
                                            уххх, понаписали :)

                                            объясняю:
                                            есть некий сервис, в котором появляются данные в xml-файлах.
                                            моя софтина должна выкачивать новые файлы, формировать из них плоскую таблицу и заливать эти данные в одну большую таблицу фактов для олап-куба.

                                            так вот. В этих xml-файлах иногда появляются лишние поля (атрибуты). На всякий случай (для будущих реализаций) эти поля добавляются в т.фактов.
                                            И при попытке добавить поле, появляется варнинг от СКЛя, который вызывает исключение в приложении. Об этом и была создана эта тема.
                                              Цитата Voice @
                                              Об этом и была создана эта тема.


                                              Цитата Voice @
                                              на Дельфи7 через АДО пытаюсь добавить поле в таблицу базы MSSQL2000:

                                              Где внешний источник? Даже намека нет на xml источника ADO(ActiveX Data Objects).
                                              Вот и ответы.
                                                Цитата Bas @
                                                Где внешний источник? Даже намека нет на xml источника ADO(ActiveX Data Objects).

                                                Я так понял, у него нет именно источника xml, просто читает. Потому и не упоминал
                                                  Voice
                                                  Я в базе от MS в Business Contact Manager видел такой пример:
                                                  Они сделали заранее лишних 50 полей, в другой таблице названия этих полей и кол-во используемых. И если нужно новое поле,они физически не изменяет базу.
                                                    Цитата ^D^ima @
                                                    Они сделали заранее
                                                    Всё лучше, чем по живому менять структуру!
                                                      Добавь таблицу с тремя полями: айди записи в первой таблице, имя тега, содержание тега. Все неоые теги можно туда записывать без необходимости изменять структуру на ходу.
                                                      А новые поля можно добавлять по результатам анализа содержания таблицы. Если тегипоявился один раз, то его можно проигнорировать, а если часто, то включить в основную таблицу.
                                                        Цитата LMM @
                                                        Всё лучше, чем по живому менять структуру!

                                                        +++++

                                                        Цитата ^D^ima @
                                                        Они сделали заранее лишних 50 полей

                                                        Зачем??? Вы не помните когда 256М это было "счастье"
                                                        Цитата ^D^ima @
                                                        И если нужно новое поле,они физически не изменяет базу.

                                                        Если надо больше параметров , чем Выше изложеннон?
                                                          Больше 50 кастомных полей не разрешается
                                                            Цитата Bas @
                                                            Где внешний источник? Даже намека нет на xml источника ADO(ActiveX Data Objects).
                                                            Вот и ответы.


                                                            Цитата Fr0sT @
                                                            Я так понял, у него нет именно источника xml, просто читает. Потому и не упоминал

                                                            правильно. Xml я обрабатываю сам.
                                                            Потом формирую запрос вида:
                                                            ExpandedWrap disabled
                                                              insert into (...)
                                                              select 'qwe', 'rty'...

                                                            этот запрос уходит через ADO. Если я вижу лишнее поле, то пытаюсь его добавить (ессно ПЕРЕД вставкой данных). Ну и там вываливается вышеописанная ошибка.

                                                            Цитата MIF @
                                                            Добавь таблицу с тремя полями: айди записи в первой таблице, имя тега, содержание тега. Все неоые теги можно туда записывать без необходимости изменять структуру на ходу.

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

                                                            LkpFields:
                                                            idFieldName
                                                            1Field1
                                                            2Field2
                                                            ......


                                                            MainTbl
                                                            RowIdFieldIdAValue
                                                            11aaa
                                                            12bbb
                                                            21ccc


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

                                                            Т.е. на выходе мы все равно должны получить плоскую таблицу. Так проще это делать сразу.
                                                              Цитата Voice @
                                                              на выходе мы все равно должны получить плоскую таблицу
                                                              Или результат запроса из мастер-таблицы и связанных с ней данных в ещё каких-то таблицах.
                                                                Цитата LMM @
                                                                Или результат запроса из мастер-таблицы и связанных с ней данных в ещё каких-то таблицах.

                                                                че? вообще не понял
                                                                Сообщение отредактировано: Voice -
                                                                  Voice,а чем подход с хранимой процедурой не устроил?
                                                                    В свете задачи вариант с заранее зарезервированными полями кажется более разумным, хотя и потребует некоторых дополнительных действий по сопоставлению безликих полей конкретным атрибутам. Если же говорить о сабже, то совет прежний - либо изменить исходники компонента, либо попробовать другой компонент.
                                                                    Сообщение отредактировано: Fr0sT -
                                                                      Цитата ^D^ima @
                                                                      Они сделали заранее лишних 50 полей, в другой таблице названия этих полей и кол-во используемых.

                                                                      Скромный вопрос. Зачем???
                                                                        В программе есть настраиваемые поля пользователя. Мы можем на разные формы добавить до 50 кастомных полей. Очень удобно между прочем
                                                                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                        0 пользователей:


                                                                        Рейтинг@Mail.ru
                                                                        [ Script execution time: 0,0820 ]   [ 17 queries used ]   [ Generated: 28.03.24, 08:46 GMT ]