CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  数据库相关

请问我这样对吗?

楼主blitre(瘦死的老鼠比象大)2005-05-18 12:46:23 在 Delphi / 数据库相关 提问

我现在想动态创建一个存储过程,然后调用它,请问这样对吗?不对应该如何改呢?  
   
   
  //想数据表StudentInfo中插入记录  
  procedure   Button1Click(Sender:   TObject);  
  var  
      strSQL   :   string;  
      str1,str2   :string;  
  begin      
      str1             :=   Edit1.text;  
      str2   :=   Edit2.text;  
      strSQL   :=   'CREATE   PROCEDURE   ProcTest'  
            +   '   @str_name   char(50),@str_profession   char(50)'            
            +   '   AS'  
            +   '   INSERT   INTO   StudentInfo([Name],[profession])'  
            +   '   VALUES(@str_name,@str_profession)  
            +   '   exec   ProcTest   str1,str2';  
   
      ADOQuery.Close;  
      ADOQuery.SQL.Clear   ;  
      ADOQuery.ParamCheck   :=   False;  
      ADOQuery.SQL.Add(strSQL);  
      ADOQuery.ExecSQL;  
   
  end;  
  问题点数:20、回复次数:19Top

1 楼DebugXP(NULL)回复于 2005-05-18 13:00:24 得分 3

多用户同时使用时,要先判断数据库中存储过程是否存在,不存在时才创建。  
   
  为什么要动态创建存储过程?这样还不如在程序中直接ExecSQL。Top

2 楼hellolongbin(一个人(自从扩充话题改版,再也不去灌水乐园了))回复于 2005-05-18 13:01:47 得分 3

调存储过程不要用adoquery,有专门的ADOStoredProcTop

3 楼blitre(瘦死的老鼠比象大)回复于 2005-05-18 13:27:39 得分 0

我现在这段代码就是在程序里执行啊,但老是说我SQL语句有错。到底怎么回事?Top

4 楼DebugXP(NULL)回复于 2005-05-18 13:39:45 得分 4

