powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / DataTable.GetChanges...
15 сообщений из 15, страница 1 из 1
DataTable.GetChanges...
    #34478780
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Выбираю через адаптер данные в Datatable
Код: plaintext
1.
2.
3.
4.
5.
6.
  var A:= new SADataAdapter();
  A.SelectCommand:= new SACommand();
  ...
  A.SelectCommand.CommandType:= CommandType.StoredProcedure;
  ...
  A.Fill(AProject);

Связываю с контролами
Код: plaintext
1.
  edtDescription.DataBindings.Add(new Binding('Text', Project, 'description'));

Меняю поле, сохраняю
Код: plaintext
1.
2.
  var Changes: DataTable;
  Changes:= AProject.GetChanges();

Получаю в Changes nil. Хотя AProject содержит измененные данные. В чем может быть подвох?

P.S. Соединение открыто постоянно. Может быть с этим связано?
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34479707
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дело не в коннекте. Когда ты создаешь Binding, его свойство DataSourceUpdateMode (т.е. когда данные из контрола закоммитятся в таблицу обратно) имеет значение DataSourceUpdateMode.OnValidation - это означает, что данные в таблицу запишутся когда будет проведена валидация в контроле, это в свою очередь происходит тоже по разным причинам но не само по себе (переход к следующему контролу, смена текущей записи в таблице и т.д.). Т.е. поменяв текст в контроле и не переходя никуда нажав на сохранение ты не запишешь данные обратно в таблицу. На счет рекоммендаций сложней, не знаю как правильней всего, я например в зависимости от ситуации ставлю DataSourceUpdateMode.OnPropertyChanged и еще при сохранении пробегаю по контролам и вызываю
Код: plaintext
1.
2.
3.
4.
foreach (Binding b in Ctrl.DataBindings)
{
     b.WriteValue();
}
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34479836
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha, порою в этом направлении, но!!! в datatable содержатся измененные данные! Т.е. данные изменены, а rowstate нет...
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34479895
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ищи где накосячил, пока AcceptChanges не будет вызван (явно или не явно) и данные действительно изменены, все будет с RowState в порядке. Покажи код, где сохраняешь данные, а где смотришь какие изменения.
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34480034
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторищи где накосячил, пока AcceptChanges не будет вызван (явно или не явно) и данные действительно изменены, все будет с RowState в порядке. Покажи код, где сохраняешь данные, а где смотришь какие изменения.

Где он неявно может вызываться? Данные в datatable принудительно не закидываются, через биндинг делаются... смотри скрин. Первый рисунок -- после загрузки данных, второй перед сохранением и состояние строки...



получается, где-то скрытно AcceptChanges вызвался.
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34480169
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я код просил, по-твоему по картинкам можно нехило заценить, в каком месте AcceptChanges() вызывается ;-) . Лучше потратил бы время вместо рисования на трассировку программы и определения мест, где RowState еще Modified (и есть ли такие) и мест, где он уже снова Unchanged. В конце концов подпишись на событие DataColumnChanged (DataRowChanged) и посмотри происходит ли оно. Короче дебаг помогает лучше чем часы медитации на тему где грабли. По-скольку ты застрял на тривиальной проблеме, не трудно сделать вывод, что ты упустил где-то мелочь какую-то. Это ж вам не это, простой байндинг контрола.
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34480322
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А там больше нет кода. То, что привел в первом посте -- это все.
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34480499
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати о птичках - в коде и на картинке ты смотришь на таблицу AProject, а байндишь контрол к таблице Project, это как очепятка, или то что я подумал ;-) ???
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34480742
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaкстати о птичках - в коде и на картинке ты смотришь на таблицу AProject, а байндишь контрол к таблице Project, это как очепятка, или то что я подумал ;-) ???
Я знал, что кто-нибудь так да подумает ;) AProject - это параметр метода. Разумеется туда передается Project.
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34480786
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не знаю, по-нормальному все должно работать. проверь на простом примере, без параметров шмараметров. Кстати, ты я так понимаю под борландом пишешь, мож там какой косяк закрался. Пробуй с событиями DataColumnChanged (DataRowChanged) - смотри, вызываются ли они, и каков статус строк на тот момент. Ну НЕ МОЖЕТ такого быть, чтоб данные были изменены, а версия строк нет, полюбому ведь есть еще код, раз у нас тут уже параметры откуда-то всплыли, смотри короче, САМО никогда ничего не случается
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34480823
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaне знаю, по-нормальному все должно работать. проверь на простом примере, без параметров шмараметров. Кстати, ты я так понимаю под борландом пишешь, мож там какой косяк закрался. Пробуй с событиями DataColumnChanged (DataRowChanged) - смотри, вызываются ли они, и каков статус строк на тот момент. Ну НЕ МОЖЕТ такого быть, чтоб данные были изменены, а версия строк нет, полюбому ведь есть еще код, раз у нас тут уже параметры откуда-то всплыли, смотри короче, САМО никогда ничего не случается

