|
|
|
ADO.NET 2: DataSet + хранимые процедуры
|
|||
|---|---|---|---|
|
#18+
Пытаюсь сделать Windows Forms приложение, используя .NET 2.0 и SQL Server 2005 Express. Тривиальная задача - в DataGridView организовать выборку/вставку/редактирование/удаление. Вместо прямого обращения к таблице используются 4 хранимые процедуры - выборка/вставка/редактирование/удаление. При генерации датасета и адаптера подтянулась вся нужная информация - все как надо - поля, первичный ключ... Но вот в чем дело: значение первичного ключа (тип поля uniqueidentifier - GUID, одним словом) генерируется хранимой процедурой, отвечающей за вставку данных. То есть для этого поля у процедуры есть параметр, и он имеет направление output. Но перед тем, как дергать процедуру, ADO.NET пытается сохранить запись в своем датасете и видит, что поле not nullable, и типа неплохо было бы туда что-нибудь занести, и до вызова хранимой процедуры дело не доходит - выскакивает ошибка. Я попытался в датасете для этого поля указать, что якобы оно позволяет хранение DBNull, но ошибка не исчезла. Подозреваю, что надо править в нескольких местах. Но в любом случае так поступать не хотелось бы, "дабы не нарушать отчетности". Все же приятней, когда датасет описывает реальную структуру данных. Только как бы ему сказать, что null-овость поля надо проверять _после_ того, как дернули хранимую процедуру, а не раньше, и при этом заполнив это поле значением output-параметра из процедуры? Что подскажете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 11:27 |
|
||
|
ADO.NET 2: DataSet + хранимые процедуры
|
|||
|---|---|---|---|
|
#18+
DataSet.EnforceConstraints = false когда их выключать и включать решай по ситуации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 11:59 |
|
||
|
ADO.NET 2: DataSet + хранимые процедуры
|
|||
|---|---|---|---|
|
#18+
Не стоит себе проблемы выдумывать - вставляй на клиенте Guid.NewGuid(). Как грица, если нет разницы, зачем платить больше?! ───────── ∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 12:03 |
|
||
|
ADO.NET 2: DataSet + хранимые процедуры
|
|||
|---|---|---|---|
|
#18+
О, спасибо. Видимо, придется изначально отключить и больше не включать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 12:07 |
|
||
|
ADO.NET 2: DataSet + хранимые процедуры
|
|||
|---|---|---|---|
|
#18+
(`ykaНе стоит себе проблемы выдумывать - вставляй на клиенте Guid.NewGuid(). Как грица, если нет разницы, зачем платить больше?!Э-то не-серь-ез-но! (С) :) Политика предполагаемого проекта такая: вся логика поддерживается SQL-сервером, а приложение - всего лишь клиент для отображения картинки и взаимодействия с юзером. Так что если делать логику на сервере, то надо идти до конца - и идентификаторы генерить должен он. Процедуры обеспечивают интерфейс работы с данными и они должны быть логически законченными сами по себе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 12:14 |
|
||
|
ADO.NET 2: DataSet + хранимые процедуры
|
|||
|---|---|---|---|
|
#18+
По-моему, вполне серьезно. Обычно делают уникальные ключи на основе identity-колонок или GUID. В первом случае, в DataTable делают для соответсвующей колонки AutoIncrement = true; AutoIncrementSeed = -1; AutoIncrementStep = -1; с подтягиванием сгенерированного сервером значения при отработке команд на втавку на сервере (типа DA.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord) А во втором случае вообще проблем нет, ибо GUID сохраняет свою уникальность. И политика проекта в данном случае не при делах - это политика primary key в реляционной БД. Другое дело, когда ключ создается солгасно особой логике и не укладывается в эти рамки. Тогда, чес говоря, даже не представляю, как доставать на клиента сгенерированный сервером ключ для корректной работы группы команд, работающих с некоторой записью. Только - вставил и забыл. ───────── ∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 12:51 |
|
||
|
ADO.NET 2: DataSet + хранимые процедуры
|
|||
|---|---|---|---|
|
#18+
Ну если я сказал, что вариант отпадает - зачем продолжать меня уговаривать? :) Я могу привести массу аргументов - SQL-код писал не я (я всего лишь разместил объяву (С) ) и не мне решать, каким он должен быть. Мое дело - написание клиента. Изначально неважно в чем. Под процедуры, написанные в таком стиле, замечательно делается клиент, скажем, на Делфях. Но я хотел именно на .NET. Поэтому, дабы убедить SQL-писателя, что клиент на .NET - это уместно, я не должен канючить "перепиши процедуры... перепиши процедуры...", иначе буду послан... в сторону тех же Делфей :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 13:09 |
|
||
|
ADO.NET 2: DataSet + хранимые процедуры
|
|||
|---|---|---|---|
|
#18+
Ну вставьте туда guid сгенерённый на клиенте... А потом от сервера заберёте реальный... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2007, 17:11 |
|
||
|
ADO.NET 2: DataSet + хранимые процедуры
|
|||
|---|---|---|---|
|
#18+
Решил это дело отключением констрейнтов, как советовали выше. Теперь ищу, каким образом все изменения заносить в базу немедленно. Вообще отказаться бы от датасетов, работать с одними command-ами... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 18:01 |
|
||
|
ADO.NET 2: DataSet + хранимые процедуры
|
|||
|---|---|---|---|
|
#18+
А чем Вам DataSetы не нравятся? Они собственно для того сделаны, что бы к серверу по каждому движению мышью не обращаться... По поводу "все изменения заносить в базу немедленно" - повесьте обработчик на событие DataTable.RowChanged и вызывайте из нее серверную процедуру. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2007, 11:56 |
|
||
|
ADO.NET 2: DataSet + хранимые процедуры
|
|||
|---|---|---|---|
|
#18+
Sergey MolchanovВообще отказаться бы от датасетов, работать с одними command-ами... А что мешает использовать command.ExecuteReader и возвращаемый им интерфейс IDataReader ? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2007, 12:15 |
|
||
|
|

start [/forum/topic.php?fid=17&fpage=100&tid=1352975]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 232ms |
| total: | 398ms |

| 0 / 0 |
