2015-11-25 67 views
1

我試圖從EF使用context.Database.ExecuteSqlCommand調用存儲過程,因爲我的一個參數是數據表。使用ExecuteSqlCommand調用存儲過程(期望沒有提供的參數)

這裏是過程的參數:

ALTER PROCEDURE [mySchema].[myProc] 
    @customerId INT, 
    @indicatorTypeId INT, 
    @indicators [mySchema].[IndicatorList] READONLY, 
    @startDate DATETIME, 
    @endDate DATETIME 

這裏是C#代碼中調用存儲過程:

var indicatorsDt = new DataTable(); 

indicatorsDt.Columns.Add("Date", typeof(DateTime)); 
indicatorsDt.Columns.Add("Ongoing", typeof(int)); 
indicatorsDt.Columns.Add("Success", typeof(int)); 
indicatorsDt.Columns.Add("Warning", typeof(int)); 
indicatorsDt.Columns.Add("Error", typeof(int)); 
indicatorsDt.Columns.Add("Other", typeof(int)); 

var customerIdParam = new SqlParameter("customerId", SqlDbType.Int); 
customerIdParam.Value = customerId; 

var typeIdParam = new SqlParameter("indicatorTypeId", SqlDbType.Int); 
typeIdParam.Value = typeId; 

var startDateParam = new SqlParameter("startDate", SqlDbType.DateTime); 
startDateParam.Value = startDate; 

var endDateParam = new SqlParameter("endDate", SqlDbType.DateTime); 
endDateParam.Value = endDate; 

foreach (var indicator in indicators) 
{ 
    indicatorsDt.Rows.Add(indicator.Date, indicator.Ongoing, 
          indicator.Success, indicator.Warning, 
          indicator.Error, indicator.Other); 
} 

var tableParameter = new SqlParameter("indicators", SqlDbType.Structured); 
tableParameter.Value = indicatorsDt; 
tableParameter.TypeName = "MySchema.IndicatorList"; 

context.Database.ExecuteSqlCommand("exec MySchema.MyProc", customerIdParam, typeIdParam, tableParameter, startDateParam, endDateParam); 

正如你所看到的,提供了所有的參數,它們中沒有一個空值,但我總是得到這個SqlException

過程或函數'UpdateIndicators'期望參數 '@customerId',未提供。

我找不出我缺少的東西。是否使用SqlParameter錯誤?即使參數不重要,參數在ExecuteSqlCommand中的提供順序也是相同的。

提前致謝。

回答

0

您在您正在執行的SQL字符串中缺少的參數。試着用一個「@」創建參數名稱前面,然後改變ExecuteSqlCommand呼籲:

context.Database.ExecuteSqlCommand("exec MySchema.MyProc @customerId, @indicatorTypeId, @indicators, @startDate, @endDate", customerIdParam, typeIdParam, tableParameter, startDateParam, endDateParam); 
0

試試這個:

var customerIdParam = new SqlParameter("@customerId", SqlDbType.Int); 
+0

不,它不工作要麼,我得到同樣的例外。 –

0

這裏是我目前叫我帶參數的存儲過程。用你自己的參數名稱/值替換。請記住,您可能必須按照存儲過程中聲明的相同順序列出參數。

創建的SqlParameter數組:

SqlParameter[] parameters = new SqlParameter[] { 
    new SqlParameter("@ParamName1", Value1), 
    new SqlParameter("@ParamName2", Value2), 
    new SqlParameter("@ParamName3", Value3), 
    new SqlParameter("@ParamName4", Value4), 
    new SqlParameter("@ParamName5", Value5) 
}; 

然後調用存儲過程:

_context.Database.ExecuteSqlCommand(DbHelper.GenerateCommandText("SpName", parameters), parameters); 

這裏是DbHelper代碼:

public class DbHelper 
{ 
    public static string GenerateCommandText(string storedProcedure, SqlParameter[] parameters) 
    { 
     string CommandText = "EXEC {0} {1}"; 
     string[] ParameterNames = new string[parameters.Length]; 

     for (int i = 0; i < parameters.Length; i++) 
     { 
      ParameterNames[i] = parameters[i].ParameterName; 
     } 

     return string.Format(CommandText, storedProcedure, string.Join(",", ParameterNames)); 
    } 
} 
相關問題