您的位置:首页 > 数据库

ASQLite3UpdateSQL 解析UpdateSQL中的BUG

2010-11-18 09:46 211 查看
ASQLite3控件在SQLite数据库开发中比较好用,在ASQLite3Query 连接 ASQLite3UpdateSQL 更新数据库

 

ASQLite3UpdateSQL中
(f_id为主键,tj为表名)
 DeleteSQL : delete tj  where f_id=:f_id 
 InsertSQL : INSERT INTO tj *
 UpdateSQL : UPDATE tj * WHERE f_id=:f_id

 

其中使用UpdateSQL老报错,根据跟踪调试,发现问题:

 

ASGSQLite3.pas 有BUG:

 

在procedure TASQLite3Query.InternalPost 中:

 

第4628,4629行原来这样:
 4628:     TheWord := GetWord(MySQL, startpos, vartype); // , or 'where'
 4629:       until AnsiCompareText(TheWord, 'where') = 0;
 4630:     end;
 4631:       if not SyntaxCheck(TheWord, 'where') then
 4632:          raise AsgError.Create('Syntax error: "where" expected')
 4633:       else
 4634:          SQLStr := SQLStr + ' where ';
 4635:       SQLStr := SQLStr + Copy(MySQL, startpos, 9999);
 4636:       Connection.SQLite3_ExecSQL(SQLStr, Fields);
 4637:       inherited InternalPost;           // rework internals

改成:

 4628:     TheWord := GetWord(MySQL, startpos, vartype); // , or 'where'
 4629:     if TheWord =',' then  SQLStr := SQLStr +',' ;    // (增加这行)
 4630:       until AnsiCompareText(TheWord, 'where') = 0;
 4631:       if not SyntaxCheck(TheWord, 'where') then
 4632:          raise AsgError.Create('Syntax error: "where" expected')
 4633:       else
 4634:          SQLStr := SQLStr + ' where ';
 4635:       SQLStr := SQLStr + Copy(MySQL, startpos, 9999);
 4636:    end;  // 原4630行的end 移动到这里
 4637:       Connection.SQLite3_ExecSQL(SQLStr, Fields);
 4638:       inherited InternalPost;           // rework internals

增加4629行是为了解决update tj set fphm=:fphm,rq=:rq where f_id=:f_id 这样写时生成的UpdateSQL中间没有','的错。
移动4630的'end;'是为了解决update tj * where f_id=:f_id 这样写时生成的UpdateSQL中重复生成'where'内容!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息