2013-10-04 60 views
1

我有一個過程,它需要兩個日期(字符串)並在DB2400上返回結果集。使用Entity Framework(4.0),我看到了不同參數的相同結果(當結果不同時[通過在iSeries GUI中運行過程來驗證])。OS400 DB2 SP的無效參數導致實體框架錯誤

MyEntities.MY_DB2_PROCEDURE('09262013','09262013').ToList(); 

MyEntities.MY_DB2_PROCEDURE('09272013','09272013').ToList(); 

生成&與如在第一代碼段看到設置的參數運行; 18條記錄正確返回。用新的一組參數構建並運行;返回相同的結果集。

還是那句話:

CALL MY_DB2_PROCEDURE('09262013','09262013') 

CALL MY_DB2_PROCEDURE('09272013','09272013') 

做產生不同的結果 - 對同一數據庫中的iSeries GUI運行。

+0

您是否查看過IBM i中計劃緩存中的語句,以查看它所發生的情況? – WarrenT

+0

你在哪個版本上? – WarrenT

+0

6.1 - 尚未檢查計劃緩存;我正在檢查。 – steamrolla

回答

0

該過程需要兩個「日期字符串」作爲參數。我使用這個擴展方法來將我DateTime S,造成因個位數天/月的問題:

public static string ToDateParameter(this DateTime dt) 
{ 
    //Format of procedure's parameters: MMDDYYYY 
    return dt.Month.ToString() + dt.Day.ToString() + dt.Year.ToString(); 
} 

更新到這一點,並沒有更多的錯誤:

public static string ToDateParameter(this DateTime dt) 
{ 
    string day; 
    string month; 
    /* 
    * Format of procedure's parameters: MMDDYYYY 
    * Procedure expects string of 8 characters for dates; adding 0's in front of single-digit days & months. 
    */ 
    day = dt.Day.ToString().Length == 1 ? "0" + dt.Day.ToString() : dt.Day.ToString(); 
    month = dt.Month.ToString().Length == 1 ? "0" + dt.Month.ToString() : dt.Month.ToString(); 

    return month + day + dt.Year.ToString(); 
} 

起初,我沒有」牛逼想檢查我的參數什麼因喜歡EF錯誤:

System.Data.EntityCommandExecutionException: The data reader is incompatible with the specified `Property`. A member of the type, `Property`, does not have a corresponding column in the data reader with the same name. 

更新:我沒有寫SP和無線網絡連接不同意這些參數。儘管如此,我並沒有期望看到EF錯誤,而不是DB2向我發送錯誤。

+1

如果您編寫了SP,可能考慮在參數上使用更標準的日期格式。這將幫助您爲其他應用程序(如.NET程序)提供更友好的界面。 (希望你的日期不會像數據庫那樣存儲。) – WarrenT

+0

我沒有寫SP,我100%同意你的觀點。謝天謝地,我們的日期並不像數據庫中那樣。 – steamrolla