5

मैं एक साधारण ओरेकल संग्रहीत प्रक्रिया है कि तीन पैरामीटर में पारित हो जाता है, और एक उत्पादन पैरामीटर है:उत्पादन पैरामीटर के साथ इकाई फ्रेमवर्क का उपयोग कर ओरेकल संग्रहीत प्रक्रिया को कॉल करना?

CREATE OR REPLACE PROCEDURE RA.RA_REGISTERASSET 
(
    INPROJECTNAME IN VARCHAR2 
    ,INCOUNTRYCODE IN VARCHAR2 
    ,INLOCATION IN VARCHAR2 
    ,OUTASSETREGISTERED OUT VARCHAR2 
) 
AS 
BEGIN 
    SELECT 
     INPROJECTNAME || ', ' || INLOCATION || ', ' || INCOUNTRYCODE 
    INTO 
     OUTASSETREGISTERED 
    FROM 
     DUAL;  
END RA_REGISTERASSET; 

मैं इकाई की रूपरेखा 6.1 उपयोग करने के लिए OutAssetRegistered मूल्य वापस पाने के लिए कोशिश कर रहा हूँ, फिर भी, मैं एक अशक्त मिल कोई अपवाद के साथ SqlQuery बुला के बाद:

public class CmdRegisterAssetDto 
{ 
     public string inProjectName { get; set; } 
     public string inCountryCode { get; set; } 
     public string inLocation { get; set; } 
     public string OutAssetRegistered { get; set; } 
} 

// ---------------------------------- --------------------------

string projectName = "EXCO"; 
string location = "ANYWHERE"; 
string countryCode = "XX"; 

using (var ctx = new RAContext()) 
{ 
    var projectNameParam = new OracleParameter("inProjectName", OracleDbType.Varchar2, projectName, ParameterDirection.Input); 
    var countryCodeParam = new OracleParameter("inCountryCode", OracleDbType.Varchar2, countryCode, ParameterDirection.Input); 
    var locationParam = new OracleParameter("inLocation", OracleDbType.Varchar2, location, ParameterDirection.Input); 
    var assetRegisteredParam = new OracleParameter("OutAssetRegistered", OracleDbType.Varchar2, ParameterDirection.Output); 

    var sql = "BEGIN RA.RA_RegisterAsset(:inProjectName, :inCountryCode, :inLocation, :OutAssetRegistered); END;"; 
    var query = ctx.Database.SqlQuery<CmdRegisterAssetDto>(sql, projectNameParam, countryCodeParam, locationParam, assetRegisteredParam 
    ); 

    assetRegistered = (string)assetRegisteredParam.Value; 
} 

मैं इसे किसी भी लाभ के लिए काम करने के लिए संघर्ष कर रहा हूं, विभिन्न ब्लॉगों की जांच की है, अन्य सभी क्रूड ऑपरेशंस काम करते हैं, क्या कोई मेरी मदद कर सकता है और मुझे निर्देश दे सकता है कि मैं गलत कहां जा रहा हूं?

+0

मेरे पास एक समान आवश्यकता है जिसे आप हल कर सकते हैं? –

+0

मुझे एक ही समस्या है, अगर आपको कोई समाधान मिला तो कृपया मुझे बताएं। – pforsthoff

उत्तर

0

इस मामले में, आपको बुला नहीं किया जाना चाहिए:

var query = ctx.Database.SqlQuery<CmdRegisterAssetDto>(sql, projectNameParam, countryCodeParam, locationParam, assetRegisteredParam); 

लेकिन बजाय कॉल कर रहे:

var result = ctx.Database.ExecuteSqlCommand(sql, projectNameParam, countryCodeParam, locationParam, assetRegisteredParam); 

सूचना ही प्रभावी अंतर यह है कि SqlQuery<CmdRegisterAssetDto>ExecuteSqlCommand से बदला गया है। इसका मतलब यह भी है कि डीटीओ अनावश्यक है। अन्यथा, आपका कोड ऐसा लगता है कि इसे काम करना चाहिए। यहां उन परिवर्तनों मैंने कहा के साथ अपनी संपूर्णता में अपने मूल कोड है:

string projectName = "EXCO"; 
string location = "ANYWHERE"; 
string countryCode = "XX"; 

using (var ctx = new RAContext()) 
{ 
    var projectNameParam = new OracleParameter("inProjectName", OracleDbType.Varchar2, projectName, ParameterDirection.Input); 
    var countryCodeParam = new OracleParameter("inCountryCode", OracleDbType.Varchar2, countryCode, ParameterDirection.Input); 
    var locationParam = new OracleParameter("inLocation", OracleDbType.Varchar2, location, ParameterDirection.Input); 
    var assetRegisteredParam = new OracleParameter("OutAssetRegistered", OracleDbType.Varchar2, ParameterDirection.Output); 

    var sql = "BEGIN RA.RA_RegisterAsset(:inProjectName, :inCountryCode, :inLocation, :OutAssetRegistered); END;"; 
    var result = ctx.Database.ExecuteSqlCommand(sql, projectNameParam, countryCodeParam, locationParam, assetRegisteredParam); 

    assetRegistered = (string)assetRegisteredParam.Value; 
} 

मेरी सिद्धांत को साबित करने के लिए, मैं अशक्त व्यवहार है कि आप अनुभव कर रहे reproduced और फिर एक परिवर्तन यह है कि बनाया है। यह थोड़ी देर के लिए लटका हुआ था (शायद ईएफ को गियर में लात देना), लेकिन उसके बाद हर बार जल्दी से निष्पादित किया गया। प्रत्येक मामले में, मुझे आउट पैरामीटर में एक मान प्रतीक्षा है।

किसी को भी वहाँ बाहर मुसीबत में चल रहा है, वहाँ एक पूरे अक्षरों में लिखावट भिन्नता है कि आप के लिए पटकथा विवरण का ख्याल रखता है बताया गया है:

string projectName = "EXCO"; 
string location = "ANYWHERE"; 
string countryCode = "XX"; 

using (var ctx = new RAContext()) 
using (var cmd = ctx.Database.Connection.CreateCommand()) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "RA.RA_REGISTERASSET"; 

    var projectNameParam = new OracleParameter("inProjectName", OracleDbType.Varchar2, projectName, ParameterDirection.Input); 
    var countryCodeParam = new OracleParameter("inCountryCode", OracleDbType.Varchar2, countryCode, ParameterDirection.Input); 
    var locationParam = new OracleParameter("inLocation", OracleDbType.Varchar2, location, ParameterDirection.Input); 
    var assetRegisteredParam = new OracleParameter("OutAssetRegistered", OracleDbType.Varchar2, ParameterDirection.Output); 
    cmd.Parameters.AddRange(new[] { projectNameParam, countryCodeParam, locationParam, assetRegisteredParam }); 

    cmd.Connection.Open(); 
    var result = cmd.ExecuteNonQuery(); 
    cmd.Connection.Close(); 

    assetRegistered = (string)assetRegisteredParam.Value; 
} 

एक बाद का विचार के रूप में, आप तकनीकी रूप से अपने मूल समाधान के साथ अगर आप लागू जा सकते हैं तुरंत पूछताछ (यानी query.FirstOrDefault())। क्वेरी का वापसी मूल्य हमेशा शून्य होगा, लेकिन आपका आउट पैरामीटर कम से कम आबादी प्राप्त करेगा। ऐसा इसलिए है क्योंकि ईएफ क्वेरी स्थगित निष्पादन का उपयोग करती हैं।

संबंधित मुद्दे

 संबंधित मुद्दे