Foros del Web » Programando para Internet » ASP Clásico »

Insertar Varios Registros(pero Desde Un Archivo)

Estas en el tema de Insertar Varios Registros(pero Desde Un Archivo) en el foro de ASP Clásico en Foros del Web. Hola a todos, tengo una gran duda. Vereís. Tengo mi pagina alojada en un servidor remoto. En este servidor tengo una BBDD Oracle, la cual ...
  #1 (permalink)  
Antiguo 21/02/2007, 12:06
 
Fecha de Ingreso: septiembre-2006
Mensajes: 54
Antigüedad: 18 años, 1 mes
Puntos: 0
Insertar Varios Registros(pero Desde Un Archivo)

Hola a todos, tengo una gran duda. Vereís. Tengo mi pagina alojada en un servidor remoto. En este servidor tengo una BBDD Oracle, la cual tengo que actualizar. No toda la base, sólo dos tablas, pero tengo que borrar todos los registros que hay e introducirlos de nuevo. El Hosting en el que estoy no tiene administración para la BBDD, así que creo que se tiene que hacer por código (ASP).
Los nuevos registros serán creados en FileMaker otra BBDD y el resultado sólo lo puedo exportar a CSV (texto separado por comas) Con lo que me quedará un archivo con un montón de registros.
Este archivo supongo que se podrá exportar a SQL de alguna manera, no sé...

Mi idea:
Hacer un script que lea este archivo(en ASP) (pasado o no a SQL) y que haga una inserción masiva de todos los registros.

Pero mi problema sigue...

No sólo tengo que hacer la inserción multiple de estos registros en esa tabla, si no que ademas hay otra tabla que estavinculada a esta por su id y también quisiera insertar sus correspondientes campos.

ej:

TABLA 1 (id,NOMBRE,APELLIDO)
TABLA 2 (ID_TABLA1,AFICIONES)

NO SÉ SI HE DICHO ALGO COHERENTE, ES TARDE Y LLEVO TODO EL DIA DANDOLE VUELTAS.

GRACIAS POR VUESTRA AYUDA DE ANTEMANO
  #2 (permalink)  
Antiguo 22/02/2007, 05:05
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 18 años, 10 meses
Puntos: 7
Re: Insertar Varios Registros(pero Desde Un Archivo)

A ver si me he enterado... ¿Tienes que leer desde un archivo CSV y guardar dichos datos en una BD Oracle?

Si es asi, tienes muchas opciones para hacerlo. Creo recordar que la separacion de campos en un CVS es por comas y la de registros es por salto de linea. Asi que la oprativa que yo haria seria (mas o menos)

- SI ES ORACLE CREO QUE ACEPTA TRANSACCIONES
<!-- añadir directiva @Transaction=Required -->

- Abrir acceso a BD (todo eso del Connection, etc)

- Abrir archivo (Scripting.FileSystemObject)
- leeria linea a linea (ReadLine)
- Array a lo leido con split separandondolo con punto y coma (Split texto,";")

- Implementar objeto ObjectContext para la grabacion de datos en las dos tablas dependientes (commit / Abort -el rollback de toda la vida ): commit si todo ha ido bien, abort si falla algo.

- bucle a leer del archivo

- cierro objetos

Es una idea. Espero haberte servido

Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #3 (permalink)  
Antiguo 22/02/2007, 09:33
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 18 años, 10 meses
Puntos: 7
Transacciones en ASP

Código:
<%
Set con = Server.CreateObject("ADODB.Connection")
Set rs =  Server.CreateObject("ADODB.RecordSet")
 
' connectionstring a la bd de oracle (que soporta transacciones
' a traves de ODBC)
con.open "cadenadeconexion"
 
' Para el archivo
Set ofiles = Server.CreateObject("Scripting.FileSystemObject") 
set ofile = ofiles.getFile("archivoaabrir.cvs")
Set ts = ofile.OpenAsTextStream(ofile, 1)
 
on error resume next
 
Do while not ts.AtEndOfStream
    con.BeginTrans
    arrFields = split(ts.ReadLine,";")
   if isArray(arrFields) then   
