Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Вниз

Можно ли вносить изменения...   Найти похожие ветки 

 
PrettyFly   (2003-08-29 14:34) [0]

Можно ли как-нибудь вносить изменения в DataSet организованный из двух таблиц, например:

SELECT A.*, B.Name
FROM A INNER JOIN И ON(B.IDA = A.ID)

т.е. так, чтобы и в базе всё правильно менялось?


 
Карелин Артем   (2003-08-29 14:39) [1]

Да, только надо самостоятельно реализовывать логику на изменение таблиц с помощью IbDataSet или IBUpdateSQL в виде соотв. запросов.


 
GRAND   (2003-08-29 15:58) [2]

PrettyFly © (29.08.03 14:34)

Если юзать FIBPlus, то там с этим гемора на порядок меньше.


 
Bless   (2003-08-29 16:19) [3]

А тот же вопрос, только применительно к MSSQL через ADO-шные компоненты?


 
Bless   (2003-09-01 09:24) [4]

Что, никто не знает? Или нельзя никак?


 
Reindeer Moss Eater   (2003-09-01 09:34) [5]

А тот же вопрос, только применительно к MSSQL
MSSQL позволяет редактировать такие наборы данных.


 
Sergey,Masloff   (2003-09-01 09:39) [6]

GRAND © (29.08.03 15:58) [2]
>Если юзать FIBPlus, то там с этим гемора на порядок меньше.
Никаких проблем нет даже если FIBPlus не использовать


 
Bless   (2003-09-01 11:02) [7]

>MSSQL позволяет редактировать такие наборы данных.

В гриде отображается результат запроса
SELECT t1.*, t2.* FROM t1, t2 WHERE t1.kod=t2.kod

При попытке изменить в гриде что-нибудь, возникает ошибка

Project Project1.exe raised exception class EOleException with message "Insufficient key column information for updating or refreshing". Process stopped. Use Step or Run to continue.

В чем может быть проблема?


 
Bless   (2003-09-01 11:04) [8]

А с запросом
SELECT t1.* FROM t1, t2 WHERE t1.kod=t2.kod
редактируется без проблем.


 
Reindeer Moss Eater   (2003-09-01 11:05) [9]

Тебе же сказали по-русски: недостаточно информации о ключевых полях таблиц, входящих в объединение


 
Bless   (2003-09-01 11:10) [10]

Гм... На русский я и сам перевести могу. Но яснее от этого не стало. Зачем этому запросу нужна информация о ключевых полях объединяемых таблиц? И как определить, что ее уже достаточно? А если у меня нет ни одного ключа в таблице?


 
Reindeer Moss Eater   (2003-09-01 11:14) [11]

А если у меня нет ни одного ключа в таблице?
Обновление "нужных записей" станет невозможным.


 
Bless   (2003-09-01 11:25) [12]

>Обновление "нужных записей" станет невозможным.

Вот мои вышеприведенные примеры:
1)SELECT t1.*, t2.* FROM t1, t2 WHERE t1.kod=t2.kod
2)SELECT t1.* FROM t1, t2 WHERE t1.kod=t2.kod

Но ведь во втором моем примере обновление работает. Хотя нет ни одного ключа в таблице! А ведь данные из таблицы t1 выбраны точно те же, что и в первом примере запроса!
Так почему в первом случае инфирмации о ключевых полях не достаточно, а во втором - хватает?


 
Reindeer Moss Eater   (2003-09-01 11:29) [13]

Но ведь во втором моем примере обновление работает.

SELECT t1.* - все поля присутствуют, значит и ключевые там есть.
Когда "все работает" обновляются поля из обеих таблиц или одной?


 
Bless   (2003-09-01 11:38) [14]

>SELECT t1.* - все поля присутствуют, значит и ключевые там есть.

В запросе SELECT t1.*, t2.* тоже все поля присутствуют, а не работает

Может, мы понимаем разные вещи под словом ключевое поле?
Если под "ключевым" имеется ввиду поле, по которому создан индекс, то в таблице t1 таких полей нет.

>Когда "все работает" обновляются поля из обеих таблиц или одной?

Из одной наверное. Ведь данные, отображенные в гриде- t1.* -выбираются только из одной таблицы.


 
Reindeer Moss Eater   (2003-09-01 11:53) [15]

