Delphi,错误:“地址xxxxxxxx处的访问冲突。读取地址yyyyyyyy”,在AdoQuery.SQL.Text:='''

时间:2013-11-18 12:58:44

标签: sql delphi

  

“地址xxxxxxxx的访问违规。读取地址yyyyyyyy”

在这个项目中我有200多个这样的程序,但只有这个程序才会出错(只有windows xp)..

程序而非错误:

Procedure TfMain.CreateNewDocument(p_money_direction,p_status,p_base:integer);
begin
  With fMain.ADOTemp  do
  Begin
    SQL.Clear;
    SQL.Text:='INSERT INTO documents '+
              '(document_date,fk_id_status,money_direction,'+
              'paid,addition,saving,fk_id_base,fk_id_user)'+
              'VALUES '+
              '(CONVERT(DATE,:pdocument_date,103),:pfk_id_status,'+
              ':pmoney_direction,0,0,0,:pfk_id_base,:pfk_id_user)';
    Parameters.ParamByName('pdocument_date').Value:=Date;
    Parameters.ParamByName('pfk_id_status').Value:=p_status;
    Parameters.ParamByName('pmoney_direction').Value:=p_money_direction;
    Parameters.ParamByName('pfk_id_base').Value:=p_base;
    Parameters.ParamByName('pfk_id_user').Value:=fMain.ApplicationVariablers.user_id;
    ExecSQL;
  End;
end;

错误:

    SQL.Text:='INSERT INTO documents '+
              '(document_date,fk_id_status,money_direction,'+
              'paid,addition,saving,fk_id_base,fk_id_user)'+
              'VALUES '+
              '(CONVERT(DATE,:pdocument_date,103),:pfk_id_status,'+
              ':pmoney_direction,0,0,0,:pfk_id_base,:pfk_id_user)';

解密过程,第1907行的错误:

print screen http://oi43.tinypic.com/2cerriw.jpg

2 个答案:

答案 0 :(得分:0)

我解决了这个问题

Procedure TfMain.CreateNewDocument(p_money_direction,p_id_status,p_id_base:integer);
Var
  ADOTemp:TAdoQuery;
begin
  ADOTemp:=TADOQuery.Create(nil);
  ADOTemp.Connection:=fMain.ADOConnection;

  With ADOTemp  do
  Begin
    SQL.Clear;
      SQL.Add('INSERT INTO documents');
      SQL.Add('(document_date,fk_id_status,money_direction,');
      SQL.Add('paid,addition,saving,fk_id_base,fk_id_user)');
      SQL.Add('VALUES ');
      SQL.Add('(CONVERT(DATE,GETDATE(),103),:pfk_id_status,:pmoney_direction,');
      SQL.Add('0,0,0,'+IntToStr(p_id_base)+',:pfk_id_user)');

    Parameters.ParamByName('pfk_id_status').Value:=p_id_status;
    Parameters.ParamByName('pmoney_direction').Value:=p_money_direction;
    //Parameters.ParamByName('p').Value:=p_id_base;
    Parameters.ParamByName('pfk_id_user').Value:=fMain.ApplicationVariablers.user_id;
    ExecSQL;
  End;
end;

我删除了 Parameters.ParamByName('p')。值:= p_id_base; 并且有效

http://oi43.tinypic.com/dvotxx.jpg

但这不是好的解决方案

答案 1 :(得分:-2)

首先,使用“add”insthead .text更改文本属性的分配。 使用文字并不好。一年前,我为复杂的sql语句发出了uisng text属性。 另外,我建议你: 忘记陈述。 每次我使用“with”处理代码时,我花费(浪费)更多时间来理解代码。

With fMain.ADOTemp  do
  Begin
    AdoTemp.SQL.Clear;
    AdoTemp.SQL.Add( ' INSERT INTO documents ');
    AdoTemp.SQL.Add( ' (document_date,fk_id_status,money_direction, ');
    ....