' Suponemos que los registros vienen en el orden requerido 
con.execute("INSERT INTO TABLA1 VALUES ('','" & arrFields(0) & "','" & arrFields(1) & "')"
  if con.errors.count <> 0 then 
         con.rollback
         exit do      
  end if
' No se cual es la funcion equivalente en Oracle
set rs = con.execute("SELECT LASTINSERTID() AS Y")
if not rs.EOF then
con.execute("INSERT INTO TABLE2 VALUES (" & rs("Y") & ",'" & arrFields(2) & "')")
end if
set rs = nothing
  if con.errors.count <> 0 then 
         con.rollback
         exit do      
  end if
  end if
con.commitTrans
loop
 
err.clear()
on error goto 0
ts.close
set ofile = nothing
set ofiles = nothing
set rs = nothing
set con = nothing
 
%>
Poderoso ASP en operaciones transaccionales

No he usado ObjectContext aqui pues no se requiere grandes transacciones. Si deseas saber mas sobre este magnifico objeto ASP y su relacion con el MTS del IIS mira esta página:

http://www.hospedajeydominios.com/ma...ina-asp12.html

Es una buena forma de comenzar a conocerlo y su uso puede implicar a varias BDs, Tablas, Updates y Inserts. O sea, a TODA una página web ASP. Es mucho mas efectivo que las transacciones del objeto Connection y más segura ya que implica al IIS en la transaccion.



Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -

Última edición por tammander; 22/02/2007 a las 09:57
  #4 (permalink)  
Antiguo 07/03/2007, 07:27
 
Fecha de Ingreso: septiembre-2006
Mensajes: 54
Antigüedad: 18 años, 1 mes
Puntos: 0
Insertar Varios Registros(pero Desde Un Archivo)

Hola a todos, he probado el código expuesto por Tammander, pero no consigo que funcione.

Código:
Aqui CONEXIÓN con la BD.
Esto no me preocupa ya que he comprobado que funciona
A continuación muestro como he adaptado el código:

Código:
set RS=Server.CreateObject("ADODB.Recordset")



Set ofiles = Server.CreateObject("Scripting.FileSystemObject")
set ofile = ofiles.getFile(Server.MapPath("mi-archivo.csv"))
Set ts = ofile.OpenAsTextStream(1, -2)*Nota
*Nota:

Cita:
'Aqui, en ts=... he cambiado lo que tu pusiste, ya que he leido lo siguiente:


Método OpenAsTextStream

Abre un archivo especificado y devuelve un objeto TextStream que se puede utilizar para leer, escribir o agregar en el archivo.

objeto.OpenAsTextStream([modoES, [formato]])



Valores

El argumento modoES puede tener cualquiera de los siguientes valores:
Constante Valor Descripción
ForReading 1 Abrir un archivo sólo para lectura. No puede escribir en este archivo.
ForWriting 2 Abrir un archivo para escritura. Si existe un archivo con el mismo nombre, se sobreescribe su contenido anterior.
ForAppending 8 Abrir un archivo y escribir al final del archivo.

El argumento format puede tener alguno de los siguientes valores:
Constante Valor Descripción
TristateUseDefault -2 Abre el archivo utilizando el valor predeterminado del sistema.
TristateTrue -1 Abre el archivo como Unicode.
TristateFalse 0 Abre el archivo como ASCII.
Continuamos despues del inciso

Código:
on error resume next

Do while not ts.AtEndOfStream
Conn.BeginTrans
arrFields = split(ts.ReadLine,";")
if isArray(arrFields) then


sql = "INSERT INTO MI-TABLA (ID_R,NOMBRE-RESTARANTE, SITUACION, CLASE, CANTIDAD, IMAGEN, IMAGEN2, IMAGEN3, PAGAN, PAGEXTRA, MICROSITE) VALUES ('" & arrFields(0) & "','" & arrFields(1) & "','" & arrFields(2) & "','" & arrFields(3) & "','" & arrFields(4) & "','" & arrFields(5) & "','" & arrFields(6) & "','" & arrFields(7) & "','" & arrFields(8) & "','" & arrFields(9) & "','" & arrFields(10) & "')"
con.execute(sql)
if Conn.errors.count <> 0 then
Conn.rollback
exit do
end if

' No se cual es la funcion equivalente en Oracle
'yo creo que está aquí el problema, pero no sé como se puede recoger el ID 'del primer INSERT para usarlo en el segundo

set RS = Conn.execute("SELECT LASTINSERTID() AS Y")
if not RS.EOF then
sql2 = "INSERT INTO DESC_RES (ID_R,IDIOMA,DESCRIPCION) VALUES (" & rs("Y") & ",'" & arrFields(11) & "','" & arrFields(12) & "')"
Conn.execute(sql2)
end if
set RS = nothing
if Conn.errors.count <> 0 then
Conn.rollback
exit do
end if

end if

Conn.commitTrans
loop

err.clear()
on error goto 0
ts.close
set ofile = nothing
set ofiles = nothing
'set Rs = nothing
'set Conn = nothing




response.write("query restaurante: "&sql)
response.write("<BR>Query Descripci&oacute;: "&sql2)
'rs.close()
'Conn.close()
%>
Aquí muestro el Archivo del que leo los datos:
'
Cita:
402667','Mi Restaurante j', '122', '94', '7', 'abrasas.gif', 'abrasas.gif','abrasas.gif', '', '', '','1','<b>Nombre:</b> Mi Resturante f<br><b>Direcci&oacute;n:</b> Direcci&oacute;n de Mi Restaurante f';
'402668','Mi Restaurante k', '122', '94', '7', 'abrasas.gif', 'abrasas.gif','abrasas.gif', '', '', '','1','<b>Nombre:</b> Mi Resturante g<br><b>Direcci&oacute;n:</b> Direcci&oacute;n de Mi Restaurante g';
'402669','Mi Restaurante l', '122', '94', '7', 'abrasas.gif', 'abrasas.gif','abrasas.gif', '', '', '','1','<b>Nombre:</b> Mi Resturante h<br><b>Direcci&oacute;n:</b> Direcci&oacute;n de Mi Restaurante h';
'402670','Mi Restaurante m', '122', '94', '7', 'abrasas.gif', 'abrasas.gif','abrasas.gif', '', '', '','1','<b>Nombre:</b> Mi Resturante i<br><b>Direcci&oacute;n:</b> Direcci&oacute;n de Mi Restaurante i';
Por favor, si alguien sabe decirme los fallos de este código, se lo agradecería

Un saludo
  #5 (permalink)  
Antiguo 08/03/2007, 02:10
 
Fecha de Ingreso: septiembre-2006
Mensajes: 54
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Insertar Varios Registros(pero Desde Un Archivo)

Por favor, alguien le puede echar un vistazo. Es algo que me corre bastante prisa.

Gracias
  #6 (permalink)  
Antiguo 12/03/2007, 02:12
 
Fecha de Ingreso: septiembre-2006
Mensajes: 54
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Insertar Varios Registros(pero Desde Un Archivo)

Hola, soy yo de nuevo. Sólo deciros que cualquier idea será bien acogida.

Gracias
  #7 (permalink)  
Antiguo 13/03/2007, 05:04
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 18 años, 10 meses
Puntos: 7
Re: Insertar Varios Registros(pero Desde Un Archivo)

Obtener el ultimo ID de un campo autonumérico en Oracle es el problema. En MySQL existe la opcion auto_increment. En MSSQL es IDENTITY(1,1) (desde el registro 1, aumenta de uno en uno) Pero en Oracle no existen estas opciones de campo. Existen las secuencias pero no tengo ni idea como se implementan.

Investiga en San Google Seguro que algo encontraras y sustituye la sentencia SQL por la conveniente en Oracle.

Siento no poder ayudarte mas :(


Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #8 (permalink)  
Antiguo 13/03/2007, 05:33
 
Fecha de Ingreso: septiembre-2006
Mensajes: 54
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Insertar Varios Registros(pero Desde Un Archivo)

Gracias Tammander, lo que haré será preguntar en el foro de oracle. Si a alguien le interesa este problema, lo puede seguir en ese foro. Voy a abrir un tema allí con el título.

Cita:
Averiguar el ID del último registro insertado en una tabla para...
Saludos

Última edición por judes; 13/03/2007 a las 05:58
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 04:48.