我现在用delphi写了一个dll,不传递参数都正常,现在在调试带参数的dll时遇到了问题。
谁帮忙解答一下
var
  ls_ret,ls1,ls2,ls3:string;
  bType: Byte;
  fNull: Bool;
  cbMaxLen, cbActualLen: ULONG;
.....
  if srv_rpcparams(pSrvProc) = 3 then
    begin
      srv_paraminfo(pSrvProc, 1, @bType,@cbMaxLen, @cbActualLen,@ls1, @fNull);
      srv_paraminfo(pSrvProc, 2, @bType,@cbMaxLen, @cbActualLen,@ls2, @fNull);
      srv_paraminfo(pSrvProc, 3, @bType,@cbMaxLen, @cbActualLen,@ls3, @fNull);
    end;
  srv_describe(pSrvProc, 1, '参数', SRV_NULLTERM,
               SRVCHAR, 255,
               SRVCHAR, 0, nil);
  srv_setcoldata(pSrvProc, 1, @ls1);
  srv_sendrow(pSrvProc);
  srv_setcoldata(pSrvProc, 1, @ls2);
  srv_sendrow(pSrvProc);
  srv_setcoldata(pSrvProc, 1, @ls3);
  srv_sendrow(pSrvProc);
...
  srv_senddone(pSrvProc,(SRV_DONE_COUNT or SRV_DONE_MORE), 0, 3);执行后报如下错
[Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionCheckForData (CheckforData()).
Server: Msg 11, Level 16, State 1, Line 0
General network error. Check your network documentation.Connection Broken
我的目的是想看到3个参数值,以下是调用过程
declare @1 varchar(100),
        @2 varchar(100),
        @3 varchar(100),
        @4 varchar(100)
set @1='B'
set @2='C'
set @3='D'
exec @4=xp_EpPackFile @1,@2,@3

解决方案 »

  1.   

    看你的错误提示是网络错误呀,你可以根据提示错误级别在SQL的联机帮助中查找一个错误说明。
      

  2.   

    你的ADOConnection 连接参数是指定好的?还是自动获取连接参数?
    如果是自动获取参数的?看看ADOConnection控件ConnectionString的参数是否为空?
    不为空,那就清空ConnectionString的参数(有时ADOConnection控件无意中会指定好连接参数了).
    也要注意一下变量的参数类型匹配?
      

  3.   

    library project1;uses
      Windows,
      SysUtils,
      MSODSApi;{$R *.res}
    Function GetParamStr(pSrvProc: SRV_PROC; Index : integer; Var Param : String ) : integer;
    var
      PType : Byte;
      cbMaxLen , ParaLen : DWORD;
      IsNULL : BOOL;
    begin
      Result := NO_ERROR;
      srv_paraminfo(pSrvProc, index, @PType, @cbMaxLen, @ParaLen, NIL, @IsNULL);  if PType in [SRVTEXT,SRVVARCHAR,SRVCHAR,SRVNTEXT,
                   SRVBIGVARCHAR,SRVBIGCHAR,SRVNVARCHAR,SRVNCHAR] then
        begin
          Param := '';
          if ParaLen>0 then begin
            SetLength(Param , ParaLen);
            srv_paraminfo(pSrvProc, index, @PType, @cbMaxLen, @ParaLen, @Param[1], @IsNULL);
          end;
        end
      else begin
        Result := -1;
      end;
    end;
    Function EpPackFile(pSrvProc: SRV_PROC) : integer;cdecl;
    var
      ls1,ls2,ls3 : String;
      n      : integer;
    begin  Result := 1;
      n := srv_rpcparams(pSrvProc);
      if n <> 3 then begin
        //     不是3个参数
      end;
      if   (GetParamStr(pSrvProc,1,ls1)<>NO_ERROR) then begin
        //    不是字符串
      end;
      if    (GetParamStr(pSrvProc,2,ls2)<>NO_ERROR) then begin
        //    不是字符串
      end;
      if    (GetParamStr(pSrvProc,3,ls3)<>NO_ERROR) then begin
        //    不是字符串
      end;
      n := Length(ls1);
      srv_describe(pSrvProc, 1 ,  '参数', SRV_NULLTERM,  SRVBIGVARCHAR,
                    n, SRVBIGVARCHAR, n,  NIL);
        srv_setcoldata(pSrvProc, 1 , @ls1[1]);
        srv_sendrow(pSrvProc);
        srv_setcoldata(pSrvProc, 1 , @ls2[1]);
        srv_sendrow(pSrvProc);
        srv_setcoldata(pSrvProc, 1 , @ls3[1]);
        srv_sendrow(pSrvProc);
      srv_senddone(pSrvProc, (SRV_DONE_COUNT or SRV_DONE_MORE), 0, 1);
    end;
    exports
      EpPackFile Name 'xp_EpPackFile';
    begin
    end.
      

  4.   

    Use Master;
    IF object_id('xp_EpPackFile') IS NOT NULL EXEC sp_dropextendedproc 'xp_EpPackFile';
    EXEC sp_addextendedproc 'xp_EpPackFile', 'project1.dll';
    EXEC master..xp_EpPackFile 'aa','bb','cc';
    EXEC sp_dropextendedproc 'xp_EpPackFile';
    DBCC SPEncrypt(FREE);
      

  5.   

    MARK。。
    请大家关注一下:http://topic.csdn.net/u/20071203/11/9b544dc9-efeb-4df6-b728-b1e775cb72b7.html
    我用fastReport控件封装成DLL做为web调用的打印公共接口,但在WEB调用时偶尔会出现存储空间不足,程序跟踪又捕捉不到,不知道大家有类似的问题吗,请提供些思路。