2010-04-13 77 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)包含存储过程返回正确的性质手动创建一个类。在其属性中更改存储过程的返回类型。

相关问题