'insert into 錯誤提示,初學delphi不知錯在哪里?(50分)

  • 主题发起人 主题发起人 itassist06
  • 开始时间 开始时间
I

itassist06

Unregistered / Unconfirmed
GUEST, unregistred user!
begin
adoquery1.close;
adoquery1.sql.clear;
Adoquery1.sql.add ('insert into zhanghao(user,password,age,xingbie)values(:1,:2,:3,:4)');
Adoquery1.parameters.parambyname('1').value:=''+Edit1.Text+'';
Adoquery1.parameters.parambyname('2').value:=''+Edit2.Text+'';
Adoquery1.parameters.parambyname('3').value:=''+Edit3.Text+'';
Adoquery1.parameters.parambyname('4').value:=''+Edit4.Text+'';
Adoquery1.execsql;
application.MessageBox('數據已錄入,請查看!','完成提示',mb_ok);
edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit4.Text:='';
end;
end.


以上代碼在運行時總是提示"insert into 語法錯誤"
請幫幫忙!
 
加一个单引号要用四个单引号:''''
''''+edit1.txt+'''';
 
对,''''代表一个单引号。例如‘我’要在程序中写成''''+ '我' + ''''或'''我'''的形式
...
begin
adoquery1.close;
adoquery1.sql.clear;
Adoquery1.sql.add ('insert into zhanghao(user,password,age,xingbie)values(:1,:2,:3,:4)');
Adoquery1.parameters.parambyname('1').AsString :=''''+Edit1.Text+''''; //字符型
Adoquery1.parameters.parambyname('2').AsInteger :=Edit2.Text; //整型
Adoquery1.parameters.parambyname('3').AsFloat:=Edit3.Text; //浮点型
Adoquery1.parameters.parambyname('4').AsDateTime:=''''+Edit4.Text+''''; //日期型
Adoquery1.execsql;
application.MessageBox('數據已錄入,請查看!','完成提示',mb_ok);
edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit4.Text:='';
end;
end.
...
以上是各种数据类型向SQL中添加的规律和引号的用法。
 
楼上说得对!
还有我怎么看,有必要加'吗?
你的全部是字符型吗?
 
我也刚学SQL这两天刚遇到这样的问题 不过我自己做了测试 总结出了一下内容
//在s:=s;处加断点 观测各个断点处的S的值
{1 在断点处观察 s='A'; S就为字符A}
//S:='A';

{2 断点处观察S=''A'' 'A'表示这是一个字符 '''A'''表示 字符用单引号括住了 }
//S:='''A''';

{S='A' edtName的text属性默认为A}
//S:=edtName.Text;

{S='A' 和上面的一样}
//S:=''+edtName.Text+'';

{S=''+edtName.Text+''}
//S:='''+edtName.Text+''';

{S=''A''}
S:=''''+edtName.Text+'''';

{S='NameA'}
//S:='Name'+'A';

{S=''Name''A''}
//S:='''Name'''+'''A''';

{S='AA'}
//S:='A'+edtName.Text;

{S='A'A'}
//S:='A'''+edtName.Text+'';

