开发工具是:delphi2007,数据库是:sql2005
我添加了一个adoquery1,代码如下:
   sDataName:='cy302';
   sServer1:='192.168.18.143';
      with adoquery1 do
       begin
        CommandTimeout:=3000;
        CacheSize:=1000;
        ConnectionString := 'Provider=SQLOLEDB.1;Password='+'system'+';Persist Security Info=False;User ID='+'system'+';Initial Catalog='+sDataName+';Data Source='+sServer1;
        SQL.Text :='exec p_sy_data_upload ';
        ExecSQL;
       end;每一次执行这个代码时,老是说“连接失败”。但是我把'exec p_sy_data_upload '拿到sql2005 management studio,执行没有任何错误。说明执行存储过程是没有问题的。后来我想是不是adoquery1.ConnectionString 是不是写错了,我就不变的情况下,我试一下打开表:
   sDataName:='cy302';
   sServer1:='192.168.18.143';
      with adoquery1 do
       begin
        CommandTimeout:=3000;
        CacheSize:=1000;
        ConnectionString := 'Provider=SQLOLEDB.1;Password='+'system'+';Persist Security Info=False;User ID='+'system'+';Initial Catalog='+sDataName+';Data Source='+sServer1;
        SQL.Text :='select * from table1';
        open;
       end;这样运行没有出现错误,可以打开表table1,我不知道这样写的代码为什么老是说连接失败的:
   sDataName:='cy302';
   sServer1:='192.168.18.143';
      with adoquery1 do
       begin
        CommandTimeout:=3000;
        CacheSize:=1000;
        ConnectionString := 'Provider=SQLOLEDB.1;Password='+'system'+';Persist Security Info=False;User ID='+'system'+';Initial Catalog='+sDataName+';Data Source='+sServer1;
        SQL.Text :='exec p_sy_data_upload ';
        ExecSQL;
       end;
请指教

