Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.13;
Скачать: CL | DM;

Вниз

Создать поле в табл Access из Delphi6 через адо query   Найти похожие ветки 

 
Inspired ©   (2004-05-13 23:44) [0]

Господа, доброй ночи.
Подскажите, намекните.
Общаюсь с базой аксэс черед АДО query (адо, конечно, не писк, понимаю, ну решил так).
Требуется создать новую таблицу, а в ней новые поля (второе насущней)
генерирую запрос
qData.SQL.Add("Alter Table Data add column "+ColName + " ");
....
qData.SQL.Add("Character("+inttostr(ColLen)+")");
qData.Prepared := true;
qData.ExecSQL;

на exec"е ошибка, не информативная к сжл.
"Access violation at address ....in module msado15.dll. Write of address..."

Аналогичный фокус с базой FOX проходит, пробовал. Но хочу access.
Полагаю, что ошибка в самом запросе, нужен какой то особый аксэсовский синтаксис. Может в названии типов, или еще что.
Если кто разбирался, подскажите. Благодарю-с


 
sniknik ©   (2004-05-14 00:22) [1]

Character - синонимы и эквиваленты
TEXT(n), ALPHANUMERIC, CHARACTER, STRING, VARCHAR, NCHAR, NVARCHAR
не изза этого, скорее имя неправильное задаеш или длинну
попробуй так
qData.SQL.Add("Alter Table Data add column ["+ColName + "] ");
...
//qData.Prepared := true;

> адо, конечно, не писк
конечно, а баги в код Пушкин пишет.


 
Inspired ©   (2004-05-14 22:00) [2]

>> адо, конечно, не писк
>конечно, а баги в код Пушкин пишет.
баги - где именно.
Не писк - только в смысле скоростей.

>скорее имя неправильное задаеш или длинну
скорее правильное, конкретнее "name", причем его 100% в таблице нет
длина 20, преобразование в строку походит верно
пробелов везде достаточно, слова не слипаются

а квадратные скобки - это чисто приблуда Accessa? Так и думал, что что-нибудь такое надо.
В запросе к таблицам Fox они не надобны, все проходит.
Ладно, попробую.


 
sniknik ©   (2004-05-15 01:34) [3]

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

