Здравствуйте,пишу на C#, имеется бд Oracle с суррогатными ключами.
Пример двух таблиц:
CREATE TABLE Classes(
classID NUMBER(*,0),
grade VARCHAR2(10) UNIQUE NOT NULL,
CONSTRAINT Classes_pk PRIMARY KEY (classID)
);
CREATE TABLE StudWorkload(
classID NUMBER(*,0),
hoursPerWeek NUMBER NOT NULL,
CONSTRAINT StudWorkload_pk PRIMARY KEY (classID),
CONSTRAINT StudWorkload_fk_classID FOREIGN KEY (classID) REFERENCES Classes(classID)
);
Ключи генерируются автоматически и пользователь на уровне приложения (C#) дожлен видеть в таблице StudWorkload поле класса а не id класса, для полноценной работы с ним. Использую DataGridView. Для полноценной работы ему нужны selectCommand,insertCommand,updateCommand,deleteCommand в TableAdapter, находящимся в DataSet.
Вот например команды для selecta и удаления:
SELECT CLASSES.GRADE, STUDWORKLOAD.HOURSPERWEEK
FROM STUDWORKLOAD, CLASSES
WHERE STUDWORKLOAD.CLASSID = CLASSES.CLASSID
DELETE FROM STUDWORKLOAD
WHERE (CLASSID IN (SELECT CLASSID
FROM STUDENTS
WHERE (FIO = :FIO)))
AND (HOURSPERWEEK = :HOURSPERWEEK)
Возникла проблема с параметром добавления в InsertCommand, по идее, для таблицы STUDWORKLOAD генерируется так:
INSERT INTO STUDWORKLOAD
(CLASSID, HOURSPERWEEK)
VALUES (:CLASSID, :HOURSPERWEEK)
Но так как в данных у меня GRADE и HOURSPERWEEK нужно что-то типа этого:
INSERT INTO STUDWORKLOAD
(CLASSID, HOURSPERWEEK)
SELECT CLASSES.CLASSID, :HOURSPERWEEK AS EXPR1
FROM CLASSES, STUDWORKLOAD ST
WHERE (CLASSES.GRADE = :GRADE)
DataGridView не цепляет этот InsertCommand, думаю из-за того что параметр :HOURSPERWEEK расположен не там где нужно, Как сделать нормальный insertCommand, чтобы его подхватывал DataGridView? И если это невозможно, то какое элегантное решение на С# с импользованием каких компонентов существует для этого? (структуру таблиц и ключей менять нельзя так как таблиц больше и могу начаться проблемы если портить 3 нормальную форму)