我用adoquery进行查询,放了一个MESSAGE来显示SQL语句来检验是否正确(测试用),显示结果如下:
select * from 表名 where 总号='52'
而数据库内该总号字段为整数类型。尝试转换类型始终不能成功,因为52的数值来自于用户输入的关键字,所以不能固定。请问该如何处理。真晕啊,看着觉得太简单却不能搞定。
大侠们帮帮忙!分不多,谢谢!
select * from 表名 where 总号='52'
而数据库内该总号字段为整数类型。尝试转换类型始终不能成功,因为52的数值来自于用户输入的关键字,所以不能固定。请问该如何处理。真晕啊,看着觉得太简单却不能搞定。
大侠们帮帮忙!分不多,谢谢!
我把通过COMBOBOX1选择的字段名称和EDIT得到的关键字作为TIAOJIAN1,再根据复选框看是否选择时间段作为TIAOJIAN2,如果选择了就组合成一个SQL。
以上只是我的精确查询代码,模糊查询已经调试通过,代码基本类似(但没涉及到数值字段)。
变量1=52With ADOQuery Do
Begin
sql.clear;
sql.Add('select * from 表名 where 总号=:变量1 ');
Parameters.ParamByName('总号').Value:=变量1;
Open;
end;
使用参数传递
With ADOQuery Do
Begin
sql.clear;
sql.Add('select * from 表名 where 总号=:变量1 ');
Parameters.ParamByName('变量1').Value:=52
Open;
end;
begin
findkey:=edit3.text;
if combobox1.text='总号' then tiaojian1:='总号 = '''+findkey+''''
else if combobox1.text='分号' then tiaojian1:='分号 = '''+findkey+''''
else if combobox1.text='发文单位' then tiaojian1:='发文单位 = '''+findkey+''''
else if combobox1.text='受文单位' then tiaojian1:='受文单位 = '''+findkey+''''
else if combobox1.text='核查去向' then tiaojian1:='核查去向 = '''+findkey+''''
else if combobox1.text='备注' then tiaojian1:='备注 = '''+findkey+''''; //这里是分号贴上来就成这样子象个冒号
if checkbox3.Checked then //是否选择时间段查询条件
begin
tiaojian2:=' 收到日期>=#'+DateToStr(datetimepicker1.DateTime)+'# and 收到日期<=#'+DateToStr(datetimepicker2.datetime)+'# ';
adoquery1.Close;
adoquery1.SQL.Clear;
mysql:=concat('select * from stainfo where (',tiaojian1,') and ',tiaojian2);
adoquery1.SQL.Add(mysql);
try
adoquery1.Open;
except
showmessage('条件配置错误');
end;
end
else
begin
adoquery1.Close;
adoquery1.SQL.Clear;
mysql:=concat('select * from stainfo where ',tiaojian1);
adoquery1.SQL.Add(mysql);
try
adoquery1.Open;
except
showmessage(mysql);//看一下语句组合后是什么?
showmessage('条件b配置错误');
end;
end;
end;
“……不正常地定义参数对象,提供了不一致或不完整的信息。”
声明一下,动态参数已经在ADOQUERY1的参数里面建立。
With ADOQuery Do
Begin
Close;
sql.clear;
sql.Add('select * from 表名 where 总号=:p1');
Parameters.ParamByName('p1').Value:=StrToInt(Edit1.Text);
Open;
end;
另外用动态参数后调试出现错误提示WHERE语句错误
直接在目录中运行生成的程序,代码中放置的信息框弹出,内容(SQL语句)如下:
select * from 表名 where 总号=:zh
其实你大可以 combobox1改变后对输入框进行限制输入的字符
限制输入字符简单例子:
procedure TfrmLogin.txtUserKeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9','a'..'z','A'..'Z','_',#8,#13]) then
key:=#0;
end;
对于
findkey:=edit3.text;
if combobox1.text='总号' then tiaojian1:='总号 ='+findkey
另外用动态参数后调试出现错误提示WHERE语句错误
直接在目录中运行生成的程序,代码中放置的信息框弹出,内容(SQL语句)如下:
select * from 表名 where 总号=:zh
/////////////////////////////////////////////////方法有很多种……
为什么不先用回复的试一试再讨论呢?
我看书上好象需要嘛!
另外用动态参数后调试出现错误提示WHERE语句错误
直接在目录中运行生成的程序,代码中放置的信息框弹出,内容(SQL语句)如下:
select * from 表名 where 总号=:zh
有必要解释一下,select * from 表名 where 总号=:zh
是执行的字符串,adoquery1会对它进行转换,然后提交到sql server上
if combobox1.text='总号' then tiaojian1:='总号 ='+findkey
改的这句,之所以没有成功,是因为我的小程序有点保密要求,字段名我省略了,刚才打开数据库文件仔细查看才发现不相符,改回来一试就成了,谢谢!抱歉