Из одной наверное. Ведь данные, отображенные в гриде- t1.* -выбираются только из одной таблицы.

Помнится мне что было ограничение на набор обновляемых полей.
Сервер "поймет" какой update надо ему выполнить, если обновляются поля из одной таблицы, а не многих.


 
Zacho   (2003-09-01 11:56) [16]


> Bless (01.09.03 11:38) [14]
> Если под "ключевым" имеется ввиду поле, по которому создан
> индекс, то в таблице t1 таких полей нет

Что, и первичного ключа нет ? Нехорошо. Черевато аномалиями.


 
Bless   (2003-09-01 12:25) [17]

>Помнится мне что было ограничение на набор обновляемых полей.
>Сервер "поймет" какой update надо ему выполнить, если обновляются
>поля из одной таблицы, а не многих.

О, это уже что-то. Спасибо.
Так что, если мне кровь из носу надо обновлять данные из нескольких таблиц, то надо извращаться? А никаких механизмов, облегчающий жизнь вроде RequestLive или UpdateSQL или их аналогов/заменителей нету?

>Что, и первичного ключа нет ? Нехорошо. Черевато аномалиями.

Да это тестовые таблицы по 5 записей в каждой :)


 
HSolo   (2003-09-01 14:26) [18]

Зачем же извращаться? Напишите процедуру вставки/обновления, вполне себе штатный способ. Откуда дергать - я пользую FIBPlus, там есть для таких вещей TpFIBUpdateObject


 
Bless   (2003-09-01 14:40) [19]

>Зачем же извращаться? Напишите процедуру вставки/обновления,
>вполне себе штатный способ.
А где эти процедуры пишутся? Напоминаю, речь идет об MSSQL и ADO
>Откуда дергать - я пользую FIBPlus,
>там есть для таких вещей TpFIBUpdateObject

Если буквы IB в слове FIBPlus обозначают InterBase, то это не подходит. А если нет - то что это такое и где его взять.


 
HSolo   (2003-09-01 15:08) [20]

Извините, проморгала, что речь идет уже об MSSQL. FIBPlus - да, это для IB.
А процедуры пишутся средствами SQL-сервера. Имеются в виду хранимые процедуры.


 
Bless   (2003-09-03 09:22) [21]

В общем, добавил ключи в таблицу и все заработало.
Вот бы еще понять, ПОЧЕМУ без ключей работает не всегда и ПОЧЕМУ работает с ключами...


 
Danilka   (2003-09-03 10:08) [22]

Bless (03.09.03 09:22)
Ключ это не индекс, ключ - это поле или набор полей однозначно идентифицирующие запись.
А проблемы из-за отсутствия ключей, например такие:

Когда ты изменяешь в датасете какую-нибудь запись делается запрос к серверу, типа:
update ИМЯ_ТАБЛИЦЫ
set ИЗМЕНЯЕМОЕ_ПОЛЕ = НОВОЕ_ЗНАЧЕНИЕ
where КЛЮЧЕВОЕ_ПОЛЕ = ЗНАЧЕНИЕ_КЛЮЧА_ИЗМЕНЯЕМОЙ_ЗАПИСИ

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


 
sniknik   (2003-09-03 10:21) [23]

Bless (03.09.03 09:22) [21]
> Вот бы еще понять...

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

так что ключ нужен, даже если вам он не нужен!


 
Reindeer Moss Eater   (2003-09-03 10:34) [24]

Вот бы еще понять, ПОЧЕМУ без ключей работает не всегда и ПОЧЕМУ работает с ключами...

Мы на рынке.
Вы покупаете арбузы (записи) у продавца (сервера) говоря продавцу : эй, продавец (SQL сервер), дай мне вон тот круглый зеленый арбуз (вон ту запись в таблице). На что продавец (SQL сервер) резонно отвечает: они у меня все зеленые и все круглые (ключ короче говоря давай).


 
Bless   (2003-09-03 12:30) [25]

