0

我從Entity Framework(使用代碼優先方法)調用ExecuteStoreQuery時出現以下錯誤。調用實體框架代碼中的輸出參數存儲過程的錯誤代碼優先

數據讀取器有多個字段。多個字段對於EDM基元或枚舉類型無效。

但是我的插入/更新操作反映在數據庫中。

這個問題的任何想法?

這是代碼是從C#

long Id=0; 

SqlParameter paramoutput = new SqlParameter() 
{ 
    ParameterName = "Result", 
    Value = "", 
    SqlDbType = System.Data.SqlDbType.BigInt, 
    Size = 100, 
    Direction = System.Data.ParameterDirection.Output 
}; 

var mydata = (dataContext as IObjectContextAdapter).ObjectContext 
      .ExecuteStoreQuery<long>("exec Save @MarkupId, @ApiId, @MainBranchId, @Title, @Markup, @IsPercentage, @IsDomestic, @CreatedOn, @CreatedBy, @ModifiedOn, @ModifiedBy, @IsActive, @Result out", 
       new SqlParameter("@MarkupId", generalMarkupModel.Id), 
       new SqlParameter("@ApiId", generalMarkupModel.ApiId), 
       new SqlParameter("@MainBranchId", generalMarkupModel.MainBranchId), 
       new SqlParameter("@Title", generalMarkupModel.Title), 
       new SqlParameter("@Markup", generalMarkupModel.Markup), 
       new SqlParameter("@IsPercentage", generalMarkupModel.IsPercentage), 
       new SqlParameter("@IsDomestic", generalMarkupModel.IsDomestic), 
       new SqlParameter("@IsActive", generalMarkupModel.IsActive), 
       new SqlParameter("@CreatedOn", DateTime.Now), 
       new SqlParameter("@CreatedBy", "ajc"), 
       new SqlParameter("@ModifiedOn", DateTime.Now), 
       new SqlParameter("@ModifiedBy", "ajm"), 
       paramoutput); 

Id = Convert.ToInt64(paramoutput.Value.ToString()); 
return Id; 

特林存儲的過程執行insert操作並設置@@identity到輸出參數。

這裏是我的存儲過程:

所有的
ALTER PROCEDURE mypocedurename-here 
@MarkupId bigint,   
@ApiId int,   
@MainBranchId int,    
@Title varchar(50),      
@Markup float , 
@IsPercentage bit, 
@IsDomestic bit, 
@CreatedOn datetime, 
@CreatedBy varchar(50), 
@ModifiedOn datetime, 
@ModifiedBy varchar(50), 
@IsActive bit, 
@Result bigint OUTPUT    

AS    
BEGIN    

    INSERT INTO GeneralMarkups    
    ( 
    ApiId,    
    MainBranchId, 
    Title,   
    Markup,    
    IsPercentage ,   
    IsDomestic , 
    IsActive ,    
    CreatedOn, 
    CreatedBy, 
    ModifiedOn, 
    ModifiedBy   
)    
    VALUES    
    (
    @ApiId,    
    @MainBranchId,    
    @Title,    
    @Markup ,   
    @IsPercentage , 
    @IsDomestic, 
    @IsActive ,   
    @CreatedOn, 
    @CreatedBy, 
    @ModifiedOn, 
    @ModifiedBy   

) 
    select @[email protected]@IDENTITY  

END 
+1

POST CODE!我不知道你在說什麼。您需要發佈提供錯誤的代碼,我們可能會幫助您。 – Zane

+0

已更新代碼@Zane –

+0

我們還需要存儲的proc。 – Zane

回答

0

首先,你的程序是不選擇任何結果。所以你需要選擇一些東西(因爲你指定了一個類型爲long的返回結果集)。所以,改變proc的最後一行:

-- instead of select @[email protected]@IDENTITY 
-- use these lines: 
SET @Result = @@IDENTITY 
SELECT @Result Result 

現在,您可以通過您的過程調用獲取選定的值。意思是當你執行你的方法時,你會從結果中得到新的ID(因爲你的mydata參數 - 應該迭代)。

但仍然有一個錯誤。您將無法獲得這一行工作:

Id = Convert.ToInt64(paramoutput.Value.ToString()); 

因爲你的輸出參數還沒有一個值(它是null),除非你迭代查詢的結果。意味着paramoutput.Value將是null,直到您在查詢中調用一個迭代器方法。所以:

SqlParameter paramoutput = new SqlParameter() 
{ 
    ParameterName = "Result", 
    // Value = "", no need 
    SqlDbType = System.Data.SqlDbType.BigInt, 
    // Size = 100, no need 
    Direction = System.Data.ParameterDirection.Output 
}; 

var mydata = (dataContext as IObjectContextAdapter).ObjectContext 
      .ExecuteStoreQuery<long>("exec Save @MarkupId, @ApiId, @MainBranchId, @Title, @Markup, @IsPercentage, @IsDomestic, @CreatedOn, @CreatedBy, @ModifiedOn, @ModifiedBy, @IsActive, @Result out", 
       new SqlParameter("@MarkupId", generalMarkupModel.Id), 
       new SqlParameter("@ApiId", generalMarkupModel.ApiId), 
       new SqlParameter("@MainBranchId", generalMarkupModel.MainBranchId), 
       new SqlParameter("@Title", generalMarkupModel.Title), 
       new SqlParameter("@Markup", generalMarkupModel.Markup), 
       new SqlParameter("@IsPercentage", generalMarkupModel.IsPercentage), 
       new SqlParameter("@IsDomestic", generalMarkupModel.IsDomestic), 
       new SqlParameter("@IsActive", generalMarkupModel.IsActive), 
       new SqlParameter("@CreatedOn", DateTime.Now), 
       new SqlParameter("@CreatedBy", "ajc"), 
       new SqlParameter("@ModifiedOn", DateTime.Now), 
       new SqlParameter("@ModifiedBy", "ajm"), 
       paramoutput); 

// here, the mydata, is of type ObjectResult<long> which you should iterate it to get underlying IDataReader iterated and closed. Then you can use output parameters. So, add this line: 
var returnedId = mydata.FirstOrDefault(); 
// now, the output parameter is available: 
Id = Convert.ToInt64(paramoutput.Value.ToString()); 

請考慮我已添加到代碼(和新行)的評論。

畢竟,你爲什麼要傳遞一個輸出參數並選擇相同的結果呢?其中一名應該完成這項工作,另一名應該是多餘的。不是嗎?或者有什麼我看不到的?