2017-03-07 28 views
0

我打電話EF從EF中調用存儲過程返回錯誤的SqlParameter已被另一SqlParameterCollection

var paramSortColumn = new SqlParameter("@SortColumn", SqlDbType.NVarChar, 200) { Value = SortColumn }; 
var paramSortOrder = new SqlParameter("@SortOrder", SqlDbType.NVarChar, 10) { Value = SortOrder }; 
var paramStartIndex = new SqlParameter("@StartIndex", SqlDbType.Int) { Value = filter.StartIndex - 1 }; 
var paramItemsPerPage = new SqlParameter("@ItemsPerPage", SqlDbType.Int) { Value = filter.ItemsPerPage }; 

var paramDealerBranchID = new SqlParameter("@DealerBranchIDs", SqlDbType.NVarChar){Value = selectedIds }; 
var paramBypassDealerBranchIDs = new SqlParameter("@BypassDealerBranchIDs", SqlDbType.TinyInt) { Value = Convert.ToInt32(filter.ByPassDealerBranchIDs) }; 

var result = 
    _dbContext.Database.SqlQuery<DealerMappingDetailsReportModel>(
     "usp_DealerMappingDetail @DealerBranchIDs,@BypassDealerBranchIDs,@SortColumn,@SortOrder,@StartIndex,@ItemsPerPage", 
     paramDealerBranchID, paramBypassDealerBranchIDs, paramSortColumn, paramSortOrder, paramStartIndex, paramItemsPerPage 
    ); 
return result.ToList(); 

SQL存儲過程包含但它返回

SqlParameter有已經被載另一個 SqlParameterCollection

+0

復位(新的)你的DbContext – ErikEJ

+0

嘗試使用'ToList()'直接查詢執行後:'VAR的結果= _dbContext.Database.SqlQuery (「usp_DealerMappingDetail @ DealerBranchIDs,@ BypassDealerBranchIDs,...)ToList( );'然後'返回結果;' –

+0

問題解決了。 我剛剛聲明瞭一個新變量並將Convert.ToInt32(filter.ByPassDealerBranchIDs)的值傳遞給它。 –

回答

0

我有同樣的問題與Database.SqlQuery那叫一個Stored Procedure。許多人推薦「清除」和/或「克隆」Parameters集合(等等)。

但是......

我發現我的SQL命令文本不是「完全」 ......發現......我已經忘了在我的SQL以包括EXEC命令。看起來你可能有同樣的問題。

我改變了這個:
在我的方法,我通常喜歡把手背Queryables,所以我的方法通常看起來像下面。

...注意, 'EXEC' 缺少

var query = UnitOfWork.DbContext.Database.SqlQuery<DocumentStatusDataItem>("dbo.usp_ListDocumentStatusForATFDocuments @ContextFullName, @WorkflowNames", 
             new SqlParameter("ContextFullName", context.FullName), 
             new SqlParameter("WorkflowNames", namesXML)) 
             .AsQueryable(); 

這樣:

...注意, 'EXEC' 現在是有

var query = UnitOfWork.DbContext.Database.SqlQuery<DocumentStatusDataItem>("EXEC dbo.usp_ListDocumentStatusForATFDocuments @ContextFullName, @WorkflowNames", 
             new SqlParameter("ContextFullName", context.FullName), 
             new SqlParameter("WorkflowNames", namesXML)) 
             .AsQueryable(); 

然後我的電話開始工作:
例如... ca像這樣的人突然開始工作......我停止了這個例外。

List<DocumentStatusDataItem> collection = query.ToList(); 

但是,這個相同的解決方案也適用於ToList()方法我有同樣的問題。

相關問題