解决方案 »

  1.   

    p_sy_data_upload 这个会不会产生数据集返回? 如果会,试用OPEN看看.
      

  2.   

    既然设置了ConnectionString ,但是你的adoquery并没有open啊,那样不就是关闭状态吗,你得先连接上呀另外建议你用adoconnection连接数据集,不要用adoquery直接连接
      

  3.   

    我有遇到过这样的莫名其妙的问题,应该还是ConnectionString 的问题,我之前的问题检查出来之后发现:User ID = sa, 在sa 之前多了一个回车符号,但是怎么来的不知道,于是干脆切割了一下这个string。
    你试试这样:
    ConnectionString := 'Provider=SQLOLEDB.1;'+
                        'Password='+'system'+';'+
                        'Persist Security Info=False;'+
                        'User ID='+'system'+';'+
                        'Initial Catalog='+sDataName+';'+
                        'Data Source='+sServer1;
      

  4.   

    先用adoconnection连接数据库,adoquery连接adoconnection,数据集要open
      

  5.   

    我在说一次,我的dephi2007语句是这样的:
      sDataName:='cy302';
      sServer1:='192.168.18.143';
      with adoquery1 do
      begin
      CommandTimeout:=3000;
      CacheSize:=1000;
      ConnectionString := 'Provider=SQLOLEDB.1;Password='+'system'+';Persist Security Info=False;User ID='+'system'+';Initial Catalog='+sDataName+';Data Source='+sServer1;
      SQL.Text :='exec p_sy_data_upload ';
      ExecSQL;
      end;这样写语句是没有什么问题的,我已经验证过了,是在执行
     SQL.Text :='exec p_sy_data_upload ';
      ExecSQL;出现了连接失败。我就把我的存储过程,贴出来:
    alter procedure [dbo].[p_sy_data_upload]as begin
       
    declare @linkip varchar(800),@dbcode int,@dbcodeStr varchar(100)
    declare @sqltext varchar(8000),@locldb varchar(8000)
    declare @ErrorMessage varchar(8000),@ErrorSeverity int, @ErrorState int,@ErrorNumber int,@OperType int 
    --读取前端编号
    select @dbcode = dbcode from t_bs_DatabaseID_C  if @dbcode<10 
    set @dbcodeStr='0'+cast(@dbcode as varchar(1))
    else
    set @dbcodeStr=cast(@dbcode as varchar(2))
      select * from t_bs_DatabaseID_C
    ---取当前的数据库名称
    select @locldb=CorpCode from t_sy_parameter
    ----连接远端数据库
    select @linkip=cent_server from t_sy_parameterif exists(select * from master.dbo.sysservers where srvname='linkremote' )
       begin     Exec sp_droplinkedsrvlogin linkremote,Null
         Exec sp_dropserver linkremote
           EXEC  sp_addlinkedserver
                 @server='linkremote',--被访问的服务器别名
                 @srvproduct='',
                 @provider='SQLOLEDB',
                 @datasrc=@linkip   --要访问的服务器       alter service master key force regenerate  --更改 SQL Server 实例的服务主密钥       EXEC sp_addlinkedsrvlogin 
                'linkremote', --被访问的服务器别名
                'false', 
                 NULL, 
                'system', --帐号
                'system' --密码
       end
    else 
       begin
           EXEC  sp_addlinkedserver
                 @server='linkremote',--被访问的服务器别名
                 @srvproduct='',
                 @provider='SQLOLEDB',
                 @datasrc=@linkip   --要访问的服务器       alter service master key force regenerate  --更改 SQL Server 实例的服务主密钥       EXEC sp_addlinkedsrvlogin 
                'linkremote', --被访问的服务器别名
                'false', 
                 NULL, 
                'system', --帐号
                'system' --密码   endEXEC master.dbo.sp_serveroption @server=N'linkremote', @optname=N'rpc', @optvalue=N'true'
    EXEC master.dbo.sp_serveroption @server=N'linkremote', @optname=N'rpc out', @optvalue=N'true'-----创建单据主表
        set @sqltext=
          ' declare @ErrorMessage varchar(8000),@ErrorSeverity int, @ErrorState int,@ErrorNumber int,@OperType int 
            BEGIN TRANSACTION database_upload 
               begin try 
            IF EXISTS(SELECT * FROM '+@locldb+'.dbo.sysobjects WHERE name=''t_wh_billofdocument_bk_'+@dbcodeStr+''' and xtype=''U'') 
            drop table '+@locldb+'.dbo.t_wh_billofdocument_bk_'+@dbcodeStr
         +' create table '+@locldb+'.dbo.t_wh_billofdocument_bk_'+@dbcodeStr+'(
            code varchar(300),billcode varchar(300),billcodeno varchar(300),id int

     
        end try
        begin catch
           SELECT  @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), 
                   @ErrorState = ERROR_STATE(),@ErrorNumber=ERROR_NUMBER()
           if @ErrorSeverity>18 or @ErrorSeverity<0
             set @ErrorSeverity=16
           if @ErrorState>127 or @ErrorState<1
             set @ErrorState=1 
           begin try
             ROLLBACK TRANSACTION database_upload 
           end try
           begin catch
           end catch
           raiserror (@ErrorMessage, @ErrorSeverity,@ErrorState)  
           --return @ErrorNumber
        end catch
        begin try
          COMMIT TRANSACTION database_upload 
        end try
        begin catch
        end catch 
    '--print(@sqltext)
    execute(@sqltext) at linkremoteend我说明一下这个存储过程的是在本地服务上运行的,是在本地上sql2005通过远程连接到远端服务器,并且在远端服务器上创建表。但是我执行上面所写的delphi代码,每一次执行都出现本地连接失败,但是这个存储过程在本地的sql2005上运行:exec p_sy_data_upload,是没有问题,是正常的,可以在远端服务器上看到有生成表的结构。后来,我在这个存储过程中,我注释掉:
    --execute(@sqltext) at linkremote那么运行delphi这段代码时就不会出现本地连接错误了。如果取消掉我刚才注释的代码时,运行delphi这段代码就会出现本地连接的错误,难道在delphi2007不能这样写吗?说明一下,我在management studio执行“exec p_sy_data_upload”是没有任何错误的,当然我是没有注释掉这段代码:“execute(@sqltext) at linkremote”,是可以在本地上运行存储过程在远端上可以创建表,没有出现任何错误。还说明一下,在这个存在过程中在本地sql2005连接远端sql2005的用户system是服务角色是最大,与sa的权限是一样的。
    请教各位了。
      

  6.   

    建议你用adoconnection连接数据集
      

  7.   

    你在sql2005 management studio中执行没问题,那你登录用的用户也是System?
      

  8.   


    是的,是用system登录的,执行"exec p_sy_data_upload"是没有问题的。
      

  9.   


    我用TADOConnection来连接,我这样写:
    sDataName:='cy302';
      sServer1:='192.168.18.143';
    ADOConnection1.ConnectionString:= 'Provider=SQLOLEDB.1;Password='+'cysystem830'+';Persist Security Info=False;User ID='+'system'+';Initial Catalog='+sDataName+';Data Source='+sServer1;  with adoquery1 do
      begin
      CommandTimeout:=3000;
      CacheSize:=1000;
       SQL.Text :='exec p_sy_data_upload ';
      ExecSQL;
      end;我在adoquery1的属性Connection连接ADOConnection1,我运行这个代码时,还是出现连接失败的,不知道ADOConnection1要不要设置什么属性
      

  10.   

    因为我写这个存储过程是执行远端创建表的,我不知道tadoquery在执行这个存储过程时,不能这样执行,是不是要设置什么,才可以这样执行的?