2013-05-29 24 views
1

我有這樣的方法: -麻煩與SQL服務器的輸出參數2008

public List<InterestedParty> GetDealViewData(string username,Guid opportunityId, int fromIndex, int toindex, string IPStatus, Guid? JllBroker, string ipsearch,ref string sortby, ref string direction, out int totalRecords, int offerType) 
{ 
      if (sortby == null) 
       sortby = string.Empty; 

      if (direction == null) 
       direction = string.Empty; 

      InterestedPartyMapper interestedPartyMapper = new InterestedPartyMapper(); 
      InterestedParty dummyIP = new InterestedParty(); 

      SqlParameter outParam = new SqlParameter(); 
      outParam.ParameterName = "@TotalRecords"; 
      outParam.SqlDbType = SqlDbType.Int; 
      outParam.Direction = ParameterDirection.Output; 

      SqlParameter sortParam = new SqlParameter(); 
      sortParam.ParameterName = "@sortby"; 
      sortParam.SqlDbType = SqlDbType.VarChar; 
      sortParam.Size = 500; 
      sortParam.Value = sortby.Trim(); 
      sortParam.Direction = ParameterDirection.InputOutput; 

      SqlParameter dirParam = new SqlParameter(); 
      dirParam.ParameterName = "@direction"; 
      dirParam.SqlDbType = SqlDbType.VarChar; 
      dirParam.Size = 500; 
      dirParam.Value = direction.Trim(); 
      dirParam.Direction = ParameterDirection.InputOutput; 

      IEnumerable<InterestedParty> interestedParties = DatabaseUtility.ExecuteReader<InterestedParty>(DatabaseUtility.DataWarehouseConnectionString, 
          "cp_GetDealViewInterestedParties", 
          CommandType.StoredProcedure, 
          new SqlParameter[] { new SqlParameter("@opportunityid", opportunityId), 
          new SqlParameter("@fromIndex", fromIndex), 
          new SqlParameter("@toindex", toindex), 
          new SqlParameter("@ipstatus", IPStatus), 
          new SqlParameter("@jllbroker", JllBroker), 
          new SqlParameter("@IPNameSearch", ipsearch), 
          new SqlParameter("@domainname", username), 
          sortParam, 
          dirParam, 
          new SqlParameter("@offerType", offerType), 
          outParam}, 
          interestedPartyMapper.Mapper); 
      totalRecords = Convert.ToInt32(outParam.Value); 
      sortby = sortParam.Value.ToString(); 
      direction = dirParam.Value.ToString(); 
      return interestedParties.ToList(); 
} 

存儲過程的參數是這樣的:

ALTER PROCEDURE [dbo].[cp_GetDealViewInterestedParties] 
@opportunityid uniqueidentifier, 
@ipstatus nvarchar(250) = null, 
@jllbroker uniqueidentifier = null, 
@fromindex int = 1, 
@toindex int = 40, 
@IPNameSearch nvarchar(255) = null, 
@offerType int = 0, 
@sortby nvarchar(255) OUTPUT, 
@direction varchar(4) OUTPUT, 
@domainname varchar(255) = null, 
@TotalRecords int OUTPUT 
with recompile 
AS 
BEGIN 
set nocount on 
    DECLARE @defaultSortBy nvarchar(255) = 'ModifiedOn' 
    DECLARE @defaultDirection varchar(4) = 'desc' 
    DECLARE @userPreferenceLookupResults nvarchar(255) 

我收到以下錯誤:

The formal parameter "@sortby" was not declared as an OUTPUT parameter, but the actual parameter passed in requested output.

感謝任何想法和想法

回答

0

在您的代碼中,您將'@sortby'定義爲varchar,而您的存儲過程需要nvarchar類型。改變這個問題是否解決了問題?

 SqlParameter sortParam = new SqlParameter(); 
     sortParam.ParameterName = "@sortby"; 
     sortParam.SqlDbType = SqlDbType.VarChar; //<---- should be nvarchar? 
     sortParam.Size = 500; 
     sortParam.Value = sortby.Trim(); 
     sortParam.Direction = ParameterDirection.InputOutput; 



-- sql def: @sortby nvarchar(255) OUTPUT,