Skip to content

OracleParameter object is already contained in a collection #3

@ralmsdeveloper

Description

@ralmsdeveloper

I was doing some testing, and I found that little problem.
When using "Parameters.Add".

The "Parameters.AddRange" works perfectly!

NOTE: The Inserir_Parametro_Um_Por_Um test fails!

using Oracle.ManagedDataAccess.Client;
using System;
using System.Data;
using Xunit;

namespace OracleTestesNetCore
{
    public class Testes
    {
        private static OracleConnection _oracleConnection = null;
        private static readonly OracleParameter[] _parametros = new[]
        {
            new OracleParameter
            {
                    OracleDbType = OracleDbType.Varchar2,
                    ParameterName="DESCRICAO",
                    Value = "DESCRICAO TESTE"
            },
            new OracleParameter
            {
                    OracleDbType = OracleDbType.Decimal,
                    ParameterName="VALOR",
                    Value = 25.99m
            },
            new OracleParameter
            {
                    OracleDbType = OracleDbType.Date,
                    ParameterName="DATA",
                    Value = DateTime.Now
            }
        };

        public Testes()
        {
            // Efetuar conexão!
            _oracleConnection = new OracleConnection
            {
                ConnectionString = new OracleConnectionStringBuilder
                {
                    UserID = "ralms_pdb_admin",
                    Password = "ralms_pdb_admin",
                    DataSource = "127.0.0.1:1521/ralms"
                }.ConnectionString
            };

            _oracleConnection.Open();

            // Inicializar Banco
            InicializarBanco();
        }

        [Fact]
        public void Inserir_Parametro_Um_Por_Um()
        {
            ExecutarComando("DELETE FROM \"TESTE\"");

            for (int i = 0; i < 3; i++)
            {
               // First time, run normally, second failure!
               // OracleParameter object is already contained in a collection

                ExecutarComando(
                    $"INSERT INTO \"TESTE\" (DESCRICAO,VALOR,DATA) VALUES (:DESCRICAO,:VALOR,:DATA)",
                    _parametros);
            }

            var dados = GetDados("SELECT * FROM \"TESTE\"");

            Assert.True(dados.Rows.Count == 3);
        }

        [Fact]
        public void Inserir_Parametro_Range()
        {
            ExecutarComando("DELETE FROM \"TESTE\"");

            for (int i = 0; i < 3; i++)
            {
                ExecutarComando(
                    $"INSERT INTO \"TESTE\" (DESCRICAO,VALOR,DATA) VALUES (:DESCRICAO,:VALOR,:DATA)",
                    _parametros,
                    true);
            }

            var dados = GetDados("SELECT * FROM \"TESTE\"");

            Assert.True(dados.Rows.Count == 3);
        }

        [Fact]
        public void GetTabelas()
        {
            var dados = GetDados("SELECT * FROM ALL_TABLES");

            Assert.True(dados.Rows.Count > 0);
        }

        private static void InicializarBanco()
        {
            ExecutarComando(
@"BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE ""TESTE""(
    ""ID"" NUMBER(38, 0) GENERATED BY DEFAULT AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE,
    ""DESCRICAO"" NVARCHAR2(100),
    ""DATA"" DATE,
    ""VALOR"" NUMBER(18, 2)
)';
EXCEPTION
WHEN OTHERS THEN
  IF(SQLCODE != -942)THEN
      EXECUTE IMMEDIATE 'DELETE FROM ""TESTE""';
  END IF;
END;");

        }

        private static void ExecutarComando(
            string comando,
            OracleParameter[] parametros = null,
            bool usarRange = false)
        {
            using (var cmd = _oracleConnection.CreateCommand())
            {
                cmd.CommandText = comando;

                if (parametros != null)
                {
                    if (usarRange)
                    {
                        cmd.Parameters.AddRange(parametros);
                    }
                    else
                    {
                        for (int i = 0; i < parametros.Length; i++)
                        {
                            cmd.Parameters.Add(parametros[i]);
                        }
                    }
                }
                cmd.ExecuteNonQuery();
            }
        }

        private static DataTable GetDados(string comando)
        {
            var dados = new DataTable();
            using (var cmd = _oracleConnection.CreateCommand())
            {
                cmd.CommandText = comando;
                dados.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection));
                return dados;
            }
        }
    }
}

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions