我写的一个记录查询函数FixQry,表名车辆维修记录详表,包含车号、日期等字段,用车号、年、月查询,代码中的S2和S3字段用year(日期)和mounth(日期)返回时间的年和月,DAHelper.ExeSqlQuery是一个执行SQL语句的函数,返回TADOQuery,执行FixQry总是提示sql赋值一句出错,请高手帮忙改错,多谢!
function FixQry(CarNo,FixY,FixM:string):TADOQuery;
var
s1,s2,s3,sql:string;
begin
if (CarNo='') then //车号查询条件
s1:='1=1'
else
s1:='车号='+''''+CarNo+'''';
if (FixY='') then //年查询条件
s2:='1=1'
else
s2:='year(日期)='+''''+FixY+'''';
if (FixM='') then //月查询条件
s3:='1=1'
else
s3:='month(日期)='+''''+FixM+'''';
sql:='select * from 车辆维修记录表 where '+s1+'and'+s2+'and'+s3;
result:=DAHelper.ExeSqlQuery(sql);
end;
function FixQry(CarNo,FixY,FixM:string):TADOQuery;
var
s1,s2,s3,sql:string;
begin
if (CarNo='') then //车号查询条件
s1:='1=1'
else
s1:='车号='+''''+CarNo+'''';
if (FixY='') then //年查询条件
s2:='1=1'
else
s2:='year(日期)='+''''+FixY+'''';
if (FixM='') then //月查询条件
s3:='1=1'
else
s3:='month(日期)='+''''+FixM+'''';
sql:='select * from 车辆维修记录表 where '+s1+'and'+s2+'and'+s3;
result:=DAHelper.ExeSqlQuery(sql);
end;
解决方案 »
- 我一电脑安装多台打印机时,delphi6 自带Qreport报表打印如果指定打印机!
- DELPHI中form的边界线框问题。
- 如何让dbgrid中第一列colum是序号,而且是动态的,急,时间紧,请各位大大援手。
- 奇怪!怎么不能创建新的窗体了?
- 怎么判断按下了鼠标左键
- 如何得到一个控件所在的窗体的名称?
- dll中的mdichildwindow
- socket 程序问题,各位大侠指点一下,弄了两天了!
- 如何建立一临时查询然后其中进行统计(不是生成表,因为如果是表的话有十几万条记录如何能快速删除?)如果使用视图,如何在不关闭连接的情况下动态生成视图呢?我使用的是interbase5.6数据库.(答对了我这有MM程序员的EMail哟!!!!!^Q^)
- 用Delphi怎样模仿Vb的SendKeys向有输入焦点的应用程序发送“中文的字符串”
- delphi Try扑捉错误!
- 如何给分啊
{留意此句在AND的前后要加入空格}
sql:='select * from 车辆维修记录表 where '+s1+' and '+s2+' and '+s3;
CodeDM.QueryData.Close;
CodeDM.QueryData.SQL.Clear;
CodeDM.QueryData.SQL.Add('select distinct kmYM from aKM where kmYM='''+v_AY+'''');
CodeDM.QueryData.Open;解释:'select distinct kmYM from aKM where kmYM='''+v_AY+''''
1.第一个单引号和“=”号后面的第三个单引号是一对,“=”号后面的第一个单引号作转义符用,将“=”号后面第二个单引号转义成SQL认识的单引号。
2.最后面的四个单引号:其中第一个和最后一个是一对,表示在其中的都是字符,第二个是作转义符用,将第三个转成SQL认识的单引号。 如果搞不清楚,以可以用'select distinct kmYM from aKM where kmYM='+QuotedStr(v_AY)QuotedStr()的用途就是自动在v_AY前后加单引号。
以下针对SQL Server数据库进行讨论。例句:With Query1 do
begin
close;
SQL.Clear;
SQL.Add('select * from Customers where CompanyName = '"+Edit.Text+"'');
//要传入一个字符串
Open;
end;
论坛上经常有人为了一句动态加入的SQL语句中的那么多引号犯迷糊。首先,当确定要传入SQL的变量是一个字符串而不是数值时,为了不至于被引号弄糊涂,可以有如下方法:
1。用参数来解决:
(1)当传入字串仅是当作字串常量使用时
Query1.SQL.Add('select * from Customers where CompanyName = :Company');
Query1.Parambyname('Company').asstring := Edit1.Text;
...
(2)当传入字串要当作日期字段的比较值时,可以用Convert()函数把参数强制为日期型数据,当然,要保证该字串符合转为日期型的条件。
Query1.SQL.Add('select * from Orders where OrderDate >= Convert(Datetime, :OrderDate )');
Query1.Parambyname('OrderDate').asstring := Edit1.Text;
...
2。用Delphi的引用串函数QuotedStr()来解决:
Query1.SQL.Add('select * from Customers where CompanyName = '+ QuotedStr(Edit1.Text));
...
QuotedStr()函数得到的是一个带引用的字符串,即加了引号的字串。
3。用ASCII码值 #39 代表单引号,组成字串表达式:
Query1.SQL.Text := 'select * from Customers where CompanyName = '+ #39 + Edit1.Text + #39;
...其次,当确定要传入SQL的变量是 数值 时,可以直接把它SQL语句表达式字串相连接,而不须加引号了。例如:
Query1.SQL.Text := 'select * from Customers where CompanyName = '+ Edit1.Text;
//当变量字段时直拉相联
with adQ do begin
close;
sql.Text:='select * from s_splat where '+str_name+'='+QuotedStr(suiedit1.Text);
open;
end;
1.第一个单引号和“=”号后面的第三个单引号是一对,“=”号后面的第一个单引号作转义符用,将“=”号后面第二个单引号转义成SQL认识的单引号。
2.最后面的四个单引号:其中第一个和最后一个是一对,表示在其中的都是字符,第二个是作转义符用,将第三个转成SQL认识的单引号。
第一条里等号后面的第一个和第三个单引号是T-SQL的符号还是PASCAL的符号?
第二条里的第一和第四是是T-SQL的符号还是PASCAL的符号?
还有开始的select前面的单引号是否需要配对?
多谢!!