|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
Ситуация: Есть типизированный 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 в таблице позволяет добавлять и удалять строки, но как-то это мне кажется неправильно... Кто-нибудь знает как обойти данную проблему ? Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 17:39 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
А объектом SEQUENCE пользуетесь? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2004, 19:33 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
Нет, не пользуюсь и, если честно, не знаю как это мне должно помочь. Не расскажете куда "копать" ? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2004, 11:59 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
MSDN: General Considerations for Using Visual Database Tools with Oracle Databases Creating an Insert Values Query ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2004, 12:33 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
Проблема, как мне думается, не в Oracle, а в .NET Framework'e Проблем с добавлением новых записей в Oracle нет - есть проблема добавления записей в таблицу DataSet'a если Primary Key столбец имеет тип "base64Binary", при добавлении 2-ой строки в таблицу DataSet'a (!). До добавления записей собственно в Oracle дело не доходит. см. выше ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2004, 12:47 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
InforceConstraints = False или значение PK давать при добавлении строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2004, 13:18 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
Сергей П.Проблема, как мне думается, не в Oracle, а в .NET Framework'eскорее всего, проблема в твоей программе. тебе нужно при добавлении записей в DataSet присваивать первичному ключу уникальные значения. первая запись добавляется (в твоем случае приходится только догадываться) со значением DefaultValue, а вот вторая запись с таким же значением при добавлении вызовет exception "Column 'MYID' is constrained to be unique" . ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2004, 13:18 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
Итак по порядку: 1. Есть таблица в БД Oracle, в качестве первичного ключа столбец "ID" типа RAW (16) - массив байт; 2. Есть DataSet со сгенеренной таблицей из БД Oracle, в качестве первичного ключа столбец "ID" типа base64Binary (так сгенерила сама студия); 3. Значения "по умолчанию" для "ID" нет - все значения генерю руками. 4. Добавляем 1-ую строку в таблицу: - первичный ключ уникальный: Код: plaintext
- добавляем строку в таблицу - все ОК ; 5. Добавляем 2-ую строку: - первичный ключ тоже УНИКАЛЬНЫЙ - заполняем остальные столбцы данными; - при добавлении строки в таблицу получаем Exception : Column 'ID' is constrained to be unique. Value 'System.Byte[]' is already present. Мои предположения : при проверке уникальности первичного ключа таблицы в DataSet'e, Framework приводит его (значение ключа) к строке (ToString()), а преобразование Код: plaintext
Т.е. т.к. значение второго ключа после преобразования к строке тоже равно "System.Byte[]" - срабатывает ограничение на уникальность первичного ключа в таблице. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2004, 15:06 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
Попробуй так: To_Char (Поле RAW) AS Псевдоним в SelectCommand.CommandText ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2004, 15:24 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
WorobjoffПопробуй так: To_Char (Поле RAW) AS Псевдоним в SelectCommand.CommandText Народ, ну почитайте внимательнее - ругается на нарушение уникальности первичного ключа в таблице DataSet 'e. Заполнение таблицы данными происходит корректно, т.к. при этом не производится проверка на уникальность первичного ключа. Если я выключу проверку: Код: plaintext
то ошибка исчезает, и я могу добавлять сколько угодно строк, а потом сделать: Код: plaintext
и все данные обновятся, если не было повторяющихся значений в "ID". ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2004, 16:25 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
это текст сравнения значений ключей Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
не реализующих интерфейс IComparable результат = 0, т.е. обекты считаются равными. -- текст по framework 1.1 через .net reflector ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2004, 16:36 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
Так, 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] ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2004, 17:46 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
WorobjoffХотел облегчить жизнь тем, чтобы преобразовать в Sting и не парится с Byte[15], но не преобразует его Oracle Преобразовывает :) Решение, которое мне подходит: 1. В DataSet подставляем "виртуальный" столбец, например "_ID", тип String и "переносим" на него Primary Key. 2. В SelectCommand добавляем "SELECT RAWTOHEX(ID) AS "_ID", ..." Теперь при добавлении новой строки в таблицу DataSet'a нужно добавлять также значение для столбца "_ID" Код: plaintext 1. 2.
Тогда при добавлении новой строки сравниваться будут значения типа String, который поддерживает IComparable (спасибо кузе ). Если есть еще варианты - готов поэкспериментировать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2004, 19:47 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
Когда впервые узнал о GUID первая мысль была использовать его для фиксации факта изменения записи другим пользователем вместо проверок по всем полям (оптимистическая блокировка) чтобы ускорить работу программ. В MSSQL2000 и поле есть соответствующего формата. В качестве значения первичного ключа... ну может это и есть так надежно как заявляет M$. Интересно вот что: Как ведут себя запросы с Join-ами где в качестве PK и FK используется RAW. И как себя ведет Relation в DataSet. Напишите пожалуйста свой опыт. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2004, 09:11 |
|
Проблема с уникальным ключом в таблице DataSet'a с БД ORACLE
|
|||
---|---|---|---|
#18+
WorobjoffКак ведут себя запросы с Join-ами где в качестве PK и FK используется RAW. И как себя ведет Relation в DataSet. Напишите пожалуйста свой опыт. JOIN'ны в ORACLE с данным типом данных ведут себя корректно и проблем с этим нет. А вот Relation в DataSet'e не работают (как и Primary Key), если поле типа base64Binary. Спасает положение способ, описанный мною выше, т.е. создание некого "виртуального" поля, записывание в него преобразованного в строку значения ключа и наложение Relation's уже на эти виртуальные поля. Тогда срабатывает и проверка на уникальность и GetParentRows. Сергей ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2004, 16:40 |
|
|
start [/forum/topic.php?fid=17&msg=32775235&tid=1353959]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
94ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 342ms |
total: | 548ms |
0 / 0 |