2010-04-13 75 views
0

我正在使用ms sql存儲過程來獲取一組記錄,當我將此存儲過程添加到我的LinqToSql類並使用它時,我的存儲庫顯示它正在返回一個int值,但它顯示它應該返回一組行。我的存儲過程或其他一些事情有一些錯誤?ASP.NET MVC存儲過程

ALTER PROCEDURE [dbo].[GetDocumentsAdvancedSearch] 
    -- Add the parameters for the stored procedure here 
     @SDI CHAR(10) = NULL 
    ,@Client CHAR(4) = NULL 
    ,@AccountNumber VARCHAR(20) = NULL 
    ,@Address VARCHAR(300) = NULL 
    ,@StartDate DATETIME = NULL 
    ,@EndDate DATETIME = NULL 
    ,@Job INT = NULL 
    ,@Invoice INT = NULL 
    ,@Amount MONEY = NULL 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    -- DECLARE 
    DECLARE @Sql  NVARCHAR(4000) 
    DEClARE @ParamList NVARCHAR(4000) 
    DECLARE @AssociaID VARCHAR(6) 
    --DECLARE 
    SET @AssociaID = 000000 
    SELECT @Sql = 'SELECT 
        DISTINCT ISNULL(Documents.DocumentID, NULL) 
        ,Person.Name1 
        ,Person.Name2 
        ,Person.Street1 
        ,Person.Street2 
        ,Person.CityStateZip 
        ,ISNULL(Person.ReferenceID,NULL) 
        ,ISNULL(Person.AccountNumber,NULL) 
        ,ISNULL(Person.HasSetPreferences,0) 
        ,Documents.Job 
        ,Documents.SDI 
        ,Documents.Invoice 
        ,ISNULL(Documents.ShippedDate,NULL) 
        ,ISNULL(Documents.DocumentPages,NULL) 
        ,Documents.DocumentType 
        FROM 
        Person 
        LEFT OUTER JOIN Documents ON Person.PersonID = Documents.PersonID 
        LEFT OUTER JOIN DocumentType ON Documents.DocumentType = DocumentType.DocumentType 
        LEFT OUTER JOIN Addresses ON Person.PersonID = Addresses.PersonID 
        WHERE '     

    IF NOT(@SDI IS NULL) 
    SELECT @Sql = @Sql + ' Documents.SDI IN ('[email protected]+')' 
    IF NOT(@Client IS NULL) 
    SELECT @Sql = @Sql + ' OR (Person.AssociationID = ' + @AssociaID + ' AND Person.Client ='+ @Client+')' 
    IF NOT(@AccountNumber IS NULL) 
    SELECT @Sql = @Sql + ' AND Person.AccountNumber LIKE ' + @AccountNumber 
    IF NOT(@Address IS NULL) 
    SELECT @Sql = @Sql + ' AND Person.Name1 LIKE' + @Address + 'AND Person.Name2 LIKE' + @Address + ' AND Person.Street1 LIKE' + @Address + ' AND Person.Street2 LIKE' + @Address + ' AND Person.CityStateZip LIKE' + @Address 
    IF NOT(@StartDate IS NULL) 
    SELECT @Sql = @Sql + ' AND Documents.ShippedDate >=' [email protected] 
    IF NOT(@EndDate IS NULL) 
    SELECT @Sql = @Sql + ' AND Documents.ShippedDate <=' [email protected] 
    IF NOT(@Job IS NULL) 
    SELECT @Sql = @Sql + ' AND Documents.Job =' [email protected] 
    IF NOT(@Invoice IS NULL) 
    SELECT @Sql = @Sql + ' AND Documents.Invoice =' [email protected] 
    IF NOT(@Amount IS NULL) 
    SELECT @Sql = @Sql + ' AND Documents.Amount =' [email protected] 
    -- Insert statements for procedure here 
    --PRINT @Sql 
    SELECT @ParamList = '@Psdi CHAR(10),@PClient CHAR(4),@PAccountNumber VARCHAR(20),@PAddress VARCHAR(300),@PStartDate DATETIME ,@PEndDate DATETIME,@PJob INT,@PInvoice INT,@PAmount Money ' 
    EXEC SP_EXECUTESQL @Sql,@ParamList,@Sdi,@Client,@AccountNumber,@Address,@StartDate,@EndDate,@Job,@Invoice,@Amount 
    --PRINT @Sql 

