我是想当删除表a中记录的时候,同时把表b,c中的相关记录删除,由于表比较多,想一次更新。如:
query1.sql.add('insert into table1 (a,b) values(0,0)');
query1.sql.add('insert into table2 (a,b) values(0,0)');
query1.sql.add('insert into table3 (a,b) values(0,0)');
query1.execsql;类似这样,请相信我语法绝对没有写错的地方,我也尝试过每个语句之间加;(分号)处理,query1.sql.add('insert into table1 (a,b) values(0,0);');也是不行。
请高手指教,俺不想做成
query1.sql.text:='insert into table1 (a,b) values(0,0)';
query1.execsql;
query1.close;
queryery1.sql.text:='insert into table2 (a,b) values(0,0)';
.
.
.
.
这样。也不能用循环。

解决方案 »

  1.   

    不是吧,3个语句同时添加到SQL属性,那里面的SQL字符串不是把3条语句串起来了啊
    你用存储过程吧,把要处理的语句写在存储过程里面,然后调用一下吧,要用到什么参数就用存储过程参数传进去好了
      

  2.   

    我个觉得你这样的做法不是很好.你可以这样.
    首先把这些 insert 语句一句一句存到一个TStringList中.
    然后对这个stringLis做循环处理,每循环一次就把它的不同行加奔到query中执一遍,不就可以了.  当然. 加上事务处理比较稳妥.
      

  3.   

    你可以一条一条的执行:
    query1.sql.text:='insert into table1 (a,b) values(0,0)';
    query1.execsql;
    query1.sql.clear;
    queryery1.sql.text:='insert into table2 (a,b) values(0,0)';
    query1.execsql;
      

  4.   

    谢谢各位,俺也很想用存储过程,可惜数据库是access.如果用循环,跟我上面说的不就一样了吗, lynew(死循环-开始)老兄说的我上面也已经提过了。
      

  5.   

    query1.sq.clear;
    query1.sql.add('insert into table1 (a,b) values(0,0)');
    query1.sql.add('insert into table2 (a,b) values(0,0)');
    query1.sql.add('insert into table3 (a,b) values(0,0)');
    query1.execsql;应该可以啊。
    除非table1,table2,table3表中还有一些不允许为空的字段你没有指定值。
      

  6.   

    query1.Close;
         query1.SQL.Clear;
         sqlstr:='select count(*) from dbo.statistic_type ';
         query1.SQL.Add(sqlstr) ;
         query1.Open;
         a:=query1.Fields[0].Value;
         edit3.Text:=inttostr(a);
         query1.SQL.Clear;
         sqlstr:='select count(*) from dbo.statistic_type where trantype=1';
         query1.SQL.Add(sqlstr) ;
         query1.Open;
         edit1.Text:=query1.Fields[0].AsString;
         query1.SQL.Clear;
         sqlstr:='select count(*) from dbo.statistic_type where trantype=0';
         query1.SQL.Add(sqlstr) ;
         query1.Open;
         edit4.Text:=query1.Fields[0].AsString;
         query1.SQL.Clear;
         sqlstr:='select TranName, TranCode, DellCode from dbo.statistic_type where trantype=0'; 
         query1.SQL.Add(sqlstr) ;
         query1.Open;
    刚写的一段代码!想法应该同你一样,试国可行!
      

  7.   

    注意你的每条SQL语句的前后和加一个空格,试试看
      

  8.   

    那样写肯定不行,建议用sqlserver的存贮过程
      

  9.   

    如果是SQL SERVER,这样写是行的
    query1.sql.Clear;////////////////////
    query1.sql.add('insert into table1 (a,b) values(0,0)');
    query1.sql.add('insert into table2 (a,b) values(0,0)');
    query1.sql.add('insert into table3 (a,b) values(0,0)');
    query1.execsql;
    如是Oracle,要这样才写
    query1.sql.Clear;////////////////////
    query1.sql.add('begin');////
    query1.sql.add('insert into table1 (a,b) values(0,0);');/////
    query1.sql.add('insert into table2 (a,b) values(0,0);');/////
    query1.sql.add('insert into table3 (a,b) values(0,0);');/////
    query1.sql.add('end;)////////
    query1.execsql;
      

  10.   

    query1.sql.add('insert into table1 (a,b) values(0,0)');
    query1.sql.add('insert into table2 (a,b) values(0,0)');
    query1.sql.add('insert into table3 (a,b) values(0,0)');
    query1.execsql;应该可以的,要不后面加上go好了
    query1.sql.add('insert into table1 (a,b) values(0,0) go');
      

  11.   

    楼上的好像都不是正解^_^关键在于:你要理解,你在“查询分析器”中写三行(注意是三行,即应该有分行符)这样的语句肯定是可行的,但你
    query1.sql.add('insert into table1 (a,b) values(0,0)');
    query1.sql.add('insert into table2 (a,b) values(0,0)');
    query1.sql.add('insert into table3 (a,b) values(0,0)');
    这样,想想是什么样了,结果是成了一行SQL语句。所以,,,,你应该这样:
    query1.sql.add('insert into table1 (a,b) values(0,0)');
    query1.sql.add(#13);
    query1.sql.add('insert into table2 (a,b) values(0,0)');
    query1.sql.add(#13);
    query1.sql.add('insert into table3 (a,b) values(0,0)');-----------------
    加上“GO”也是可行的,这样的结果是分成了三次执行,影响了效率。
    但是,请注意!如果是DML语句是应该加“GO”的。
      

  12.   

    insert 前面空格呀,为什么不用触发器?
    你可以把SQL语句打印出来看看!就知道是什么地方出错了!
      

  13.   

    gmc007(江西的佬表) 的说法有错误TStrings对象的Add方法这样使用之后,它的Text属性会在每条语句之间添加回车换行符$13$10的。
      

  14.   

    在SQl server 2000是绝对可以的,我用过多次了
      

  15.   

    在sql server 2000中是绝对可以的,因为sql server 2000支持多条sql语句写在同一行,而用分号分隔。但关键是:ACCESS却不支持此种写法呀呵呵楼主是用ACCESS数据库,肯定不行了。
      

  16.   

    试试这样如何:
    query1.sql.add('insert into table1 (a,b) values(0,0)');
    query1.sql.add('insert into table2 (a,b) values(0,0)');
    query1.sql.add('insert into table3 (a,b) values(0,0)');
    query1.execsql;
      

  17.   

    access一次只能执行一条语句,别妄想了
    而且不支持事务
      

  18.   

    谢谢大家了,俺最终还是一条一条执行的,效率低了点,俺就在想,如果俺有n多张表需要联动,代码岂不是要写很长,要不断的重复。。重复。。再重复的sql.text:='';open;难道真的没有很好的办法吗,是否用access就要有这个限制?
    郁闷啊!
    我在做很多单机版程序的时候,数据库都是用的access,不知大家有没有更好的推荐.
      

  19.   

    To:chenquan(嘉威王子) 
    其实俺上面还写的简单了,我的实际应用更加复杂,加入每张表的字段和数据都是不同的。使用函数也不过是把所有语句转换成字符串数组,循环执行,效率上没有提高。
      

  20.   

    你接触过PL/SQL吗?用它可以编写过程性的程序!可以很方便的结决类似的问题,SQL的弊端就是每次只能返回一条查询结果,用PL/SQL可以克服这个弊端。如果你感兴趣的话,我可以发信给你