sql语句找错
with datamodule1.query1 do
begin
close;
sql.clear;
sql.add('insert into e_basic (name,code)');
sql.add('values(:ename,:ecode)');
sql.add('insert into e_basic (folk,clan)');
sql.add('values(:nationality,:homeplace)');
Params.ParamValues['ename;ecode']:=vararrayof([name.text,code.text]);
params.paramValues['folk;clan']:=vararrayof([folk.text,clan.text]);
execsql;
applyupdates;
commitupdates;
运行时报错“sql命令未正确结束”,请指教。
问题点数:39、回复次数:28Top
1 楼lichp(lichp)回复于 2001-05-09 10:48:00 得分 0
我找,却找不到!Top
2 楼iseeks(iseeks)回复于 2001-05-09 10:49:00 得分 0
我用的是oracle数据库Top
3 楼BrentIvan(Ivan)回复于 2001-05-09 10:49:00 得分 2
空格掉了
sql.add('insert into e_basic (name,code) ');
sql.add('values(:ename,:ecode) ');
sql.add('insert into e_basic (folk,clan) ');
sql.add('values(:nationality,:homeplace)');
而且你两个Sql这样连写似乎有问题吧
Top
4 楼kingsong(牛大锅)回复于 2001-05-09 10:57:00 得分 0
空格可不加,两个sql联写,不能执行。
为什么不insert into e_basic (name,code,folk,clan)...Top
5 楼iseeks(iseeks)回复于 2001-05-09 10:58:00 得分 0
空格加了也不行的
因为我表中的字段比较多,写一个sql insert的话太长了,所以想分开来写。
还有是不是可以不用params.paramvalues呀,直接在values后写name.text,code.text...等呢?Top
6 楼hzjf(江枫渔火)回复于 2001-05-09 11:00:00 得分 0
oracle?我不熟!
Top
7 楼iseeks(iseeks)回复于 2001-05-09 11:00:00 得分 0
我实际的字段有10多个呢,一起写好长呀,怎么办呀?Top
8 楼neimengguwyh(龙舌兰)回复于 2001-05-09 11:26:00 得分 2
query的SQL中只能加入一条SQL语言,你可以合成一条语言或用EXECUTE语言Top
9 楼iseeks(iseeks)回复于 2001-05-09 11:56:00 得分 0
我改成如下程序,报错“无效的用户.表.列,表.列焕感说明”
with datamodule1.e_basicquery do
begin
mysql:='insert into e_basic (ename,ecode,sex,birthday,edulevel,specialty,'+
'nationality,homeplace,folk,clan,wedlock,address,zipcode,phone,'+
'edcard,archivesid,relation) '+
'values (ename.text,ecode.text,sexfield,'+
'formatdatetime(''yyyy-mm-dd'',birthday.Date),'+
'edulevel.text,specialty.text,nationality.text,homeplace.text,'+
'folk.text,clan.text,wedlock.text,address.Text,zipcode.text,'+
'phone.text,idcard.text,archivesid.text,relation.text)';
sql.clear;
sql.add(mysql);
execsql;
applyupdates;
commitupdates;
end;Top
10 楼linkie(linkie)回复于 2001-05-09 12:08:00 得分 7
为何不这样写呢?
var SqlStr: widestring;
SqlStr:= '';
with datamodule1.query1 do
begin
close;
sql.clear;
SqlStr:= 'insert into e_basic (name,code,folk,clan) '
SqlStr:= SqlStr+'values('+Name.Text+','+Code.Text+','+folk.Text+','+Clan.Text+')';
Sql.Add(SqlStr);
ExceSql();
end;
Good job.
Top
11 楼iseeks(iseeks)回复于 2001-05-09 12:12:00 得分 0
to linkie:
那我后来改的程序(在你回复的上面)错在哪里呀,是不是一定要写成('+Name.Text+','+Code.Text+','+folk.Text+','+Clan.Text+')'格式呀?
Top
12 楼kingsong(牛大锅)回复于 2001-05-09 12:43:00 得分 5
当然,否则'name.txt'就是一个字符串了。
若你用个string 变量,注意要加空格,例如
str:='insert into table1 (name)';
str:=str+' values(.....)';
^^
直接用sql.add,可以不加空格
sql.add('insert into table1 (name);
sql.add('value(...)';Top
13 楼copy_paste(木石三)回复于 2001-05-09 12:52:00 得分 3
用Format,不要用什么Params
const
SQLString='insert into myTable(Field1,Field2...) Values(''%s'',%s,%d,%f)';
with Query1 do
begin
SQL.Text := Format(SQLString, [edit1.text,edit2.text,35,235.00103]);
ExecSQL;
end;
多方便。呵呵Top
14 楼iseeks(iseeks)回复于 2001-05-09 13:14:00 得分 0
那我的字段多,如何换行又成问题了,我启用了query1的cachedupdate属性,而且想用事务提交所作修改,能不能帮我解决换行问题呢,就在我后来的程序上改,好吗?要是可以运行了,我一定另加20-30分Top
15 楼iseeks(iseeks)回复于 2001-05-09 13:26:00 得分 0
我就是搞不懂怎么换行才不出错。Top
16 楼copy_paste(木石三)回复于 2001-05-09 13:29:00 得分 5
定义常量的时候进行行的换行嘛。
const
SQLString= 'insert into myTable(FieldName1,FieldName2.....)' + #13 +
'Value(%s,''%s'',%d, %f' + #13 +
'%s,%s)' + #13 +
'where ...';
加个#13就可以了。
SQL管它换不换行了语法对了就行了。
注意的地方是:%s和''%s'',你在执行的时候,用S:=SQL.Text;Inputquery('','',S);然后copy出来调试一下。Top
17 楼iseeks(iseeks)回复于 2001-05-09 13:38:00 得分 0
系统提示我“只能最多给37分”,是怎么回事呀,我有300多分呢,是不是级别低,就不能一次给很多分啊?Top
18 楼iseeks(iseeks)回复于 2001-05-09 14:00:00 得分 0
我用了format,可是提示“缺少values关键字”
const
SQLString= 'insert into test(edulevel,nationality,' + #13 +
'folk,clan)'+ #13 +
'Value(%s,%s,%s,%s)';
begin
with Query1 do
begin
SQL.Text := Format(SQLString, [edit1.text,edit2.text,edit3.text,edit4.text]);
ExecSQL;
end;Top
19 楼iseeks(iseeks)回复于 2001-05-09 14:01:00 得分 0
还有%s和''%s''有什么区别呀,我是新手,我真的看不出,不都是用edit.text来替换嘛Top
20 楼iseeks(iseeks)回复于 2001-05-09 14:21:00 得分 0
简单一点吧,谁能把下面的程序改对?原来有”列在此处不允许“
procedure TForm1.Button1Click(Sender: TObject);
var mysql:string;
begin
mysql:='';
mysql:=mysql+'insert into test (edulevel,nationality,';
mysql:=mysql+'folk,clan) values (edit1.text,';
mysql:=mysql+'edit2.text,edit3.text,edit4.test)';
query1.sql.clear;
query1.sql.add(mysql);
query1.ExecSQL;
end;
end.Top
21 楼kingsong(牛大锅)回复于 2001-05-09 14:30:00 得分 10
procedure TForm1.Button1Click(Sender: TObject);
var mysql:string;
begin
mysql:='insert into test (edulevel,nationality,';
mysql:=mysql+'folk,clan) values ('''+edit1.text;
mysql:=mysql+''','''+edit2.text+''','''+edit3.text+''','''+edit4.test+''')';
query1.sql.clear;
query1.sql.add(mysql);
query1.ExecSQL;
end;
end. Top
22 楼Apollo47(阿波罗)回复于 2001-05-09 14:32:00 得分 5
With Query1.Sql do
begin
Add('insert into test(字段1,字段2,...........) Values('); // 注意空格;
Add(Format('%s,%s,%s,%s',[Edit1.text,Edit2.text,Edit3.text,Edit4.text]);
Add(')');
end;
Query1.ExecSql;Top
23 楼kingsong(牛大锅)回复于 2001-05-09 14:34:00 得分 0
或:
procedure TForm1.Button1Click(Sender: TObject);
var mysql:string;
begin
with query1 do
begin
sql.clear;
sql.add('insert into test (edulevel,nationality,');
sql.add('folk,clan) values (:p1,:p2,:p3,:p4)');
parambyname('p1').asstring:=edit1.text;
parambyname('p2').asstring:=edit2.text;
parambyname('p3').asstring:=edit3.text;
parambyname('p4').asstring:=edit4.text;
ExecSQL;
end;
end; Top
24 楼iseeks(iseeks)回复于 2001-05-09 14:47:00 得分 0
哦,嘻嘻,总算对了,我给大家加分哦Top
25 楼linkie(linkie)回复于 2001-05-10 10:54:00 得分 0
我要提醒你的是,对于字符串型的字段,在生成Sql语句时,可能要对该字段值进行单引号(“'”)的预处理,也就是将该值中任何一个单引号都替换成“''”,即换成两个单引号,如果
你根据我的方式生成Sql语句的话。Top
26 楼JasonCat(void*)回复于 2001-05-10 16:27:00 得分 0
如 果 你 的 字 符 串 是 单 引 号 括 起 来
字 段 值 前 后 加 双 引 号
或 反 之Top
27 楼efoxxx(思想偏左)回复于 2001-05-10 16:52:00 得分 0
空格掉了,并且俩句insert要分开:
sql.add('insert into e_basic (name,code)');
sql.add(' values(:ename,:ecode) ');
execsql;
sql.add('insert into e_basic (folk,clan)');
sql.add(' values(:nationality,:homeplace)');
execsql;Top
28 楼fireworld(火世界)回复于 2001-05-10 21:47:00 得分 0
呵呵。。我最喜欢玩这个花样了。"''"+"''"+'asdfas'+asdfasd+"fasdfa"+'"'
呵呵。。。Top