END 



[Function(Name="dbo.GetDocumentsAdvancedSearch")] 
     public int GetDocumentsAdvancedSearch([Parameter(Name="SDI", DbType="Char(10)")] string sDI, [Parameter(Name="Client", DbType="Char(4)")] string client, [Parameter(Name="AccountNumber", DbType="VarChar(20)")] string accountNumber, [Parameter(Name="Address", DbType="VarChar(300)")] string address, [Parameter(Name="StartDate", DbType="DateTime")] System.Nullable<System.DateTime> startDate, [Parameter(Name="EndDate", DbType="DateTime")] System.Nullable<System.DateTime> endDate, [Parameter(Name="Job", DbType="Int")] System.Nullable<int> job, [Parameter(Name="Invoice", DbType="Int")] System.Nullable<int> invoice, [Parameter(Name="Amount", DbType="Money")] System.Nullable<decimal> amount) 
     { 
      IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), sDI, client, accountNumber, address, startDate, endDate, job, invoice, amount); 
      return ((int)(result.ReturnValue)); 
     } 
+0

你能告訴我們你的存儲過程嗎? – Paddy 2010-04-13 13:49:00

+0

我們需要看一些代碼。 – 2010-04-13 13:49:19

+0

我已經添加了存儲過程。你還可以指點我如何使用sqlrepository中的存儲過程,我已經添加到linqtosql類我的拖放 – Pinu 2010-04-13 13:54:18

回答

0

我的猜測是,由於SQL是動態的,因此LINQ無法準確確定該過程將返回的內容。

最好的解決方法可能是隻手工編輯.dbml文件

埃塔:如果你不知道要放什麼東西在.dbml文件,另一個選擇可能是「絕招」它爲搞清楚你是從你的存儲過程通過把一些SQL,將永遠不會在實踐中實際執行一個塊中返回的內容:

IF (FALSE) 
BEGIN 
    SELECT 
    DISTINCT ISNULL(Documents.DocumentID, NULL) 
    ,Person.Name1 
    ,Person.Name2 
    ,Person.Street1 
    ,Person.Street2 
    ,Person.CityStateZip 
    ,ISNULL(Person.ReferenceID,NULL) 
    ,ISNULL(Person.AccountNumber,NULL) 
    ,ISNULL(Person.HasSetPreferences,0) 
    ,Documents.Job 
    ,Documents.SDI 
    ,Documents.Invoice 
    ,ISNULL(Documents.ShippedDate,NULL) 
    ,ISNULL(Documents.DocumentPages,NULL) 
    ,Documents.DocumentType 
    FROM 
    Person 
    LEFT OUTER JOIN Documents ON Person.PersonID = Documents.PersonID 
    LEFT OUTER JOIN DocumentType ON Documents.DocumentType = DocumentType.DocumentType 
    LEFT OUTER JOIN Addresses ON Person.PersonID = Addresses.PersonID 
END 
+0

我已經添加了存儲過程的.dbml代碼。我需要改變什麼? – Pinu 2010-04-13 15:55:56

+0

@Pinu - 你可以看看dbml中爲一些其他sprocs表示類的方式,或者你可以嘗試我剛添加到我的答案中的備用選項。 – 2010-04-13 17:00:44

0

您的DataContext佈局(DBML)包含存儲過程返回正確的性質手動創建一個類。在其屬性中更改存儲過程的返回類型。

相關問題