表字段更改后更新

时间:2011-04-19 14:36:46

标签: sql-server delphi delphi-5

我有一个旧的Delphi系统的问题,这个系统将数据插入到SQL Server表中。

10年后,将表格的字段从100更改为255个字符。

系统选择表的所有registris,并在转换后将它们放在另一个表上。这很好。

问题出在系统更新字段时。

告诉我错误

  

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 real 4
  • STREET nvarchar 30

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

这可能是由浮点值被截断或其他值被关闭引起的。

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

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

编辑:

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