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;

更新模式:upWhereAll

cuentas 表:

  • NUM_SOL nvarchar 6 *PK
  • 墙小号 1
  • SEND_DATE 小日期时间 4
  • OBS_CRED nvarchar 255
  • FLCC 真实 4
  • 街道 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

这里的问题是您的对象正在尝试刷新数据库中的行以确保没有任何更改,并且对象很可能截断或舍入了一些导致刷新不返回行的值。

这可能是由于浮点值被截断或其他一些值被关闭造成的。

如果您不/不能更改该列来解决此问题,我建议您更改为 upWhereChanged 或 upWhereKeyOnly。

鉴于日期在大多数 Windows 数据库中被视为双精度数,我认为 upWhereKeyOnly 是最好的。

编辑:

查看您的表格后,这可能与您使用基于单一的 smalldatetime 的事实有关。Delphi 将所有 DateTime 数据视为双精度数据,来回转换可能会导致小的舍入问题。

于 2011-04-19T17:38:02.597 回答