Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE

Сергей П.
Дата: 09.11.2004 17:39:14
Ситуация:
Есть типизированный DataSet, в нем таблица, в качестве Primary Key в таблице используется столбец с типом данных RAW(16).
При попытке добавить ВТОРУЮ строку в таблицу получаем:
"Exception : Column 'MYID' is constrained to be unique. Value 'System.Byte[]' is already present."

Для .NET Framework тип данных RAW(16) - это System.Byte[], а преобразование (System.Byte[]).ToString() = "System.Byte[]"...

Конечно удаление Primary Key в таблице позволяет добавлять и удалять строки, но как-то это мне кажется неправильно...

Кто-нибудь знает как обойти данную проблему ?

Спасибо
Worobjoff
Дата: 09.11.2004 19:33:06
А объектом SEQUENCE пользуетесь?
Сергей П.
Дата: 10.11.2004 11:59:02
Нет, не пользуюсь и, если честно, не знаю как это мне должно помочь.
Не расскажете куда "копать" ?
Worobjoff
Дата: 10.11.2004 12:33:36
MSDN:
General Considerations for Using Visual Database Tools with Oracle Databases
Creating an Insert Values Query
Сергей П.
Дата: 10.11.2004 12:47:16
Проблема, как мне думается, не в Oracle, а в .NET Framework'e

Проблем с добавлением новых записей в Oracle нет - есть проблема добавления записей в таблицу DataSet'a если Primary Key столбец имеет тип "base64Binary", при добавлении 2-ой строки в таблицу DataSet'a (!).

До добавления записей собственно в Oracle дело не доходит.

см. выше
Worobjoff
Дата: 10.11.2004 13:18:07
InforceConstraints = False
или значение PK давать при добавлении строки.
кузя
Дата: 10.11.2004 13:18:11
Сергей П.
Проблема, как мне думается, не в Oracle, а в .NET Framework'e
скорее всего, проблема в твоей программе.
тебе нужно при добавлении записей в DataSet присваивать первичному ключу уникальные значения. первая запись добавляется (в твоем случае приходится только догадываться) со значением DefaultValue, а вот вторая запись с таким же значением при добавлении вызовет exception "Column 'MYID' is constrained to be unique".
Сергей П.
Дата: 10.11.2004 15:06:09
Итак по порядку:

1. Есть таблица в БД Oracle, в качестве первичного ключа столбец "ID" типа RAW (16) - массив байт;

2. Есть DataSet со сгенеренной таблицей из БД Oracle, в качестве первичного ключа столбец "ID" типа base64Binary (так сгенерила сама студия);

3. Значения "по умолчанию" для "ID" нет - все значения генерю руками.

4. Добавляем 1-ую строку в таблицу:
- первичный ключ уникальный:
NewRow["ID"] = System.Guid.NewGuid().ToByteArray();
- заполняем остальные столбцы данными;
- добавляем строку в таблицу - все ОК;

5. Добавляем 2-ую строку:
- первичный ключ тоже УНИКАЛЬНЫЙ
- заполняем остальные столбцы данными;
- при добавлении строки в таблицу получаем

Exception : Column 'ID' is constrained to be unique. Value 'System.Byte[]' is already present.

Мои предположения:
при проверке уникальности первичного ключа таблицы в DataSet'e, Framework приводит его (значение ключа) к строке (ToString()), а преобразование
string SomeStr = ((System.Byte[])ID).ToString();
выдает "System.Byte[]"
Т.е. т.к. значение второго ключа после преобразования к строке тоже равно "System.Byte[]" - срабатывает ограничение на уникальность первичного ключа в таблице.
Worobjoff
Дата: 10.11.2004 15:24:51
Попробуй так:
To_Char (Поле RAW) AS Псевдоним
в SelectCommand.CommandText
Сергей П.
Дата: 10.11.2004 16:25:43
Worobjoff
Попробуй так:
To_Char (Поле RAW) AS Псевдоним
в SelectCommand.CommandText

Народ, ну почитайте внимательнее - ругается на нарушение уникальности первичного ключа в таблице DataSet'e.

Заполнение таблицы данными происходит корректно, т.к. при этом не производится проверка на уникальность первичного ключа.

Если я выключу проверку:
DataSet.EnforceConstraints = false;

то ошибка исчезает, и я могу добавлять сколько угодно строк, а потом сделать:
oracleDataAdapter.Update(DataSet.MyTable.GetChanges());

и все данные обновятся, если не было повторяющихся значений в "ID".