Я и сам тихо охреневаю.... Я, конечно, еще .нет готовить не научился, но что б до такой степени... Ничего не понимаю...
Пробовал вешать обработчик на DataRowChanging -- не ловиться.

Пишу в студии 2005 -- это Chrome.

Вот выдрал примитивный пример:

Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
namespace WindowsApplication1;

interface

uses
  System.Windows.Forms,
  System.Drawing,
  System.Data,
  iAnywhere.Data.SQLAnywhere;

type
  /// <summary>
  /// Summary description for MainForm.
  /// </summary>
  MainForm = class(System.Windows.Forms.Form)
  {$REGION Windows Form Designer generated fields}
  private
    saConnection1: iAnywhere.Data.SQLAnywhere.SAConnection;
    button1: System.Windows.Forms.Button;
    textBox1: System.Windows.Forms.TextBox;
    components: System.ComponentModel.Container := nil;
    method InitializeComponent;
  {$ENDREGION}
  private
    method button1_Click(sender: System.Object; e: System.EventArgs);
    method MainForm_Load(sender: System.Object; e: System.EventArgs);
  protected
    Project: DataTable;
    method Dispose(aDisposing: boolean); override;
  public
    constructor;
  end;

implementation

{$REGION Construction and Disposition}
constructor MainForm;
begin
  //
  // Required for Windows Form Designer support
  //
  InitializeComponent();

  //
  // TODO: Add any constructor code after InitializeComponent call
  //
end;

method MainForm.Dispose(aDisposing: boolean);
begin
  if aDisposing then begin
    if assigned(components) then
      components.Dispose();

    //
    // TODO: Add custom disposition code here
    //
  end;
  inherited Dispose(aDisposing);
end;
{$ENDREGION}

{$REGION Windows Form Designer generated code}
method MainForm.InitializeComponent;
begin
  var resources: System.ComponentModel.ComponentResourceManager := new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
  self.textBox1 := new System.Windows.Forms.TextBox();
  self.button1 := new System.Windows.Forms.Button();
  self.saConnection1 := new iAnywhere.Data.SQLAnywhere.SAConnection();
  self.SuspendLayout();
  // 
  // textBox1
  // 
  self.textBox1.Location := new System.Drawing.Point( 12 ,  12 );
  self.textBox1.Name := 'textBox1';
  self.textBox1.Size := new System.Drawing.Size( 205 ,  20 );
  self.textBox1.TabIndex :=  0 ;
  // 
  // button1
  // 
  self.button1.Location := new System.Drawing.Point( 205 ,  238 );
  self.button1.Name := 'button1';
  self.button1.Size := new System.Drawing.Size( 75 ,  23 );
  self.button1.TabIndex :=  1 ;
  self.button1.Text := 'button1';
  self.button1.UseVisualStyleBackColor := true;
  self.button1.Click += new System.EventHandler(@self.button1_Click);
  // 
  // saConnection1
  // 
  self.saConnection1.ConnectionString := 'UserID="DBA";Password="sql";ServerName="arctic";AutoStart=No;AutoStop=No;Pooling="false"';
  self.saConnection1.InitString := nil;
  // 
  // MainForm
  // 
  self.ClientSize := new System.Drawing.Size( 292 ,  273 );
  self.Controls.Add(self.button1);
  self.Controls.Add(self.textBox1);
  self.Icon := (resources.GetObject('$this.Icon') as System.Drawing.Icon);
  self.Name := 'MainForm';
  self.Text := 'New Chrome Windows Forms App';
  self.Load += new System.EventHandler(@self.MainForm_Load);
  self.ResumeLayout(false);
  self.PerformLayout();