strSQL   :=   'CREATE   PROCEDURE   ProcTest'  
            +   '   @str_name   char(50),@str_profession   char(50)'            
            +   '   AS'  
            +   '   INSERT   INTO   StudentInfo([Name],[profession])'  
            +   '   VALUES(@str_name,@str_profession)  
            +   '   exec   ProcTest   '''   +   str1   +   ''','''   +   str2   +   ''';Top

5 楼duanhai(段海)回复于 2005-05-18 14:00:28 得分 0

to   DebugXP(NULL)    
   
  strSQL   :=   'CREATE   PROCEDURE   ProcTest'  
            +   '   @str_name   char(50),@str_profession   char(50)'            
            +   '   AS'  
            +   '   INSERT   INTO   StudentInfo([Name],[profession])'  
            +   '   VALUES(@str_name,@str_profession)   '//此處少一個單引號  
            +   '   exec   ProcTest   '''   +   str1   +   ''','''   +   str2   +   ''';  
  Top

6 楼duanhai(段海)回复于 2005-05-18 14:08:02 得分 0

檢查存儲過程是否存在,可以用  
  if   not   Exists(select   *   from   sysobjects   where   xtype='P'   and   name='YourProductName')  
  //然後做你的事Top

7 楼blitre(瘦死的老鼠比象大)回复于 2005-05-18 14:24:26 得分 0

错误如下:  
   
  Project   RemoteII.exe   raised   exception   class   EOleException   with   message   '无效的   SQL   句法:需要的符号:AS。'.   Process   stopped.   Use   Step   or   Run   to   continue.  
  Top

8 楼blitre(瘦死的老鼠比象大)回复于 2005-05-18 14:33:42 得分 0

还有个问题忘了告诉大家了,我是用的ACCESS数据库。我用ADOQuery动态创建了这个存储过程来完成几千条记录的插入。就出现这个错误。Top

9 楼freewind88(风林火山)回复于 2005-05-18 17:20:52 得分 0

ACCESS不是真正意义上的存储过程Top

10 楼blitre(瘦死的老鼠比象大)回复于 2005-05-18 17:37:29 得分 0

怎么就是没人详细解答呢?我按各位的改了代码,但还是出现上面的错误啊。到底怎么回事?  
   
   
  还是这个错误  
  Project   RemoteII.exe   raised   exception   class   EOleException   with   message   '无效的   SQL   句法:需要的符号:AS。'.   Process   stopped.   Use   Step   or   Run   to   continue.  
  Top

11 楼DebugXP(NULL)回复于 2005-05-18 22:45:56 得分 0

你想用T-SQL在Access创建存储过程?  
   
  。。。。。Top

12 楼magicfire(岩岩)回复于 2005-05-18 23:16:52 得分 0

檢查存儲過程是否存在,可以用  
  if   not   Exists(select   *   from   sysobjects   where   xtype='P'   and   name='YourProductName')  
                                                                                            |  
                                                                                            |  
                                                                                            type就行吧。。。为什么要用xtype?Top

13 楼blitre(瘦死的老鼠比象大)回复于 2005-05-19 08:38:26 得分 0

还是没找到想要的正确答案,诶,失望啊。Top

14 楼blitre(瘦死的老鼠比象大)回复于 2005-05-19 08:43:00 得分 0

TO   DebugXP(NULL)   (   )   :  
   
   
  我用的是ACCESS数据库啊,现在我要一次向表中添加几千条数据,我应该如何做速度才快一点?我现在一条一条的添加,速度很慢,而且CPU资源耗用也很大,有时到100%   ,不能用存储过程吗?那又有什么办法呢?Top

15 楼DebugXP(NULL)回复于 2005-05-19 11:14:51 得分 3

动态组合下面的sql  
  insert   into   StudentInfo([Name],[profession])  
  select   'A1'   as   [t1],'A2'   as   [t2]   from   StudentInfo  
  union   all   select   'A3'   as   [t1],'A4'   as   [t2]   from   StudentInfo  
  union   all   select   'A5'   as   [t1],'A6'   as   [t2]   from   StudentInfo  
  ...  
  union   all   select   'A1000'   as   [t1],'A1001'   as   [t2]   from   StudentInfo'  
  然后  
  adoQuery.execSql  
   
  用这种方法添加。看看速度是否提升。Top

16 楼blitre(瘦死的老鼠比象大)回复于 2005-05-19 12:35:25 得分 0

动态组合下面的sql  
  insert   into   StudentInfo([Name],[profession])  
  select   'A1'   as   [t1],'A2'   as   [t2]   from   StudentInfo  
  union   all   select   'A3'   as   [t1],'A4'   as   [t2]   from   StudentInfo  
  union   all   select   'A5'   as   [t1],'A6'   as   [t2]   from   StudentInfo  
  ...  
  union   all   select   'A1000'   as   [t1],'A1001'   as   [t2]   from   StudentInfo'  
  然后  
  adoQuery.execSql  
   
   
  这个是什么意思啊?我的数据是存在一个变量中,所以要用循环才能取到每个数。  
  也就是插入的数都是存在变量中,  
  Top

17 楼blitre(瘦死的老鼠比象大)回复于 2005-05-22 08:18:44 得分 0

没人理会了。完了,解决不了了。Top

18 楼duanhai(段海)回复于 2005-05-23 10:39:37 得分 0

to   blitre(瘦死的老鼠比象大)    
  是不是你給我留了言?我求求你下次給我留言的時候,  
  注明是哪個一個帖子好不好?我可是找了N久才找到這裡的呀  
   
      insert   into   StudentInfo([Name],[profession])  
          select   'A3','A4'   union  
          select   'A5','A6'  
  這個SQL語句的意思是向StudentInfo表中插入  
  下面兩條記錄  
   
  'A3','A4'  
  'A5','A6'  
   
  你可以加入很多筆,記得每個Select用union連接Top

19 楼duanhai(段海)回复于 2005-05-23 12:29:18 得分 7

我試過,在Access中好象不支持  
  Insert   into   tablename(field1,field2)  
      select   '1','1'   union  
      select   '2','2'  
   
  所以用到AdoQuery的緩存更新  
  //下面是緩存更新的例子  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      I   :   Integer;  
      dtStart,   dtEnd:   TDateTime;  
  begin  
      dtStart   :=   Now;  
      AdoQuery1.LockType   :=   ltBatchOptimistic;  
      AdoQuery1.DisableControls;  
      //記錄數:10000  
      for   I   :=   0   to   StrToIntDef(Edit1.text,   -1)   do  
      begin  
          AdoQuery1.Append;  
          AdoQuery1.FieldByName('name').AsString   :=   Edit1.Text   +   '_'   +   IntToStr(i);  
          AdoQuery1.FieldByName('datebegin').AsDateTime   :=   Now;  
          AdoQuery1.FieldByName('dateend').AsDateTime   :=   Now;  
          AdoQuery1.Post;  
      end;  
      AdoQuery1.EnableControls;  
      dtEnd   :=   Now;  
      Memo1.Lines.Add(FloatToStr((dtEnd   -   dtStart)   /   (   1   /   24   /   3600)));  
      //Result   =   0.985000189393759  
   
  end;  
   
  procedure   TForm1.Button2Click(Sender:   TObject);  
  var  
      dtStart,   dtEnd:   TDateTime;  
  begin  
      dtStart   :=   Now;  
      AdoQuery1.UpdateBatch();  
      dtEnd   :=   Now;  
      Memo1.Lines.Add(FloatToStr((dtEnd   -   dtStart)   /   (   1   /   24   /   3600)));  
      //Result   =       9.13099993485957  
  end;  
  Top

相关问题

  • 我这样写对吗?
  • 为什么这样对我!!!
  • 我这样为何不对??
  • 老板这样对我说...
  • 老板这样对我,我该怎么?
  • 我这样理解三层对不对??
  • 一个女孩曾这样对我说.....
  • 我这样得理解对吗?
  • 我这样传递结果不对吗?
  • 一个女孩这样对我说。

关键词

  • 存储过程
  • 数据库
  • adoquery
  • profession
  • studentinfo
  • proctest
  • studentinfounion
  • execsql
  • 插入
  • strsql

得分解答快速导航

  • 帖主:blitre
  • DebugXP
  • hellolongbin
  • DebugXP
  • DebugXP
  • duanhai

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo