Page 1 of 1
					
				Trouble with array parameter in OracleCommand
				Posted: Tue  25 Oct 2005 04:11
				by Sergius
				I have an array of variable length as parameter and I call this command several times:
Code: Select all
//... I declare an array and pass it as parameter
string [] z = new string[3] { "a","b","c"};
OracleCommand1.Parameters[0].Value = z;
OracleCommand1.Parameters[0].ArrayLength = z.Length;
OracleCommand1.ExecuteNonQuery();
//It work fine!
//....
//Now try to increase array elements  to 4:
z = new string[4] { "a","b","c", "d"};
OracleCommand1.Parameters[0].Value = z;
OracleCommand1.Parameters[0].ArrayLength = z.Length;
OracleCommand1.ExecuteNonQuery();
//It throw exception:
//....
System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at CoreLab.Oracle.OracleParameter.a(p& A_0, Boolean A_1, Boolean A_2, OracleCommand A_3, Byte[] A_4, x A_5, Boolean& A_6)
   at CoreLab.Oracle.OracleCommand.a(Int32 A_0, OracleParameterCollection A_1, x A_2, Boolean& A_3)
   at CoreLab.Oracle.OracleCommand.a(CommandBehavior A_0, IDisposable A_1, Int32 A_2, Int32 A_3)
   at CoreLab.Common.DbCommandBase.b(CommandBehavior A_0)
   at CoreLab.Oracle.OracleCommand.ExecuteReader()
How can I fix it?
 
			 
			
					
				
				Posted: Tue  25 Oct 2005 08:15
				by Paul
				We will fix this problem in the next OraDirect .NET build. Please use the following code now
Code: Select all
string [] z = new string[3] { "a","b","c"}; 
OracleCommand1.Parameters[0].ArrayLength = z.Length; 
OracleCommand1.Parameters[0].Value = z; 
OracleCommand1.ExecuteNonQuery(); 
//It work fine! 
//.... 
//Now try to increase array elements  to 4: 
z = new string[4] { "a","b","c", "d"}; 
OracleCommand1.Parameters[0].ArrayLength = z.Length; 
OracleCommand1.Parameters[0].Value = z; 
OracleCommand1.ExecuteNonQuery(); 
 
			 
			
					
				
				Posted: Mon  14 Nov 2005 05:42
				by Guest
				In version 3.0.1.5 this code not work:
OracleCommand1.CommandType = CommandType.StoredProcedure;
   OracleCommand1.Parameters.Add("result", OracleDbType.Cursor);
   OracleCommand1.Parameters.Add("sss", OracleDbType.VarChar);
   OracleCommand1.Parameters[0].Direction = ParameterDirection.ReturnValue;
   OracleCommand1.Parameters[1].Direction = ParameterDirection.Input;
string [] z = new string[3] { "a","b","c"};
OracleCommand1.Parameters[0].ArrayLength = z.Length;
OracleCommand1.Parameters[0].Value = z;
OracleCommand1.ExecuteNonQuery(); 
Array is passed to Oracle with empty values, but in prev version(3.0.1.4) it work correctly.
			 
			
					
				
				Posted: Mon  14 Nov 2005 10:28
				by Paul
				We fixed this problem. This fix will be included in the OraDirect .NET build.
			 
			
					
				
				Posted: Thu  08 Dec 2005 07:34
				by Sergius
				
OracleCommand1.CommandType = CommandType.StoredProcedure;
OracleCommand1.Parameters.Add("result", OracleDbType.Cursor);
OracleCommand1.Parameters.Add("sss", OracleDbType.VarChar);
OracleCommand1.Parameters[0].Direction = ParameterDirection.ReturnValue;
OracleCommand1.Parameters[1].Direction = ParameterDirection.Input;
string [] z = new string[3] { "a","b","c"};
OracleCommand1.Parameters[0].ArrayLength = z.Length;
OracleCommand1.Parameters[0].Value = z;
OracleCommand1.ExecuteNonQuery(); 
This code don't work with Oracle 8.1.7 
It return Oracle error ORA-02005:
ORA-02005 implicit (-1) length not valid for this bind or define datatype
Cause: A negative length for the define variable was passed to a define function.
Action: An explicit, non-negative, length parameter must be passed.
 
			 
			
					
				
				Posted: Wed  21 Dec 2005 11:31
				by schueler
				Any good news on this thread? Any known other workaround? I'm waiting for this fix, since 4 weeks!
			 
			
					
				
				Posted: Wed  21 Dec 2005 14:03
				by Paul
				What is the declaration of your function? According to your code it returns the array of Cursors. Or do you want to pass string values to the second (Parameters[1]) parameter?
			 
			
					
				
				Posted: Mon  26 Dec 2005 01:32
				by Sergius
				Sorry, it was misprint 

. The right code is 
OracleCommand1.CommandType = CommandType.StoredProcedure;
OracleCommand1.Parameters.Add("result", OracleDbType.Cursor);
OracleCommand1.Parameters.Add("sss", OracleDbType.VarChar);
OracleCommand1.Parameters[0].Direction = ParameterDirection.ReturnValue;
OracleCommand1.Parameters[1].Direction = ParameterDirection.Input;
string [] z = new string[3] { "a","b","c"};
OracleCommand1.Parameters[1].ArrayLength = z.Length;
OracleCommand1.Parameters[1].Value = z;
OracleCommand1.ExecuteNonQuery(); 
But it doesn't matter - this code not work with Oracle 8.1.7
I want pass an array of string as parameter and get a cursor.
 
			 
			
					
				
				Posted: Mon  26 Dec 2005 09:31
				by Paul
				We reproduced your problem with OraDirect .NET 3.01.5 and fixed it. This fix will be included in the next OraDirect .NET build.
			 
			
					
				
				Posted: Tue  27 Dec 2005 12:26
				by Guest
				Sehr Gut! 