end;
{$ENDREGION}

method MainForm.MainForm_Load(sender: System.Object; e: System.EventArgs);
var
  P1: SAParameter;
begin
  Project:= new DataTable('project');
  saConnection1.Open;
  var A:= new SADataAdapter();
  A.SelectCommand:= new SACommand();
  A.SelectCommand.Connection:= saConnection1;
  A.SelectCommand.CommandText:= 'get_project_by_id';
  A.SelectCommand.CommandType:= CommandType.StoredProcedure;
  P1:= A.SelectCommand.Parameters.Add('@project_id', SADbType.UniqueIdentifierStr);
  P1.Value:= '1F66883A-A0B2-4377-87A3-06D54ED376C8';; 
  A.Fill(Project);
  saConnection1.Close;
  //
  textBox1.DataBindings.Add(new Binding('Text', Project, 'description'));
  //
end;

method MainForm.button1_Click(sender: System.Object; e: System.EventArgs);
var
  P: SAParameter;
  tr: SATransaction;
begin
  saConnection1.Open;
  //tr:= saConnection1.BeginTransaction as SATransaction;
  try
    var Changes: DataTable;
    Changes:= Project.GetChanges();
    if assigned(Changes) then
    begin
      var Cmd:= new SACommand();
      Cmd:= new SACommand();
      Cmd.Connection:= saConnection1;
      Cmd.CommandText:= 'save_project';
      Cmd.CommandType:= CommandType.StoredProcedure;
     //Cmd.Transaction:= Tr;
      P:= Cmd.Parameters.Add('@project_id', SADbType.UniqueIdentifier);
      P.Value:= Project.Rows[ 0 ]['project_id'];
      P:= Cmd.Parameters.Add('@description', SADbType.VarChar,  256 );
      P.Value:= Project.Rows[ 0 ]['description'].ToString;
      Cmd.ExecuteNonQuery;
    end;  
   // tr.Commit;
  except
    //tr.Rollback;
    raise;
  end;
  saConnection1.Close;
end;

end.
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34481127
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу, все правильно. Я вот как делаю (в примитиве, реально немного сложней)
Код: plaintext
1.
2.
BindingSource bs = new BindingSource(myTable,"");
textBox1.DataBindings.Add("Text", bs, "field1");
Перед проверкой GetChanges нужно сделать
bs.EndEdit() .То же самое происходит автоматом если перед сохранением менялась текущая позиция в таблице. Ваще-то где-то на форуме должен был быть топик по этой теме, вроде там предлагали универсальное решение.
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34481198
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaУгу, все правильно. Я вот как делаю (в примитиве, реально немного сложней )


У-ф-ф-фф! Вроде заработало.
chpasha , спасибо!

Можешь скинуть пример что еще у тебя добавляется и зачем
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34481272
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ничего особенного, в таком порядке
1) для каждого байндинга в контроле делаем WriteValue (что б точно быть уверенным, что данные из представления перекочевали в модель так сказать то бишь из контрола в таблицу)
2) EndEdit либо для BindingSource либо для текущей строки
3) метод HasChangesEx в нем не просто полагаюсь на GetChanges != null а еще для модифицированных строк проверяю отличаются ли значения текущей строки и первоначальной, потому что если ты изаменишь в строке поле сначала с А на Б а потом снова с Б на А то строка будет Modified - но фактически поле то не изменилось по сравнению с оригиналом, т.е. и сохранять его нефиг. Этот последний пункт с оглядкой на производительность, т.к. будут пробегаться столбцы для каждой измененной строки и сравниваться друг с другом - тут надо уже смотреть не сильно ли долго, не легче ли сохранить пустышку
...
Рейтинг: 0 / 0
DataTable.GetChanges...
    #34481277
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угум, понятно...
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / DataTable.GetChanges...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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