insercion masiva de datos

20/03/2010 - 18:37 por jdepaz | Informe spam
Hola lista,

De un recibo de pago, el detalle de los pagos se agregan en un
ListView en C#,

por ejemplo:


TIPO DESCRIPCION CANTIDAD
EFECTIVO EN EFECTIVO 100.00
DOLARES 1 X 8 80.00
CHEQUE BANCO INDUSTRIAL -1234- 100.00


y la tabla:

CREATE TABLE tbl_10
(
tbl_08_no numeric(11) NOT NULL,
tbl_10_fpago character varying(15) NOT NULL,
tbl_10_desc character varying(50) NOT NULL,
tbl_10_cant numeric(10,2) NOT NULL
)


y para la insercion en la BD (PostgreSQL 8.4.3), tengo lo siguiente:

public void guardaDatosDetalle(Int32 iRecibo)
{
string query =@"INSERT INTO tbl_10
VALUES(@NoRecibo,@FPago,@Desc,@Cant);";
NpgsqlCommand cmd = new
NpgsqlCommand(query,CnnRecibo.getConexion());

for (int filas=0;filas<=listaDetalle.Items.Count-1;filas+
+) //ciclo for para recorrer el ListView1
{
cmd.Parameters.AddWithValue("@NoRecibo",iRecibo);
cmd.Parameters.AddWithValue("@FPago",
listaDetalle.Items[filas].SubItems[0].Text);
cmd.Parameters.AddWithValue("@Desc",
listaDetalle.Items[filas].SubItems[1].Text);
cmd.Parameters.AddWithValue("@Cant",
listaDetalle.Items[filas].SubItems[2].Text);
try
{
cmd.ExecuteNonQuery();
}
catch (NpgsqlException ex)
{
PoneMensaje(ex.Message);
}
}
}



Ahora mas que todo, un CONSEJO Y OBSERVACION respecto a lo planteado
anteriormente, ya que según he buscado información, existen
ejemplos de inserción masiva de datos para SQL Server.

O quizas estoy haciendolo de forma incorrecta, de pronto tendria que
hacerlo con un Stored Procedure (Function en PostgreSQL)

Preguntas similare

Leer las respuestas

#1 Leandro Tuttini
20/03/2010 - 21:14 | Informe spam
hola

en principio el codigo pareceria estar bien, pero detecto algo un poco
raro

si puedes hacer uso de procedimiento en tu db seria aun mejor,
igualmente un detalle, noto que el objeto NpgsqlCommand no es
reconstruido por cada cilo del listview, esto hace que los parametros
se pisen, o se agreguen incorrectamente, o es ams me parecio raro que
no lance un error, cuando se inserta el mismo parametro ams de una vez


algo como esto

public void guardaDatosDetalle(Int32 iRecibo)
{
string query = @"INSERT INTO tbl_10 VALUES(@NoRecibo, @FPago, @Desc,
@Cant);";

try
{
foreach(listViewItem item in listaDetalle.Items)
{
using(NpgsqlCommand cmd = new
NpgsqlCommand(query,CnnRecibo.getConexion()))
{
cmd.Parameters.AddWithValue("@NoRecibo",iRecibo);
cmd.Parameters.AddWithValue("@FPago",item.SubItems[0].Text);
cmd.Parameters.AddWithValue("@Desc",item.SubItems[1].Text);
cmd.Parameters.AddWithValue("@Cant",item.SubItems[2].Text);

cmd.ExecuteNonQuery();
}
}
}
catch (NpgsqlException ex)
{
PoneMensaje(ex.Message);
}

}


saludos
Respuesta Responder a este mensaje
#2 Alberto Poblacion
20/03/2010 - 22:39 | Informe spam
"Leandro Tuttini" wrote in message
news:
[...] noto que el objeto NpgsqlCommand no es
reconstruido por cada cilo del listview, esto hace que los parametros
se pisen, [...]
algo como esto
[...]
foreach(listViewItem item in listaDetalle.Items)
{
using(NpgsqlCommand cmd = new
NpgsqlCommand(query,CnnRecibo.getConexion()))



Es preferible crear el command una sola vez fuera del bucle, y dentro
del bucle hacer cmd.Parameters.Clear(). Se tarda menos en hacer el Clear que
en volver a crear el command cada vez.

[...]
cmd.Parameters.AddWithValue("@Desc",item.SubItems[1].Text);



Otra optimización que convendría hacer si se tratase de SQL Server, y me
imagino que con PostgreSql ocurrirá algo parecido: Con los parámetros de
tipo literal, es preferible crear el parámetro especificando su longitud y
después asignarle en Value, en lugar de usar el método AddWithValue. Esta
última instrucción genera un parámetro de longitud distinta por cada
longitud de los datos introducidos, con lo que se poluciona el caché de
procedimientos del servidor, que guarda una entrada de caché distinta por
cada longitud del parámetro en lugar de usar una sola entrada para todas las
sentencias.

Y finalmente, otra posible optimización. Si la inserción es
verdaderamente masiva y hay que insertar muchísimos datos, es preferible
juntar múltiples inserciones en un solo lote en lugar de enviar una Insert
suelta cada vez. Con SqlServer esto se puede hacer automáticamente con el
objeto SqlBulkInsert. Si no existe un objeto equivalente en PostgreSql, la
alternativa consiste en ir concatenando varios Inserts en un string grande,
y cuando haya un número razonable (por ejemplo, 100 inserciones), entonces
ejecutar de golpe ese string largo mediante ExecuteNonQuery. Con SQL Server
la diferencia de rendimiento es considerable, en comparación con el envío de
muchas Inserts sueltas. Nunca he probado con PostgreSql, pero es bastante
probable que el comportamiento sea similar.
Respuesta Responder a este mensaje
#3 Alberto Poblacion
21/03/2010 - 00:38 | Informe spam
"Alberto Poblacion" wrote
in message news:
Es preferible crear el command una sola vez fuera del bucle, y dentro
del bucle hacer cmd.Parameters.Clear(). Se tarda menos en hacer el Clear
que en volver a crear el command cada vez.



Y pido perdón por contestarme a mí mismo, pero se me olvidó mencionar
otra opción que es todavía mejor: definir los parámetros fuera del bucle, y
luego simplemente cambiarles el .Value dentro del bucle.
Respuesta Responder a este mensaje
#4 Mauricio Atanache
23/03/2010 - 03:40 | Informe spam
Para algo como lo que estás intentando hacer, o sea, adicionar registros a
un documento de tipo recibo de pago, éste método que menciona Alberto aquí
es el que yo usualmente utilizo, y funciona bastante bien.


Cordial saludo,


Mauricio Atanache


"Alberto Poblacion"
escribió en el mensaje de noticias:ej#
"Alberto Poblacion" wrote
in message news:
Es preferible crear el command una sola vez fuera del bucle, y dentro
del bucle hacer cmd.Parameters.Clear(). Se tarda menos en hacer el Clear
que en volver a crear el command cada vez.



Y pido perdón por contestarme a mí mismo, pero se me olvidó mencionar
otra opción que es todavía mejor: definir los parámetros fuera del bucle,
y luego simplemente cambiarles el .Value dentro del bucle.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida