0

古い Delphi システムに問題があります。このシステムはデータを SQL Server テーブルに挿入します。

10 年後、テーブルのフィールドを 100 文字から 255 文字に変更します。

システムはテーブルのすべてのレジストリを選択し、変換後に別のテーブルに配置します。それはうまくいきます。

問題は、システムがフィールドを更新するときです。

それは私にエラーを示します

「別のユーザーがレコードを変更したため、編集を実行できませんでした」というメッセージの EDBEngineError。

sConsulta:='SELECT * FROM cuentas WHERE (WALL= 2) AND (SEND_DATE = '01/01/1970')';
m_oQryLeg.Close;
m_oQryLeg.SQL.Clear;
m_oQryLeg.SQL.Add(sConsulta);
m_oQryLeg.Open;
m_oTblNov.Close;
m_oTblNov.TableName:='des_table';
m_oTblNov.Open;

with m_oTblNov do
begin
  while (not m_oQryLeg.EOF) do
  begin
    Insert;
    FieldbyName('COD_HOME').AsString:= m_oQryLeg.FieldByName('USR_HOME').AsString;
    (...)
    Post;

    m_oQryLeg.Edit;
    m_oQryLeg.FieldByName('SEND_DATE').AsDateTime:= Date; //<-- HERE THE ERROR
    m_oQryLeg.Post;

    m_oQryLeg.First;
    m_oQryLeg.MoveBy(i);
    inc(i);
  end;    
end;
m_oTblNov.Close;
m_oQryLeg.Close;

UpdateMode: upWhereAll

cuentas テーブル:

  • NUM_SOL nvarchar 6 *PK
  • WALL tinyint 1
  • SEND_DATE smalldatetime 4
  • OBS_CRED nvarchar 255
  • FLCCリアル4
  • STREET nvarchar 30
4

2 に答える 2

1

同時に編集しているテーブルで使用しているクエリを更新しようとしていますが、うまくいきません。

クエリのすべての行を に挿入することはわかっているのにm_oTblNov、代わりにこのようにしてみませんか?

sConsultaSELECT :='SELECT * FROM cuentas';
sConsultaUPDATE := 'UPDATE cuentas SET Send_Date = :New_Date';
// Separate WHERE so you can use it twice. Note the leading space
// between the first ' and WHERE.
sWhere := ' WHERE (WALL = 2) and (SEND_DATE = ''01/01/1970'')';


m_oQryLeg.Close;
m_oQryLeg.SQL.Text := sConsulta + sWhere;
m_oQryLeg.Open;

m_oTblNov.Close;
m_oTblNov.TableName:='des_table';
m_oTblNov.Open;

with m_oTblNov do
begin
  while (not m_oQryLeg.EOF) do
  begin
    Insert;
    FieldbyName('COD_HOME').AsString:= m_oQryLeg.FieldByName('USR_HOME').AsString;
    (...)
    Post;

    // Don't run these any more. See below.
    // m_oQryLeg.Edit;
    // m_oQryLeg.FieldByName('SEND_DATE').AsDateTime:= Date; //<-- HERE THE ERROR
    // m_oQryLeg.Post;

    m_oQryLeg.First;
    m_oQryLeg.MoveBy(i);
    inc(i);
  end;    
end;
m_oTblNov.Close;
m_oQryLeg.Close;
m_oQryLeg.SQL.Text := sConsultaUPDATE + sWHERE;
m_oQryLeg.ParamByName('New_Date').AsDateTime := Date;
try
  m_oQryLeg.ExecSQL;
finally
  m_oQryLeg.Close;
end;
于 2011-04-19T20:12:20.030 に答える
0

ここでの問題は、オブジェクトがデータベースから行を更新して、何も変更されていないことを確認しようとしていることです。おそらく、オブジェクトが何らかの値を切り捨てたり丸めたりして、更新によって行が返されない可能性があります。

これは、float 値が切り捨てられているか、他の値がオフになっていることが原因である可能性があります。

この問題を修正するためにその列を変更しない/変更できない場合は、upWhereChanged または upWhereKeyOnly に変更することをお勧めします。

ほとんどの Windows データベースで日付が double として扱われることを考えると、upWhereKeyOnly が最適だと思います。

編集:

テーブルを見た後、単一ベースの smalldatetime を使用しているという事実に関係している可能性があります。Delphi はすべての DateTime データを double として扱い、前後の変換によって小さな丸めの問題が発生する可能性があります。

于 2011-04-19T17:38:02.597 に答える