|
|
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
http://msdn2.microsoft.com/en-us/library/4esb49b4.aspx Здравствуйте! Мне потребовалось одновременно добавлять данные в главную таблицу и тут же с этим же первичным ключом ключем в подчиненную . Как обычно в этой ситуации требуется знать первичный ключ вновь добавленной записи. Мне на глаза попался сабжевый пример в мсдн. Вроде все очень круто, как казалось. Пишем и туда и туда, потом апдейт, апдейт и все .... Блин... но этот пример не работает, гад! Вернее как-то работает, но ....не всегда корректно. Постоянно ошибки на ограничения выскакивают. Начал с ограничениями колдовать: стали ошибки при апдейте на сервер возникать... Может есть народ, который разобрался? Или как решить эту задачу средствами ADO.NET: одновременное добавление данных в главную и зависящую от первичного ключа этой новой записи подчиненную таблицу? Без scope_identity в хранимой процедуре никак не обойтись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2008, 23:13 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
b0ris98http://msdn2.microsoft.com/en-us/library/4esb49b4.aspx Здравствуйте! Мне потребовалось одновременно добавлять данные в главную таблицу и тут же с этим же первичным ключом ключем в подчиненную . Как обычно в этой ситуации требуется знать первичный ключ вновь добавленной записи. Мне на глаза попался сабжевый пример в мсдн. Вроде все очень круто, как казалось. Пишем и туда и туда, потом апдейт, апдейт и все .... Блин... но этот пример не работает, гад! Вернее как-то работает, но ....не всегда корректно. Постоянно ошибки на ограничения выскакивают. Начал с ограничениями колдовать: стали ошибки при апдейте на сервер возникать... Может есть народ, который разобрался? Или как решить эту задачу средствами ADO.NET: одновременное добавление данных в главную и зависящую от первичного ключа этой новой записи подчиненную таблицу? Без scope_identity в хранимой процедуре никак не обойтись? Я вот кстати рядом про то же пишу, если в программе задать связь между таблицами в виде внешнего ключа, то при открытии почему-то ошибки вываливаются, на данный момент я просто отключил этот ключ. Делаю так - делаю апдейт на главную таблицу, получаю ключ, вручную присваиваю ключ в подчиненной таблице, сохораняю подчиненную - на самом деле не сильно много кода добавилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 09:12 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
b0ris98http://msdn2.microsoft.com/en-us/library/4esb49b4.aspx Здравствуйте! Мне потребовалось одновременно добавлять данные в главную таблицу и тут же с этим же первичным ключом ключем в подчиненную . Как обычно в этой ситуации требуется знать первичный ключ вновь добавленной записи. Мне на глаза попался сабжевый пример в мсдн. Вроде все очень круто, как казалось. Пишем и туда и туда, потом апдейт, апдейт и все .... Блин... но этот пример не работает, гад! Вернее как-то работает, но ....не всегда корректно. Постоянно ошибки на ограничения выскакивают. Начал с ограничениями колдовать: стали ошибки при апдейте на сервер возникать... Может есть народ, который разобрался? Или как решить эту задачу средствами ADO.NET: одновременное добавление данных в главную и зависящую от первичного ключа этой новой записи подчиненную таблицу? Без scope_identity в хранимой процедуре никак не обойтись? Всё проще - вы забыли отредактировать связи. Надо установить в Cuscade Update. Всё это побробно расписано в книжке Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET By Brian Noyes Если пользуетесь VS 2008 то там TableAdapterManager всё за вас сделает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 09:55 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
ova Я вот кстати рядом про то же пишу, если в программе задать связь между таблицами в виде внешнего ключа, то при открытии почему-то ошибки вываливаются, на данный момент я просто отключил этот ключ. Делаю так - делаю апдейт на главную таблицу, получаю ключ, вручную присваиваю ключ в подчиненной таблице, сохораняю подчиненную - на самом деле не сильно много кода добавилось. Ключ отключать не надо! надо на время отключить bindingsource Код: plaintext а потом включить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 09:57 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
Bill Great Ключ отключать не надо! надо на время отключить bindingsource Код: plaintext а потом включить Ну во-первых тут тоже чего-то неправильно, если я вижу что записи возвращаются именно те что соответствуют ключу, то это тогда глюк А во-вторых - когда их включать? Я включаю сразу после Fill - на строке включения ограничения вываливается ошибка- именно про это ограничение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 11:02 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
ova Bill Great Ключ отключать не надо! надо на время отключить bindingsource Код: plaintext а потом включить Ну во-первых тут тоже чего-то неправильно, если я вижу что записи возвращаются именно те что соответствуют ключу, то это тогда глюк А во-вторых - когда их включать? Я включаю сразу после Fill - на строке включения ограничения вываливается ошибка- именно про это ограничение. Распространённая ошибка - ваш Fill возвращает несколько одинаковых строк с одним и тем же значением первичного ключа. Типизированный датасет, коли вы ему сказали что в данной таблице есть первичный ключ это контролирует. Контроль можно выключить у DataSet есть EnforceConstraints для on/ off тех ограничений, которые вы же и "попросили" соблюдать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 11:26 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
Bill Great Распространённая ошибка - ваш Fill возвращает несколько одинаковых строк с одним и тем же значением первичного ключа. Типизированный датасет, коли вы ему сказали что в данной таблице есть первичный ключ это контролирует. Контроль можно выключить у DataSet есть EnforceConstraints для on/ off тех ограничений, которые вы же и "попросили" соблюдать. Что значит ошибка- чья? Я ему даю Fill - он должен выбрать таблицу как она есть, более того - пробовал сделать запрос на подчиненную таблицу с параметром, т.е. выбираю только нужные записи, заполняю по FillBy - тот же результат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 11:43 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
ova Что значит ошибка- чья? Я ему даю Fill - он должен выбрать таблицу как она есть, более того - пробовал сделать запрос на подчиненную таблицу с параметром, т.е. выбираю только нужные записи, заполняю по FillBy - тот же результат Выпишите ошибку, которая возникает у вас! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 11:50 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
Bill Great b0ris98http://msdn2.microsoft.com/en-us/library/4esb49b4.aspx Здравствуйте! Мне потребовалось одновременно добавлять данные в главную таблицу и тут же с этим же первичным ключом ключем в подчиненную . Как обычно в этой ситуации требуется знать первичный ключ вновь добавленной записи. Мне на глаза попался сабжевый пример в мсдн. Вроде все очень круто, как казалось. Пишем и туда и туда, потом апдейт, апдейт и все .... Блин... но этот пример не работает, гад! Вернее как-то работает, но ....не всегда корректно. Постоянно ошибки на ограничения выскакивают. Начал с ограничениями колдовать: стали ошибки при апдейте на сервер возникать... Может есть народ, который разобрался? Или как решить эту задачу средствами ADO.NET: одновременное добавление данных в главную и зависящую от первичного ключа этой новой записи подчиненную таблицу? Без scope_identity в хранимой процедуре никак не обойтись? Всё проще - вы забыли отредактировать связи. Надо установить в Cuscade Update. Всё это побробно расписано в книжке Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET By Brian Noyes Если пользуетесь VS 2008 то там TableAdapterManager всё за вас сделает Люди! Не дайте дураком помереть! Киньте рабочий проект или статью из книжки, а то пример из МСДН от 2005 кстати и в 2008 версию перекочевал без изменений (специально в И-нете проверял). А в нем нормально все работает, только если изменять существующие записи. А при добавлении/удалении косяки выскакивают! Например, на сервере добавляется запись только в главную таблицу, а в подчиненной - пусто, хотя при этом в датасете связи по ключам работают и данные есть и в главной, и подчиненной (FK_ID=PK_ID). Я использую VS2005. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 13:12 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
Возьми, книгу сию Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET By Brian Noyes Всё это побробно расписано и дураком не помрёшь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 13:45 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
b0ris98 .... А при добавлении/удалении косяки выскакивают! Например, на сервере добавляется запись только в главную таблицу, а в подчиненной - пусто, хотя при этом в датасете связи по ключам работают и данные есть и в главной, и подчиненной (FK_ID=PK_ID). Я использую VS2005. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 17:34 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
Bill GreatВозьми, книгу сию Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET By Brian Noyes Всё это побробно расписано и дураком не помрёшь! Скачал я эту книгу в chm формате. Там нашел Master-Details Data Binding, но просто для отображения данных, Updating Data Sources Through Data Binding - но там пример для одной таблицы... Чего-то про Saving Data to a Database Multiple Tables не нахожу :-( Ткните хоть в Chapter... Может есть кто-нибудь, кто пример из МСДН до ума довел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 19:58 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
Сахават Юсифов b0ris98 .... А при добавлении/удалении косяки выскакивают! Например, на сервере добавляется запись только в главную таблицу, а в подчиненной - пусто, хотя при этом в датасете связи по ключам работают и данные есть и в главной, и подчиненной (FK_ID=PK_ID). Я использую VS2005. Код: plaintext 1. 2. 3. Я извиняюсь... А можно из всего многообразия оставить в примере только две таблицы master-details.... Что бы было видно в каком порядке какие обновлять нужно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 20:08 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
b0ris98Я извиняюсь... А можно из всего многообразия оставить в примере только две таблицы master-details.... Что бы было видно в каком порядке какие обновлять нужно... Там несколько пар. смотрите например на эту пару Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2008, 22:26 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
Сахават Юсифов b0ris98Я извиняюсь... А можно из всего многообразия оставить в примере только две таблицы master-details.... Что бы было видно в каком порядке какие обновлять нужно... Там несколько пар. смотрите например на эту пару Код: plaintext 1. А в дизайнере датасета если два раза на связь мышкой щелнуть, то там что в окошке Relation стоит? Relation Only, Foreign Key Constraint, или Both Relation And Foreign Key Constraint. Ну, и соотвественно update/delete rules. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2008, 09:36 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
b0ris98Both Relation And Foreign Key Constraint. Ну, и соотвественно update/delete rules. Both, NoAction. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2008, 10:35 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, уважаемые коллеги! Попробую, так сказать, еще раз описать проблему. На тривиальном хрестоматийном примере страны-континенты. На SQL серевере есть БД World, состоящая из двух таблиц: Continents (два поля ContinentID - int, identity и ContinentName - varchar(50)) и Countries (три поля CountrieID - int, identity, CountrieName - varchar(50) и ContinentID - int). Таблицы связаны отношением один-ко-многим. Есть FK_Countries_Continents, по полю ContinentID обеих таблиц. В проекте создан типизированный датасет с именем WorldDataSet. В дизайнере датасета между DataTable'ами Continents и Countries есть Relation FK_Countries_Continents. По-умолчанию связь имела свойство "Relation Only", которое было вручную установлено в "Both Relation And Foreign Key Constraint". Update Rule - Cascade, Delete rule - Cascade, Accept/Reject Rule - None, флажок Nested Relation не установлен. Не будем касаться операций изменений и удаления, остановимся только на добавлении. На форме есть WorldDataSet1, CountriesTableAdapter, ContinentsTableAdapter, ContinentsBindingSource, CountriesBindingSource. У ContinentsBindingSource установлены свойства DataSource - WorldDataSet1, DataMember - Continents. У CountriesBindingSource установлены свойства DataSource - ContinentsBindingSource, DataMember - FK_Countries_Continents. Требуется, чтобы при нажатии на кнопочку Button1 в таблицу Continents добавилась "Европа", а в таблицу Countries - "Германия". В обработчике события Button1.Click написан следующий код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2008, 07:41 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
b0ris98 При этом добавляется запись только в мастер-таблицу Continents. В Countries не добавляется ничего. Ошибок никаких не возникает. Что здесь не правильно? После долгих экспериментов все получилось, если делать в следующем порядке: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Т.е. получается, что для мастер-таблицы нужно сделать EndEdit, затем Update, чтобы она первичный ключ обновила , а затем уже сделать AddNew для подчиненной записи... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2008, 16:47 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
А как быть в случае нетипизированного DataSet? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2008, 09:09 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
TeXpertА как быть в случае нетипизированного DataSet? Аналогично, я думаю... Там просто нужно правильно запрос на добавление/изменение в тейбладаптере прописать. В моем примере, например в таблице Continents запрсы так выглядят: INSERT INTO [dbo].[Continents] ([ContinentName]) VALUES (@ContinentName); SELECT ContinentID, ContinentName FROM Continents WHERE (ContinentID = SCOPE_IDENTITY()) Вот оно! SCOPE_IDENTITY - то где спряталась ;-) UPDATE [dbo].[Continents] SET [ContinentName] = @ContinentName WHERE (([ContinentID] = @Original_ContinentID) AND ([ContinentName] = @Original_ContinentName)); SELECT ContinentID, ContinentName FROM Continents WHERE (ContinentID = @ContinentID) Вопрос вот в чем еще. Если сделать одновременно AddNew для биндингсоурсов обеих таблиц (сначала для главной, затем для подчиненной, без вызова EndEdit для главной), то похоже, что внешний ключ в подчиненной не обновляется и корректно ничего не работает. Вот если в моем работающем примере посмотреть, то AddNew для подчиненной таблицы выполняется ПОСЛЕ того, как выполнен EndEdit главной ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 09:42 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
как у вас все сложно с вашими датасетами... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 12:35 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
Если оставаться с датасетами то удобное теперь средства tableAdapterManager ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 12:38 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
Bill GreatЕсли оставаться с датасетами А есть другие альтернативы, использовать ADO.NET и без датасетов? Я что-то пропустил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 13:19 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
ORM Linq, например ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 13:21 |
|
||
|
MSDN: Walkthrough: Saving Data to a Database (Multiple Tables)
|
|||
|---|---|---|---|
|
#18+
вот если говорить простым языком из книги Submitting Hierarchical Changes Using the DataTable Object’s Select Method to Submit Hierarchical Changes In Chapter 7, I discussed the Select method of the DataTable object as a way to locate DataRow objects that satisfy the desired criteria. For example, the following line of code returns an array of the pending new DataRow objects whose City column contains Seattle. The DataRow objects are sorted based on the value of the ContactName column. tbl.Select("City = 'Seattle'", "ContactName", DataViewRowState.Added) The Select method returns an array of DataRow objects. And one of the overloaded DataAdapter Update methods accepts an array of DataRow objects. What a pleasant coincidence. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ну вот . еще там есть как апдейтить через datarelations объект.там тоже просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 13:37 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=35070213&tid=1352440]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
146ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 484ms |

| 0 / 0 |