{S='A''}
//S:='A''';

{S='A'A''}
//S:='A'''+edtName.Text+'''';

{S=''' 中间的'' 当做了单引号 s就是字符单引号}
//S:='''';


{通过上面的试验 我做了个总结
如果'' 直接在一个字符前面或后面 其值相当于一个单引号 比如 'A'''等于字符串A'
如果'' 单独出现相当于扫描也没有 比如'A'+''+'B' 等于字符串AB
如果如果想把表达式的值如edit1.text的字符串用单引号括起来应该这样表达
''''+edit1.text+'''' 但是如果前面已有一个字符串如A 可以这样表达
'A'''+edit1.text+''''}


{在SQL语句中 如果查询的字段为字符型 例如 我们想在表Table
中查询 字段name 为 jack的记录 其sql语句为
Select *from Table where name='jack' (单引号括住)
或者 Select *from Table where name="jack" (用双引号)
所以在delphi中 如果用字符串型s 来代替SQL语句最后要达到
s=' Select *from Table where name="jack" '
或者s=' Select *from Table where name='jack' '这样的形式
所以应该这样写
s:='Select *from Table where name='+'"'+'jack'+'"';
或者s:='Select *from Table where name='+'''jack''';
或者s:='Select *from Table where name='''+'jack''';
或者s:='Select *from Table where name='+''''+'jack'+'''';
在执行SQL.Add(S);}
 
加上''''+edit1.txt+''''也還是不行, 提示'insert into 語法錯誤
錯誤提示時光標停在下面一行的位置:
<<application.MessageBox('數據已錄入,請查看!','完成提示',mb_ok);>>
 
你的age是整型,就不要加单引号了
直接Edit3.Text就可以了
 
直接写成sql语句吧,不要用parameter这个来做,这样比较好调试
 
我現在暫時把它們都是定義成字符型的,
 
begin
adoquery1.close;
adoquery1.sql.clear;
Adoquery1.sql.add ('insert into zhanghao(user,password,age,xingbie)values(:1,:2,:3,:4)');
Adoquery1.parameters.parambyname('1').AsString :=''''+Edit1.Text+''''; //字符型
Adoquery1.parameters.parambyname('2').AsInteger :=Edit2.Text; //整型
Adoquery1.parameters.parambyname('3').AsFloat:=Edit3.Text; //浮点型
Adoquery1.parameters.parambyname('4').AsDateTime:=''''+Edit4.Text+''''; //日期型
Adoquery1.execsql;
application.MessageBox('數據已錄入,請查看!','完成提示',mb_ok);
edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit4.Text:='';
end;
end.
以上是各种数据类型向SQL中添加的规律和引号的用法。
 
Johnny_du的那中方法也不行,他會在
Adoquery1.parameters.parambyname('1').AsString :=''''+Edit1.Text+''''; //字符型

就開始提示錯誤
不知道怎樣可以把那個文件上傳讓哪位大蝦幫我調示一下
 
噢!呵呵,不好意思!是ADOQuery我错看成Query了,应该还是用Value的,如下:
begin
adoquery1.close;
adoquery1.sql.clear;
Adoquery1.sql.add ('insert into zhanghao(user,password,age,xingbie)values(:1,:2,:3,:4)');
Adoquery1.parameters.parambyname('1').Value:=''''+Edit1.Text+''''; //字符型
Adoquery1.parameters.parambyname('2').Value :=Edit2.Text; //整型
Adoquery1.parameters.parambyname('3').Value:=Edit3.Text; //浮点型
Adoquery1.parameters.parambyname('4').Value:=''''+Edit4.Text+''''; //日期型
Adoquery1.execsql;
application.MessageBox('數據已錄入,請查看!','完成提示',mb_ok);
edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit4.Text:='';
end;
end.
忘记了ADOQuery的Parameters.ParamByName属性没有提供AsString等AsXX类的服务,所以只能用Value让它自己去匹配了。
 
其他的我不写了,就直接写生成sql语句这里,生成的sql语句用一个SqlStr字符串变量来保存。
SqlStr := 'insert into zhanghao (user,password,age,xingbie) values(';
SqlStr := SqlStr + ''''+Edit1.Text+''''+','+''''+Edit2.Text+''''+','+''''+Edit3.Text+''''+','+''''+Edit4.Text+''''+')';
然后你调试的时候,先用showmessage函数显示一下这个sql语句对不对,一般sql语句不对,那绝对出错的。这样可以避免去使用parameters来操作,简单,好调试!
 
嗯,楼上的说的方法也正确,但是要注意除了字符型和日期型的之外,其余的数据类型不要在字段前后加''''。
 
经测试,你的没有问题。恢复中四个单引号得到出现了问题。
首先是你的字断都是string 不能是其它类型,
 
我把他上傳到這個網止了,
http://ITASSIST06.gbaopan.com/files/0ebd11c91ecf4fd09c3389f519d70e31.gbp
 
我的郵箱是ITASSIST06@126.COM
修改好之后請發給我看看. 謝謝!!!
 
var
sqlstr:string;
i,code;
begin
val(trim(edit3.text),i,code);//年龄为整型,用户名,密码,性别为字符类型;
if code<>0 then
begin
showmessage('数据类型不正确');
exit;
end;
sqlstr:='insert into zhanghao(user,password,age,xingbie)values('+quotedstr(trim(edit1.text)+','+quotedstr(trim(edit2.text)+','+edit3.text+','+quotedstr(trim(edit4.text)+')';
with adoquery1 do
begin
close;
sql.clear;
sql.text:=sqlstr;
execsql;
end;
end;
 
用cqwty的方法, 錯誤是不提示了, 但它卻沒有新增進去資料,不知為什麼
 
你先显示一下sql语句是不是正确的撒,如果正确的,那就不是代码的问题了哦!
 
后退
顶部