我的代码:
with GAdoQuery do
try
if Active then Close;
SQL.Clear;
SQL.Add(' SELECT * FROM M_USER WHERE VC_USERID = :USERID ');
Parameters.ParamByName('USERID').Value := '0001';
showmessage(sql.text);
Open;
finally
Close;
end;
这段代码在执行到showmessage后,显示出的sql语句是: SELECT * FROM M_USER WHERE VC_USERID = :USERID
我希望能显示出的sql语句是: SELECT * FROM M_USER WHERE VC_USERID = '0001'
请高手指教该怎么写?
with GAdoQuery do
try
if Active then Close;
SQL.Clear;
SQL.Add(' SELECT * FROM M_USER WHERE VC_USERID = :USERID ');
Parameters.ParamByName('USERID').Value := '0001';
showmessage(sql.text);
Open;
finally
Close;
end;
这段代码在执行到showmessage后,显示出的sql语句是: SELECT * FROM M_USER WHERE VC_USERID = :USERID
我希望能显示出的sql语句是: SELECT * FROM M_USER WHERE VC_USERID = '0001'
请高手指教该怎么写?
解决方案 »
- cxgrid中怎么加入行号?怎么固定行号
- 如何实现鼠标放置位置的图标的操作提示?(在线等待!)
- SQL的脚本语言如何在前端执行
- 怎么修改提示框的标题栏?
- 关于菜单的设计
- olecontainer问题,高手请指点
- CreateToolhelp32SnapShot 返回的句柄的使用先后有什么不同吗
- ActiveFrom需要数字签名,方可在客户浏览器上使用,但数字签名怎么搞,望各位高手给点提示。解决问题800分程上。
- 如何得到文件名???
- 高手,求你们了,做一个数据库,如何放带图片的word文档(图片在文章中有确切位置)
- procedure TForm1.Button1Click(Sender: TObject);
- 制作delphi用table实现登录界面
showmessage(GADOQuery.SQL.Text);
何况那样还有什么意义?
ADO就跟踪不了带参数的SQL语句
SQL.ADD('SELECT * FROM M_USER WHERE VC_USERID ='+QuotedStr('0001'))
这样写算了
虽然可以达到目的,但是对于频繁执行的sql语句来说,是个非常低效的做法,我连的数据库是oracle,如果这样写,每次调这个sql的时候,oracle都要重新编译这个sql语句;而如果采用带参数的方式,就不用重复编译了
with GAdoQuery do
try
if Active then Close;
SQL.Clear;
SQL.Add(' SELECT * FROM M_USER WHERE VC_USERID = :USERID ');
Parameters.ParamByName('USERID').Value := '0001';
showmessage(GetParamSQL(GAdoQuery));
Open;
finally
Close;
end; function GetParamSQL(aq: TADOQuery): String;
var
i: Integer;
str, ParameName, ParameValue: String;
begin
str := '';
if aq = nil then
exit;
str := aq.SQL.Text;
for i := 0 to aq.Parameters.Count - 1 do
begin
ParameName := ':' + aq.Parameters[i].Name;
ParameValue := '''' + aq.Parameters[i].Value + '''';
str := StringReplace(str, ParameName, ParameValue, [rfIgnoreCase]);
end; Result := Str;
end;
try
if Active then Close;
SQL.Clear;
SQL.Add(' SELECT * FROM M_USER WHERE VC_USERID = :USERID ');
Parameters.ParamByName('USERID').Value := '0001';
showmessage(sql.text);
Open;
finally
Close;
end;
-----
with GAdoQuery do
try
if Active then Close;
SQL.Clear;
SQL.Add(' SELECT * FROM M_USER WHERE VC_USERID = ''0001''');
Open;
finally
Close;
end;
procedure TfrmMain.AdoQueryBeforeOpen(DataSet: TDataSet);
var
sLog, sTmp: string;
i: Integer;
begin
with (DataSet as TADOQuery) do
begin
sLog := SQL.Text;
for i:=0 to Parameters.Count-1 do
begin
if Parameters.Items[i].DataType in [ftString] then
sTmp := QuotedStr(Parameters.Items[i].Value)
else
sTmp := Parameters.Items[i].Value; sLog := StringReplace(sLog, ':'+Parameters.Items[i].Name, sTmp, [rfReplaceAll, rfIgnoreCase]);
end;
end;
WriteLog(sLog);
end;这个函数赋给了 tadoquery控件的 beforeopen事件,这样每次这个控件open之前,都会把sql语句写到日志里,但是当我需要执行execsql时,没有触发beforeopen这个事件,请高手指点下无论是open还是exexsql都会触发的事件是哪个?
with GAdoQuery do
try
Close;
SQL.text:='SELECT * FROM M_USER WHERE VC_USERID =''0001''';
Open;
except
end; 如果是变量: with GAdoQuery do
try
Close;
SQL.text:='SELECT * FROM M_USER WHERE VC_USERID ='''+var+'''';
Open;
except
end;