dm.spSend.ProcedureName:='dt_SendParent;1';
    dm.spSend.Parameters.Refresh;
    dm.spSend.Parameters.ParamByName('@ParentId').value:= 0;
    dm.spSend.parameters.ParamByName('@ModuleId').value:= Id;
    dm.spSend.parameters.ParamByName('@tag').value:=CategoryListTag[i];
    dm.spSend.parameters.ParambyName('@CapName').value:= CategoryList[i];
    dm.spSend.parameters.parambyName('@MenuName').value:= CategoryList[i];
    dm.spSend.Prepared:= true;
    dm.spSend.ExecProc;
    sParentId:= dm.spSend.Parameters.ParamByName('@ParentId').value;
其中@parentid在存储过程里定义成output类型的

解决方案 »

  1.   

    参数的值都是delphi定义的变量,可正确取出.
    每次执次到dm.spsend.execproc这句时就出错
      

  2.   

    出错信息:project project1.exe raised exception class EAccessViolation with message
    'Access violation at address 753c9e12 in module'sqloledb.dll'.read of address
    00000018'.process stopped.use step or run to continue
      

  3.   

    var
      MyStoredproc:TStoredproc;
      i:integer;
      p1,p2:Tparam;
    begin
      MyStoredproc := TStoredproc.Create(self);
      MyStoredproc.Name := 'Storedproc1';
      MyStoredproc.SessionName := 'Default';
      MyStoredproc.DatabaseName := DatabaseName;
      MyStoredproc.StoredProcName := 'Get_only_user_right';
      MyStoredproc.Params.Clear;
      p1 := TParam.Create(MyStoredproc.Params,ptInput);
      p1 := TParam.Create(MyStoredproc.Params,ptInput);
      p2 := TParam.Create(MyStoredproc.Params,ptOutput);
      MyStoredproc.Params[0].Name := '@UserID';
      MyStoredproc.Params[1].Name := '@RightID';
      MyStoredproc.Params[2].Name := '@retval';
      MyStoredproc.Params[0].AsInteger := UserID;
      MyStoredproc.Params[1].AsInteger := rightId;
      MyStoredproc.Params[2].AsInteger := 0;
      MyStoredproc.ExecProc;
      i := MyStoredproc.Params[2].AsInteger;  
      p1.Free;
      p2.Free;
      MyStoredproc.Free;
    end;
      

  4.   

    dm.spSend.Parameters.ParamByName('@ParentId').value:= 0;
    这句也没必要啊
      

  5.   

    我用我的存储过程 在SQL查询分析器里写是完全成功的