Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Редактирование данных, Binding, UpdateCommand / 5 сообщений из 5, страница 1 из 1
28.09.2004, 19:26
    #32715518
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование данных, Binding, UpdateCommand
Братцы.. я полный лобзик (прочитал всего одну умную (лучшую) книгу, в которой почти отсутствуют знания по организации интерфейса для обработки данных, как и о ADO.NET в общем) в .NET, так что учусь на ходу. Тема такая:
есть форма с гридом (главная) - в гриде документы. Есть форма для редактирования документа, которую я создаю, передаю ей DataSet и DataAdapter (инициализирую соответствующие internal переменные) и отображаю. При создании формы биндю контролы к полям таблицы.
В DataAdapter все действия заданы процедурами, причем (!) в процедуре на Update входящих параметров меньше, чем полей в таблице, плюс есть исходящие параметры - в них сервисная информация. Данная процедура также возвращает измененную строку.
Описанная мной ситуевина работает вплоть до выборки и отображения данных :)) - дальше раздолье для познания!
Хотел на опыте подобрать рабочие условия, но вываливается ошибка System.InvalidCastException: Object must implement IConvertible.

Вопрос: как правильно надо жить в таких условиях??? Т.е.,
1) нужно редактировать dataset на другой форме. Что нужно форме редактирования для счастья? Как правильно начать, закончить редактирование записи и какой командой внести изменения в БД?
Наводка на смысл - хочу логику поведения формы вытащить из приложения в базу, посему для этого соответственно заделать процедуру обновления, и вызывать ее, например, после потери фокуса любым контролом. Из процедуры возвращать состояния контролов (полей), вычисленные значения, сообщения об ошибках и т.д. Сразу скажу - посты типа "маразм это" отвергаются без предложения альтернативы :)
2) имеет ли право на существование подобная процедура обновления записи? Если да, то как ее правильно прикрутить?
Буду рад любым вашим знаниям, либо посылке меня подальше на какой-нибудь ресурс, раскрывающий тему!

принципиальный пример процедуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE PROСEDURE dbo.DocUpdate
   @UID uniqueidentifier,  - поле таблицы
   @TableField1 xxx,       - поле таблицы
   @TableField2 xxx,       - поле таблицы
   @IsCheckOnly bit,      - мой параметр
   @IsOK bit OUTPUT,     - интересности наружу
   @ErrFields varchar( 1000 ) OUTPUT - интересности наружу
AS
   if @IsCheckOnly =  1 
       select @TableField1 = TableField1, @TableField2 = TableField2
       from Doc where UID = @UID
   else
       update Doc set TableField1 = @TableField1, TableField2 = @TableField2
       where UID = @UID
    /*
     .... проверка правильности полей и заполнение выходных параметров
   */ 

   SELECT UID, TableField1, TableField2, TableField3, TableField4
   FROM Doc
GO

-----
Иногда решительный шаг вперед - результат хорошего пинка сзади
...
Рейтинг: 0 / 0
28.09.2004, 19:46
    #32715536
Один
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование данных, Binding, UpdateCommand
По процедуре - сходу:
(`yka
if @IsCheckOnly = 1
BEGIN
select @TableField1 = TableField1, @TableField2 = TableField2
from Doc where UID = @UID
END
else
BEGIN
update Doc set TableField1 = @TableField1, TableField2 = @TableField2
where UID = @UID
END
/*
.... проверка правильности полей и заполнение выходных параметров
*/ иначе потом будет много неожиданных сюрпризов.
...
Рейтинг: 0 / 0
28.09.2004, 19:57
    #32715548
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование данных, Binding, UpdateCommand
Ёлки-палки.. Подумал, подумал, когда писал код... и удалил в этих местах begin/end. Зря, кажется :) Просьба по ходу - не обращайте внимания на типы данных "xxx"! Это условность, не имеющая значения в данном контексте.

ЗЫ
Все равно спасибо, Один. Ценное замечание.

-----
Иногда решительный шаг вперед - результат хорошего пинка сзади
...
Рейтинг: 0 / 0
29.09.2004, 10:46
    #32715983
Por
Por
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование данных, Binding, UpdateCommand
(`ykaКак правильно начать, закончить редактирование записи ...

DataSet ds; // считаем, что уже проинициализирован

ds.Tables[0].Rows[0].BeginEdit();

// делаем необходимые изменения записи

ds.Tables[0].Rows[0].EndEdit();

(`ykaи какой командой внести изменения в БД?

Тут можно по разному подойти к решению вопроса:
1. Использовать DataAdapter.Update(DataSet ds | DataTable dt)
в этом случае нужно настроить DataAdapter.UpdateCommand,
DataAdapter.DeleteCommand, DataAdapter.InsertCommand.
Допустим так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SqlCommand commandUPD = new SqlCommand("exec  dbo.DocUpdate @UID,@TableField1,@TableField2,@IsCheckOnly,@IsOK OUTPUT,@ErrFields OUTPUT",MySqlConnection);			
SqlParameter par1 = new SqlParameter("@UID",SqlDbType.SqlGuid,0,ParameterDirection.Input,false,0,0,"UID",DataRowVersion.Current,null);
SqlParameter par2 = new SqlParameter("@TableField1",SqlDbType.xxx,0,ParameterDirection.Input,false,0,0,"TableField1",DataRowVersion.Current,null);
SqlParameter par3 = new SqlParameter("@TableField2",SqlDbType.xxx,0,ParameterDirection.Input,false,0,0,"TableField2",DataRowVersion.Current,null);
SqlParameter par4 = new SqlParameter("@IsCheckOnly",SqlDbType.Byte,0,ParameterDirection.Input,false,0,0,"IsCheckOnly",DataRowVersion.Current,null);
SqlParameter par5 = new SqlParameter("@IsOK",SqlDbType.Byte);
par5.Direction = ParameterDirrection.Output;
SqlParameter par6 = new SqlParameter("@ErrFields",SqlDbType.SqlString);
par6.Direction = ParameterDirrection.Output;
comm.Parameters.Add(par1);
comm.Parameters.Add(par2);
comm.Parameters.Add(par3);
comm.Parameters.Add(par4);
comm.Parameters.Add(par5);
comm.Parameters.Add(par6);
ds.UpdateCommand = commandUPD;
По образцу описываем остальные команды, и в нужном месте вызываем DataAdapter.Update(DataSet ds | DataTable dt)



2. Заливать обновления построчно, используя SqlCommand.ExecuteReader();
Подготовка комманды см. п. 1 с той лишь разницей, что последний параметр конструктора SqlParameter не null, а значение передаваемого параметра.
...
Рейтинг: 0 / 0
29.09.2004, 17:49
    #32717436
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование данных, Binding, UpdateCommand
Примерно так все и делаю.
Сначала пропала ошибка System.InvalidCastException: Object must implement IConvertible. Но появилась другая по поводу Expression-полей (мол, не могу изменить свойство ReadOnly..). Оказалось, что куча народу страдают из-за этой заподляны. Самый действенный вариант оказался на время Update'а убирать вычисляемые поля в ArrayList, а после - заливать их обратно.
И вот уже вроде все заработало, как изменился тип поля в таблице.. я чего-то перекроил, и вернулась мерзкая System.InvalidCastException: Object must implement IConvertible. Куда смотреть - ХЗ :(

-----
Иногда решительный шаг вперед - результат хорошего пинка сзади
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Редактирование данных, Binding, UpdateCommand / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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