-
Notifications
You must be signed in to change notification settings - Fork 191
Closed
Description
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