2012-12-03 11 views
1

내 저장 프로 시저가 올바르게 작동하지만 파이썬 스크립트가 내 다운로드 파일로 저장 프로 시저를 완전히 실행하지 못합니다. python 스크립트의 목적은 ftp를 사용하여 파일을 다운로드하고 파일을 로컬에 저장하는 것입니다. 먼저 원격 위치와 로컬 위치를 비교하여 새 파일을 찾은 다음 새 파일을 로컬 위치로 다운로드합니다. 그런 다음 새 파일 각각에 대해 저장 프로 시저를 실행합니다.내 python 스크립트가 내 저장된 프로 시저를 완전히 실행하지 않습니다

파이썬 스크립트 : SQL Server에

import os 
import ftplib 
import pyodbc 

연결 * CONN = pyodbc.connect ('DRIVER = {SQL 서버}; SERVER = localhost를; DATABASE = 개발; UID = 대한 myid; PWD = mypassword ') 커서 = conn.cursor()

ftp = ftplib.FTP("myftpaddress.com") 
ftp.login("loginname", "password") 
print 'ftp on' 

#directory listing 
rfiles = ftp.nlst() 
print 'remote listing' 

#save local directory listing to files 
lfiles = os.listdir(r"D:\Raw_Data\myFiles") 
print 'local listing' 

#compare and find files in rfiles but not in lfiles 
nfiles = set(rfiles) - set(lfiles) 
nfiles = list(nfiles) 
print 'compared listings' 

#loop through the new files 
#download the new files and open each file and run stored proc 
#close files and disconnect to sql server 
for n in nfiles: 
    local_filename = os.path.join(r"D:\Raw_Data\myFiles",n) 
    lf = open(local_filename, "wb") 
    ftp.retrbinary("RETR " + n, lf.write, 1024) 
    lf.close() 
    print 'file written' 
    cursor.execute("exec SP_my_Dailyfiles('n')") 
    conn.close() 
    lf.close() 
    print 'sql executed' 


ftp.quit() 

저장된 프로 시저 :

ALTER PROCEDURE [dbo].[SP_my_Dailyfiles] 
    -- Add the parameters for the stored procedure here 
@file VARCHAR(255) 
-- Add the parameters for the stored procedure here 

AS 
BEGIN 


IF EXISTS(SELECT * FROM sysobjects WHERE name = 'myinvoice') 
DROP TABLE dbo.myinvoice 
---------------------------------------------------------------------------------------------------- 
CREATE TABLE myinvoice(

    [Billing] varchar(255) 
    ,[Order] varchar(45) 
    ,[Item] varchar(255) 
    ,[Quantity in pack] varchar(255) 
    ,[Invoice] varchar(255) 
    ,[Date] varchar(255) 
    ,[Cost] varchar(255) 
    ,[Quantity of pack] varchar(255) 
    ,[Extended] varchar(255) 
    ,[Type] varchar(25) 
    ,[Date Due] varchar(255) 

) 

----------------------------------------------------------------------------------------------------    
DECLARE @SourceDirectory VARCHAR(255) 
DECLARE @SourceFile VARCHAR(255) 



EXEC (' BULK 
    INSERT dbo.myinvoice 
    FROM ''D:\Raw_Data\myfile\'[email protected]+''' 
    WITH 
    (
     FIRSTROW = 1, 
     FIELDTERMINATOR = '','', 
     ROWTERMINATOR = ''0x0a'' 
    )' 
) 
------------------------------------------------------------------------------------------------------------- 


INSERT INTO [Development].[dbo].[my_Dailyfiles](

    [Billing] 
    ,[Order] 
    ,[Item] 
    ,[Quantity in pack] 
    ,[Invoice] 
    ,[Date] 
    ,[Cost] 
    ,[Quantity of pack] 
    ,[Extended] 
    ,[Type] 
    ,[Date Due] 
    ,[FileName] 
    ,[IMPORTEDDATE] 

    ) 
    SELECT 

     replace([Billing], '"', '') 
      ,replace([Order], '"', '') 
      ,replace([Item], '"','') 
      ,replace([Quantity in pack],'"','') 
      ,replace([Invoice],'"','') 
      ,cast(replace([Date],'"','') as varchar(255)) as date 
      ,replace([Cost],'"','') 
      ,replace([Quantity of pack],'"','') 
      ,replace([Extended],'"','') 
      ,replace([Type],'"','') 
      ,cast(replace([Date Due],'"','') as varchar(255)) as date 
      ,@file, 
      GetDate()  


FROM [myinvoice] WHERE [Bill to] <> ' ' and ndc != '"***********"' 

답변

0

나는 여전히 루프에있는 동안 저장 프로 시저를 실행 한 직후 DB 연결을 닫는 것이 문제라고 생각합니다.

이것은 루프를 두 번째로 의미하므로 SP를 실행하려고하면 DB 연결이 닫힙니다. 실제로 루프 주위에 두 번째 오류가 발생할 것으로 예상 할 것이다. 많은 사이먼은 ... 그것은 it.im 좋은 지금 가야 고정

conn = pyodbc.connect(...) 
for n in nfiles: 
    ... 
    cursor = conn.cursor() 
    cursor.execute("exec SP_my_Dailyfiles('n')") 
    conn.commit() 
+0

감사 :이 구조 것

방법은 같은 것입니다. –

+0

이것이 맞는 대답이라면 올바른 대답으로 받아 들일 수 있습니다. –

관련 문제