Я создал следующую хранимую процедуру в Oracle 12.2:
create or replace PROCEDURE "SP_VARIABELEN_HIERARCHY" (
PP_USER_IN IN VARCHAR2,
PCPID_IN IN VARCHAR2,
VAR_CODE_IN IN VARCHAR2,
FASE_NR_IN IN NUMBER,
P_RESULTS OUT SYS_REFCURSOR
) IS
BEGIN
OPEN P_RESULTS FOR
SELECT DISTINCT LEVEL
VAR_CODE,
FASE_NR,
GENSTAT_VOLG_NR
FROM EP3_VARIABELEN_FS2_HULP
WHERE PP_USER = PP_USER_IN
AND CODE = PCPID_IN
CONNECT BY PRIOR AFG = VAR
AND PP_USER = PP_USER_IN
AND CODE = PCPID_IN
START WITH VAR_CODE = VAR_CODE_IN
AND FASE_NR = FASE_NR_IN
AND PP_USER = PP_USER_IN
AND CODE = PCPID_IN
ORDER BY LEVEL DESC, GENSTAT_VOLG_NR;
END SP_VARIABELEN_HIERARCHY;
Я настроил хранимую процедуру в App.config так:
<oracle.manageddataaccess.client>
<version number="*">
<implicitRefCursor>
<storedProcedure schema="EPROS" name="SP_VARIABELEN_HIERARCHY">
<refCursor name="P_RESULTS">
<bindInfo mode="Output" />
<metadata columnOrdinal="0" columnName="VAR_CODE" providerType="Varchar2" dataType="System.String" allowDBNull="true" nativeDataType="Varchar2" columnSize="10" />
<metadata columnOrdinal="1" columnName="FASE_NR" providerType="Int64" dataType="System.Int64" allowDBNull="true" nativeDataType="Number" columnSize="12" />
<metadata columnOrdinal="2" columnName="GENSTAT_VOLG_NR" providerType="Int64" dataType="System.Int64" allowDBNull="true" nativeDataType="Number" columnSize="12" />
</refCursor>
</storedProcedure>
Я импортировал SP в Entity Framework и создал функцию импорта со сложным типом, сгенерированным из данных в App.config.
Я написал следующий юнит-тест:
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Wur.Epros.Core.Infrastructure;
using Wur.Epros.Core.Repositories;
using Wur.Epros.Core.Tests.Base;
namespace Wur.Epros.Core.Tests.Repositories
{
[TestClass]
public class Ep3VariabelenFs2HulpRepositoryTests : TestBase
{
[TestMethod]
public void RekenregelsTest()
{
using (var dbContext = EprosEntities)
{
dbContext.Database.BeginTransaction();
string cUSER = "VISSCHER";
string cPCPID = "D0600513_1072";
string cVAR_CODE = "DOPJ2";
int cFASE_NR = 2;
string sSQL = string.Empty;
//var result = Ep3VariabelenFs2HulpRepository.Instance.Get(v =>
// v.PP_USER == cUSER
// && cPCPID == cPCPID
// && )
sSQL = "SELECT DISTINCT LEVEL";
sSQL = sSQL + " , VAR_CODE";
sSQL = sSQL + " , FASE_NR";
sSQL = sSQL + " , GENSTAT_VOLG_NR";
sSQL = sSQL + " FROM EP3_VARIABELEN_FS2_HULP";
sSQL = sSQL + " WHERE PP_USER = '" + cUSER + "'";
sSQL = sSQL + " AND CODE = '" + cPCPID + "'";
sSQL = sSQL + " CONNECT BY PRIOR AFG = VAR ";
sSQL = sSQL + " AND PP_USER = '" + cUSER + "'";
sSQL = sSQL + " AND CODE = '" + cPCPID + "'";
sSQL = sSQL + " START WITH VAR_CODE = '" + cVAR_CODE + "'";
sSQL = sSQL + " AND FASE_NR = " + cFASE_NR;
sSQL = sSQL + " AND PP_USER = '" + cUSER + "'";
sSQL = sSQL + " AND CODE = '" + cPCPID + "'";
sSQL = sSQL + " ORDER BY LEVEL DESC";
sSQL = sSQL + " , GENSTAT_VOLG_NR";
var result1 = GetDataTable(dbContext, sSQL);
var result2 = Ep3VariabelenFs2HulpRepository.Instance.GetEp3VariabelenHierarchy(cUSER, cPCPID, cVAR_CODE, cFASE_NR);
var count1 = result1.Rows.Count;
var count2 = result2.Count();
Assert.AreEqual(count1, count2, "Count");
}
}
}
}
Мы преобразуем использование строки SQL в LINQ с использованием Entity Framework.
Теперь каждый раз, когда я выполняю модульный тест, я получаю исключение InvalidCaseException. Я предполагаю, что конфигурация неверна, но я не могу указать на это.
Версия Entity Framework: 6
Версия Oracle 12.2