> скорее правильное, конкретнее "name", причем его 100% в таблице нет
> длина 20, преобразование в строку походит верно
> пробелов везде достаточно, слова не слипаются
каким местом это надо было почуствовать? или принять за аксиому что у тебя все правильно? с чего тогда ошибки?
(не забудь второе исправление //)

квадратные скобки это гарантия что в ColName не задано зарезервированое слово.


 
Inspired ©   (2004-05-15 15:10) [4]

спасибо, но все равно ничего не вышло


 
Inspired ©   (2004-05-23 01:36) [5]

to sniknik
Мой выбор пал на ADO, т.к. вероятность, что его компоненты будут стоять на машине пользователя, куда выше, чем у BDE и тем более MSSQL. И для моих задач (~3-5 тыс записей, локально) его хватит.

to all
Покопался я еще и вот что выкопал. Другой объект adoquery с тем же connection все сделал, почему же думаю не пашет этот?
Дальше выясняется, что до выполнения вышеприведенного кода qData  использовался для выборки из той же таблицы
    qData.SQL.Clear;
    qData.SQL.Add("Select * From Data");
    qData.Open;
    ... //обход результатов
и она прошла успешно. После того как выборка стала не нужна qData закрывается
    qData.Close;
Так если эту выборку не сделать, то добавление колонки проходит. А если делать, то нет.
???Не подскажете, что еще нужно сделать, кроме qData.Close;???
Не верится, что query одноразовый.


 
sniknik ©   (2004-05-23 10:43) [6]

> Другой объект adoquery с тем же connection все сделал, почему же думаю не пашет этот?
при разных настройках в компоненте, поведение различается и очень сильно, если как пишеш делаеш те же действия с двумя и один работает другой нет, сравнивай настройки.


 
Inspired ©   (2004-05-23 11:51) [7]

ОК, поковыряюсь, чего не сбросилось.
Я эти query вручняк не настраивал. Вот как посадил их на форму, указал в инспекторе коннекшн и все. Первый отличается от второго, только тем, что уже использовался для открытия выборки. Весть код его использования привел (под "//обход результатов" скрыт цикл в три строки). Если ее не открывать, о все ок. Но я его закрыл. Может что-то еще при закрытии нужно сделать, кроме close?
В примерах в книгах объект ипользуеется один раз, и на том пример заканчивается, но его же можно юхать дальше.


 
Ломброзо ©   (2004-05-23 13:32) [8]

А Вы это ADO зря насилуете, потому что Microsoft для таких вот целей (работа с объектами БД, юзерами, ролями) специально сочинил ADOX. Импортируйте и поизучайте.


 
sniknik ©   (2004-05-23 16:03) [9]

> Я эти query вручняк не настраивал. Вот как посадил их на форму, указал в инспекторе коннекшн и все.
"коннекшн" один и тотже? или два с одинаковыми настройками?
в первом случае поведение должно быть одинаковым.
опиши как и что делаеш, в случае что не работает и с работающим случаем.


 
ZUK   (2004-05-23 22:23) [10]


> Ломброзо ©   (23.05.04 13:32) [8]

Если можно линки на литературу?


 
Ломброзо ©   (2004-05-23 22:38) [11]

В моём MSDN: help://MS.MSDNQTR.2003JUL.1033/ado270/htm/adoddlo1.htm

ADOX Fundamentals

Microsoft® ActiveX® Data Objects Extensions for Data Definition Language and Security (ADOX) is an extension to the ADO objects and programming model. ADOX includes objects for schema creation and modification, as well as security. Because it is an object-based approach to schema manipulation, you can write code that will work against various data sources regardless of differences in their native syntaxes.


 
Inspired ©   (2004-05-25 00:42) [12]

>Ломброзо ©   (23.05.04 13:32) [8]... Microsoft для таких вот целей (работа с объектами БД, юзерами, ролями) специально сочинил ADOX.
Про адох читал, но в Delphi6 не нашел. Они там есть?

>sniknik ©   (23.05.04 16:03) [9]
>"коннекшн" один и тотже?
Оно то и странно, что конекшн один и тот же.
>опиши как и что делаеш
Цепляюсь к базке с двумя таблицами
Сажаю на форму конекшн к базке
сажаю адатабле к одной таблице и query к другой
в FormCreate делаю следующее
открываюсь,
  c.Open; //это конекшн
из адотабле читаю данные, нормально.
  tProps.Open;
  tProps.Sort := "IsGroup DESC, Order ASC";
  tProps.First;
  while not tProps.Eof do begin
     ...
  end;//while
tProps остается открытой до конца сеанса

Далее обращаюсь к другой таблице через query
       qData.SQL.Clear;
       qData.SQL.Add("Select * From Data");
(***)   qData.Open;
       FillData(false);//читает данные из запроса
       qData.Close;
FormCreate закончился

Далее по действию пользователя пытаюсь добавить столбец в таблицу Data, уже пишу явный запрос.
  qData.SQL.Clear;
  qData.SQL.Add("Alter Table Data add column rrrrt string");
  qData.ExecSQL;
такой колонки в таблице точно нет.
Выдается ош. памяти.

Думаю в чем же подвох.
Сажаю на форму второй query, цепляю к томуже конекшену
Сажаю кнопку, в ее клике клике пишу тот же код
  qData.SQL.Clear;
  qData.SQL.Add("Alter Table Data add column rrrrt string");
  qData.ExecSQL;
отработал. пробную колонку rrrrt из таблицы удаляю. в том же сеансе при повторном клике на кнопку выдается челочеческое сообщение - колонка уже существует.

И вот если закомментировать строки обращения ко второй тавлице в FormCreate (отмечены (***)) , то и первый query работает нормально. Поэтому я и спрашиваю, как же правильно закрывать предыдущую выборку, чтобы выполнить новую команду?


 
sniknik ©   (2004-05-25 09:00) [13]

все правильно, во всяком случае то что показано, может чтото в  FillData "рушит" обьект (?), но тогда любое действие после с ним вы зовет AV. попробуй заменить запрос Alter на повторный селект к примеру.

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

Order зарезервированое слово (ORDER BY), лутше переименуй поле, или хотя бы бери в скобки [], независимо от того что он его по контексту вроде определяет.

и string поменяй на VarChar(255), это будет аналог но более "стандартизированный".

но проверил все как описано один в один, конечно исключая "...", "FillData", работает и так. возможные отличия и отличия - у меня Jet SP6 и D7.
возможно и от версии зависит. если не решится пришли пример с глюком (минимум кода с минимальной базой при которых это происходит, в архиве (!!!)), проверю при своих установках (jet ... ets.).



Страницы: 1 вся ветка

Текущий архив: 2004.06.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.036 c
14-1085410435
SPeller
2004-05-24 18:53
2004.06.13
Не пейте за рулём.


14-1085686536
Verg
2004-05-27 23:35
2004.06.13
Все! Хватит!


3-1085461631
korvin
2004-05-25 09:07
2004.06.13
Синтаксис серверных процедур.


14-1085520043
CS_XatRiX
2004-05-26 01:20
2004.06.13
DElphi na4alnaja stadija!!!!!!!


14-1085825965
Алхимик
2004-05-29 14:19
2004.06.13
Зачётная неделя





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский