Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE / 15 сообщений из 15, страница 1 из 1
09.11.2004, 17:39
    #32774199
Сергей П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
Ситуация:
Есть типизированный 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 в таблице позволяет добавлять и удалять строки, но как-то это мне кажется неправильно...

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

Спасибо
...
Рейтинг: 0 / 0
09.11.2004, 19:33
    #32774401
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
А объектом SEQUENCE пользуетесь?
...
Рейтинг: 0 / 0
10.11.2004, 11:59
    #32775126
Сергей П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
Нет, не пользуюсь и, если честно, не знаю как это мне должно помочь.
Не расскажете куда "копать" ?
...
Рейтинг: 0 / 0
10.11.2004, 12:33
    #32775235
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
MSDN:
General Considerations for Using Visual Database Tools with Oracle Databases
Creating an Insert Values Query
...
Рейтинг: 0 / 0
10.11.2004, 12:47
    #32775277
Сергей П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
Проблема, как мне думается, не в Oracle, а в .NET Framework'e

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

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

см. выше
...
Рейтинг: 0 / 0
10.11.2004, 13:18
    #32775365
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
InforceConstraints = False
или значение PK давать при добавлении строки.
...
Рейтинг: 0 / 0
10.11.2004, 13:18
    #32775367
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
Сергей П.Проблема, как мне думается, не в Oracle, а в .NET Framework'eскорее всего, проблема в твоей программе.
тебе нужно при добавлении записей в DataSet присваивать первичному ключу уникальные значения. первая запись добавляется (в твоем случае приходится только догадываться) со значением DefaultValue, а вот вторая запись с таким же значением при добавлении вызовет exception "Column 'MYID' is constrained to be unique" .
...
Рейтинг: 0 / 0
10.11.2004, 15:06
    #32775637
Сергей П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
Итак по порядку:

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

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

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

4. Добавляем 1-ую строку в таблицу:
- первичный ключ уникальный:
Код: plaintext
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()), а преобразование
Код: plaintext
string SomeStr = ((System.Byte[])ID).ToString();
выдает " System.Byte[] "
Т.е. т.к. значение второго ключа после преобразования к строке тоже равно "System.Byte[]" - срабатывает ограничение на уникальность первичного ключа в таблице.
...
Рейтинг: 0 / 0
10.11.2004, 15:24
    #32775709
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
Попробуй так:
To_Char (Поле RAW) AS Псевдоним
в SelectCommand.CommandText
...
Рейтинг: 0 / 0
10.11.2004, 16:25
    #32775889
Сергей П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
WorobjoffПопробуй так:
To_Char (Поле RAW) AS Псевдоним
в SelectCommand.CommandText
Народ, ну почитайте внимательнее - ругается на нарушение уникальности первичного ключа в таблице DataSet 'e.

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

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

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

и все данные обновятся, если не было повторяющихся значений в "ID".
...
Рейтинг: 0 / 0
10.11.2004, 16:36
    #32775921
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
это текст сравнения значений ключей
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public virtual int Compare(int recordNo1, int recordNo2)
{
      object obj1 = this.Get(recordNo1);
      if (obj1 is IComparable)
      {
            object obj2 = this.Get(recordNo2);
            if (obj2.GetType() == obj1.GetType())
            {
                  return ((IComparable) obj1).CompareTo(obj2);
            }
            this.CompareBits(recordNo1, recordNo2);
      }
      return 0;
}
"исследования" подтверждают - для объектов,
не реализующих интерфейс IComparable
результат = 0, т.е. обекты считаются равными.

--
текст по framework 1.1 через .net reflector
...
Рейтинг: 0 / 0
10.11.2004, 17:46
    #32776102
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
Так,
1. Хотел облегчить жизнь тем, чтобы преобразовать в Sting и не парится с Byte[15], но не преобразует его Oracle. За непроверенный совет каюсь.

2. Достать уникальный ключ в Oracle:
.2.1 Используем Объект Sequence
.2.2 Читаем записи с него такой строкой: SELECT ИМЯ_SEQUENCE.NEXTVAL FROM DUAL
.2.3 Используем для этого DataReader (ExecuteReader(CommandBehavior.SingleRow))
.2.4 Это прочитанное значение и есть гарантия уникальности записи в Oracle
.2.5 Этот обект (Sequence) должен быть настроен (если создается заново), чтобы значения не пересеклись

3. Преобразовать полученное значение (типа Number) в Byte[15] (нет примера)

4. Читаем NEXTVAL каждый раз при добавлении строки и помещаем его в то самое уникальное поле

Еще раз: такая схема проверена и работает, но с типом Number. Вам надо именно добиться, чтобы ваш DataTable "взял" значение в формате Byte[15]
...
Рейтинг: 0 / 0
10.11.2004, 19:47
    #32776308
Сергей П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
WorobjoffХотел облегчить жизнь тем, чтобы преобразовать в Sting и не парится с Byte[15], но не преобразует его Oracle
Преобразовывает :)

Решение, которое мне подходит:

1. В DataSet подставляем "виртуальный" столбец, например "_ID", тип String
и "переносим" на него Primary Key.

2. В SelectCommand добавляем "SELECT RAWTOHEX(ID) AS "_ID", ..."

Теперь при добавлении новой строки в таблицу DataSet'a нужно добавлять также значение для столбца "_ID"

Код: plaintext
1.
2.
Byte[] byteGuid = System.Guid.NewGuid().ToByteArray();
NewRow._ID = new Guid (byteGuid).ToString();
NewRow.ID = byteGuid;

Тогда при добавлении новой строки сравниваться будут значения типа String, который поддерживает IComparable (спасибо кузе ).

Если есть еще варианты - готов поэкспериментировать :)
...
Рейтинг: 0 / 0
11.11.2004, 09:11
    #32776616
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
Когда впервые узнал о GUID первая мысль была использовать его для фиксации факта изменения записи другим пользователем вместо проверок по всем полям (оптимистическая блокировка) чтобы ускорить работу программ. В MSSQL2000 и поле есть соответствующего формата. В качестве значения первичного ключа... ну может это и есть так надежно как заявляет M$.

Интересно вот что: Как ведут себя запросы с Join-ами где в качестве PK и FK используется RAW. И как себя ведет Relation в DataSet. Напишите пожалуйста свой опыт.
...
Рейтинг: 0 / 0
11.11.2004, 16:40
    #32777989
Сергей П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
WorobjoffКак ведут себя запросы с Join-ами где в качестве PK и FK используется RAW. И как себя ведет Relation в DataSet. Напишите пожалуйста свой опыт.

JOIN'ны в ORACLE с данным типом данных ведут себя корректно и проблем с этим нет.

А вот Relation в DataSet'e не работают (как и Primary Key), если поле типа base64Binary.

Спасает положение способ, описанный мною выше, т.е. создание некого "виртуального" поля, записывание в него преобразованного в строку значения ключа и наложение Relation's уже на эти виртуальные поля.
Тогда срабатывает и проверка на уникальность и GetParentRows.

Сергей
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]