Прошу прощения. Я сказал, что добавил ключи. Имел ввиду, что ввел еще одно UNIQUE-поле в каждую таблицу.
Но до введение нового уникального поля у меня и так не было повторяющихся записей, то есть был "набор полей, однозначно идентифицирующих запись", а значит, был ключ!
А не работало для запроса 1) и работало для запроса 2)
( см. [12] )
Но ведь количество строк в обеих случаях одинаково. Просто меньше столбцов!

Если должно работать с ключом (не путать с индексом!), то почему не работает в случае 1)? Ведь ключ есть в обеих таблицах, если понимать под ключом набор полей, однозначно идентифицирующих запись.
Если должно НЕ работать без индекса, то почему работает в случае 2)?

>Reindeer Moss Eater © (03.09.03 10:34) [24]
>Мы на рынке.
>Вы покупаете арбузы (записи) у продавца (сервера) говоря
>продавцу : эй, продавец (SQL сервер), дай мне вон тот круглый
>зеленый арбуз (вон ту запись в таблице). На что продавец (SQL
>сервер) резонно отвечает: они у меня все зеленые и все круглые
>(ключ короче говоря давай).

:) Это, конечно, правильно. Но я понимал под ключом индекс. И потому говорил, что в таблицах нет ключа. В свете нового (для меня ) определения ключа, данного Danilka-ой, говорю: ключ есть. И ситуация с арбузами теперь приблизительно такая:

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

Если захотите проверить, привожу свои таблицы

t1
-------------------
kod(int) name (char(10))
1 qqq
1 b
2 k
2 b
3 c
3 d
4 e

t2
---------------------
kod(int) ChildKod(int) name(char(10))
2 22 bbb
3 33 c
4 44 d

Индексов нет.

SELECT t1.*, t2.* FROM t1, t2 WHERE t1.kod=t2.kod
- нельзя менять.

SELECT t1.* FROM t1, t2 WHERE t1.kod=t2.kod
- можно менять.


 
Danilka   (2003-09-03 12:45) [26]

Bless (03.09.03 12:30)
Дело в том, что сервер должен знать, какое поле у него является ключевым.
Для этого тебе надо исполнить скрипт:

alter table ИМЯ_ТАБЛИЦЫ
add constraint ИМЯ_КЛЮЧА
primary key (ИМЯ_КЛЮЧЕВОГО_ПОЛЯ)


 
Danilka   (2003-09-03 12:46) [27]

Если в ключе несколько полей, то надо их перечислить через запятую.


 
Bless   (2003-09-03 15:38) [28]

А сам сервер не определяет, какие у таблицы поля ключевые?


 
Danilka   (2003-09-03 15:43) [29]

Bless (03.09.03 15:38)
нет. это определяет тот, кто проектирует таблицы - какие поля у него ключевые, какие нет.


 
Bless   (2003-09-03 15:46) [30]

Так почему работает
SELECT t1.* FROM t1, t2 WHERE t1.kod=t2.kod?


 
Danilka   (2003-09-03 15:57) [31]

Bless (03.09.03 15:46)
Это глюк такой. :))
На самом деле, если ключа нет, то какие-то запросы будут работать. Иногда. :))
Для полноценной работы с сервером ключи нужны обязательно. Почитай Мартина Грубера "Понимание SQL", есть на сайте Анатолия Подгорецкого в вордовском формате:
http://www.podgoretsky.com/


 
Reindeer Moss Eater   (2003-09-03 16:02) [32]

Так почему работает
SELECT t1.* FROM t1, t2 WHERE t1.kod=t2.kod?


Потому что обновляются поля только одной таблицы.


 
Bless   (2003-09-03 16:19) [33]

Всем спасибо.



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

Форум: "Базы";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.011 c
14-82459
Ykropsev
2003-09-07 12:49
2003.09.25
Какая прога нужна для воспроизведения флэшек в формате swf ?


14-82490
III
2003-09-05 14:24
2003.09.25
Помогите с симплекс методом!!!


3-82107
Жорж
2003-09-04 17:27
2003.09.25
Запись в базу через Button


6-82351
Alex Soloviov
2003-07-26 16:28
2003.09.25
Компоненты TServerSocket, TClientSocket и человеческие ручки


1-82225
-=[SDA]=-
2003-09-12 11:20
2003.09.25
Как узнать имя картинки (файла) в BitBtn?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский