मैं अपनी पहचान मूल्य वापस करते समय एक तालिका में सम्मिलित करने का प्रयास कर रहा हूं। लेकिन "सूचकांक सरणी की सीमा से बाहर था" त्रुटि फेंक दी गई है। मैं सफलतापूर्वक dbForge में क्वेरी निष्पादित कर सकता हूं लेकिन जब मैं ऑरैकल प्रबंधित डेटा एक्सेस के साथ सी # में क्वेरी निष्पादित करने का प्रयास नहीं करता हूं। क्वेरी बहुत सरल है। अगर मैं लेनदेन अक्षम करता हूं, तो डेटाबेस में पंक्ति डाली जाती है लेकिन मुझे त्रुटि मिलती है और वापसी मूल्य नहीं मिल सकता है।

    var query = @"insert into table1  VALUES (97,'Mondon') RETURNING Id INTO :id";
                    OracleTransaction transaction = null;
                    using (var connection = new OracleConnection(_conStr))
                    {
                        try
                        {
                            connection.Open();
                            var command = connection.CreateCommand();
                            transaction = connection.BeginTransaction();
                            command.Transaction = transaction;
                            command.CommandText = query;
                            command.CommandTimeout = 5 * 60;
    
                            command.Parameters.Add(new OracleParameter("id", OracleDbType.Int32, ParameterDirection.ReturnValue));
    
                            var result = command.ExecuteNonQuery();
                            transaction.Commit();
                            var id = Convert.ToInt32(command.Parameters["id"].Value);
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            Logger.LogError(ex);
}
}
1
Mahogany 30 जून 2020, 10:34
क्या आपने ParameterDirection.Output की कोशिश की?
 – 
Wernfried Domscheit
30 जून 2020, 10:45
हां । मैं भी यही कोशिश करता हूं। लेकिन वही परिणाम
 – 
Mahogany
30 जून 2020, 10:55

2 जवाब

  1. आपके पास बहुत अधिक कोड है
  2. आपको गलतफहमी है

अगर आपके कोई प्रश्न हैं तो मुझे बताएं, टिप्पणियों को इनलाइन देखें

int newId = 0;
// NOTE, if you don't insert into field 'ID' you need to list fields
var sql = "insert into table1 (fld1, fd2) VALUES (97,'Mondon') RETURNING Id INTO :id";
                        
try
{
    using (var conn = new OracleConnection(_conStr))
    {
        using (var cmd = new OracleCommand(sql, conn))
        {                   
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new OracleParameter("id", OracleDbType.Int32, ParameterDirection.Output)); // this is output, not return
        
            conn.Open();          
            var count = cmd.ExecuteNonQuery();
          
            if (count > 0) // table can have a trigger so number of rows changed can be more than 1
            {
                // YOUR BIG MISCONCEPTION HERE (FIXED)
                OracleDecimal val = (OracleDecimal)cmd.Parameters["id"].Value; // this returns special oracle struct
                int newId = val.ToInt32();   // you can use val.IsNull but here it is not possible            
            }
            else 
                throw new Exception("Value not inserted");

        }
    }
}
catch (Exception ex)
{
    Logger.LogError(ex);
}

ध्यान दें कि एकल रिकॉर्ड डालने के लिए स्पष्ट लेनदेन की आवश्यकता नहीं है

0
T.S. 1 जुलाई 2020, 02:00

मुझे लगता है कि आपको किसी फ़ंक्शन में सम्मिलित करना होगा:

create function InsertTable1(n in integer, val in varchar2) return integer as
   res integer;
begin
   insert into table1  VALUES (n, val) RETURNING Id INTO res;
   RETURN res;
end;

और फिर आपके आवेदन में:

var query = @"BEGIN :0 := InsertTable1(97,'Mondon'); END;";

स्थिर स्ट्रिंग्स के बजाय इनपुट मानों को बाइंड-पैरामीटर के रूप में भी परिभाषित करना एक अच्छा विचार होगा।

एक पूर्ण गतिशील समाधान इसके समान हो सकता है:

create function InsertTable(cmd in varchar2) return integer as
   res integer;
begin
   EXECUTE IMMEDIATE cmd USING OUT res;
   RETURN res;
end;


var query = @"BEGIN :0 := InsertTable('insert into table1  VALUES (97,''Mondon'') RETURNING Id INTO :res'); END;";
-1
Wernfried Domscheit 30 जून 2020, 11:40
मैं वापसी मूल्य प्राप्त करने में कामयाब रहा। लेकिन इस पद्धति के साथ मुझे काम करने वाली प्रत्येक तालिका के लिए फ़ंक्शन लिखना है। और वास्तविक तालिकाओं में इतने सारे चर होते हैं।
 – 
Mahogany
30 जून 2020, 11:26
कृपया मेरा अपडेट देखें। लेकिन मैं अभी भी तैयार कथन का उपयोग करना और चर को बांधना पसंद करूंगा।
 – 
Wernfried Domscheit
30 जून 2020, 11:40