Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-10-2015
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 68
Poder: 13
aromigaret Va por buen camino
Pasar un .dbf en un directorio a un db sql

Hola, mi problema es el siguiente: Se descargan en un directorio via FTP, varias tablas con formato .dbf. Los nombres de dichas tablas son distintos en cada descarga. Necesito pasar el contenido de las tablas descargadas, a un sql server 2008 conservando el nombre de cada tabla. Todas tienen los mismos campos.

Primero genero la tabla en la db, usando una auxiliar que se encuentra en la db del sql server que tiene el mismo formato que las tablas a pasar:

Código Delphi [-]
 PASAJE.SQL.Text:='SELECT TOP 0 * INTO ' + ARCHIVO + ' FROM AUXILIAR';  
 PASAJE.ExecSQL;


y luego no se como copiar el contenido en esta nueva base creada.

Probe creando un procedimiento almacenado y no funciona:

Código Delphi [-]
        PROCEDIMIENTO.ProcedureName:='VOLCAR';
        PROCEDIMIENTO.Parameters.Refresh;
        PROCEDIMIENTO.Parameters.ParamByName('@ARCHIVO').Value:= QUOTEDSTR('C:\Pedidos\' + ARCHIVO);
        PROCEDIMIENTO.Parameters.ParamByName('@PEDIDO').Value:= COPY(ARCHIVO,1,20) ;
        PROCEDIMIENTO.ExecProc;


y el procedimiento en el server sql es :
Código SQL [-]
ALTER PROCEDURE VOLCAR
  -- Add the parameters for the stored procedure here
  @ARCHIVO NVARCHAR(200),
  @PEDIDO NVARCHAR(20)
AS
BEGIN
   DECLARE @comando NVARCHAR(400)   
   
   SET @comando = 'BULK INSERT DBO.' + @PEDIDO + ' FROM ' + @ARCHIVO + 
     ' WITH (FIELDTERMINATOR = ''|'',ROWTERMINATOR = ''|\n'')'
         
EXEC SP_EXECUTESQL @COMANDO

Si alguien sabe como resolverlo se los agradeceria.

Última edición por ecfisa fecha: 09-10-2015 a las 04:16:19. Razón: Ajustar código al ancho de visualización
Responder Con Cita
  #2  
Antiguo 09-10-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.271
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿Lo que no funciona es el procedimiento en si, o la llamada?
¿Si ejecutas el procedimiento manualmente funciona?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 09-10-2015
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 68
Poder: 13
aromigaret Va por buen camino
Neftalí, gracias por responder. El error lo devuelve el SP, ya que la creación de la tabla y el llamado al SP junto con los parámetros funciona. Estuve investigando mas sobre el tema y vi que existe la función openrowset(), pero no se si es el camino, ya que las pruebas que hice en forma manual es:

Código SQL [-]
DECLARE @sql char(150) 
DECLARE @Driver sysname 
DECLARE @Cadena sysname 
DECLARE @Sentencia sysname 

SET @Driver= '''' + 'Microsoft.Jet.OLEDB.4.0' + '''' 
SET @Cadena= '''' + 'Dbase IV; c:\pedidos\PE069100000810182341.dbf' + '''' 
SET @Sentencia= '''' + 'SELECT * FROM PE069100000810182341' + '''' 

SET @sql='select * FROM OPENROWSET(' + @Driver + ', ' + @Cadena + ', ' + @Sentencia + ')' 

execute (@sql)

y me tira el siguiente error:

El proveedor OLE DB "Microsoft.Jet.OLEDB.4.0" del servidor vinculado "(null)" devolvió el mensaje "Argumento no válido.".
Mens. 7303, Nivel 16, Estado 1, Línea 1
No se puede inicializar el objeto de origen de datos del proveedor OLE DB "Microsoft.Jet.OLEDB.4.0" para el servidor vinculado "(null)".


Hasta ahora lo único que se me ocurre es usar dos adoconnection una que apunte al sql server y otra a una query que cargue una por una las bases que se descarguen y luego ver como pasar los datos de esa query al sql server, pero me parece un cuento chino. Por eso busco algo mas rápido y directo.
Responder Con Cita
  #4  
Antiguo 10-10-2015
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 68
Poder: 13
aromigaret Va por buen camino
Despues de mucho investigar encontre la solucion. La dejo por si alguien lo necesita. Es para Sql server 2008 en adelante

Primero hay que ejecutar en sql

sp_configure 'show advanced options', 1
reconfigure
go
exec sp_configure 'Ad Hoc Distributed Queries',1
go
reconfigure
go

Esto es para habilitar la opcion Ad Hoc la cual permite la comunicacion con entornos externos de sql

Luego escribir para crear el procedimiento almacenado

Código SQL [-]
CREATE PROCEDURE [dbo].[VOLCAR]
  @ARCHIVO NCHAR(30),          -- NOMBRE DEL .DBF A ACCEDER
  @PATH NCHAR(20),               -- DIRECTORIO DONDE SE ENCUENTRA  POR EJEMPLO 'C:\PEDIDOS\'
  @PEDIDO NCHAR(50)             -- TABLA DONDE DESCARGAR EL CONTENIDO DE  @ARCHIVO
    
AS
BEGIN 
  DECLARE @sql char(400) 
  DECLARE @Driver sysname 
  DECLARE @Cadena sysname 
  DECLARE @Sentencia CHAR(100)
  
  SET NOCOUNT ON;  
  
  EXECUTE ('CREATE TABLE '+ @PEDIDO + '(CANTIDAD NUMERIC(8,2),ARTICULO NCHAR(60), MARCA NCHAR(15), CODIGONUM NCHAR(5))')  
  
  SET @Driver= '''' + 'Microsoft.Jet.OLEDB.4.0' + '''' 
  SET @Cadena= '''' + 'dBase IV; HDR=NO;IMEX=2; DATABASE=' + @PATH + ''''   
  SET @Sentencia= '''' + 'SELECT CANTIDAD,ARTICULO,MARCA,CODIGONUM FROM ' + @ARCHIVO + ''''    
  SET @sql='INSERT INTO ' + @PEDIDO + ' select * FROM OPENROWSET(' + @Driver + ', ' + @Cadena + ', ' + @Sentencia + ')' 
  
  execute (@sql)

y el llamado del procedimeinto desde Delphi es :

Código Delphi [-]
        PROCEDIMIENTO.ProcedureName:='VOLCAR';
        PROCEDIMIENTO.Parameters.Refresh;
        PROCEDIMIENTO.Parameters.ParamByName('@PATH').Value:= 'c:\pedidos\';          // DIRECTORIO DONDE SE ENCUENTRA LA TABLA .DBF
        PROCEDIMIENTO.Parameters.ParamByName('@ARCHIVO').Value:= ARCHIVO_DBF;   // CON LA EXTENSION .DBF INCLUIDA EN EL NOMBRE EJEMPLO 'BASE.DBF'
        PROCEDIMIENTO.Parameters.ParamByName('@PEDIDO').Value:= MIBASENUEVA ;   // LA TABLA DONDE SE GUARDARA LOS DATOS DE LA 'BASE.DBF'
        PROCEDIMIENTO.ExecProc;

Espero que le sea util a alguien.
Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ver los directorio de un FTP kurono Varios 3 08-09-2010 06:32:04
ocultar Directorio shoulder Varios 2 15-04-2008 04:45:55
Directorio virtual Roilo Internet 4 21-06-2007 22:51:48
Descompartir Directorio Ledian_Fdez API de Windows 1 09-11-2006 00:02:13
Guardar directorio Fat Varios 5 25-07-2006 19:42:12


La franja horaria es GMT +2. Ahora son las 02:04:33.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi