2

ストアド プロシージャは単独では正常に動作しますが、Python スクリプトは、ダウンロードしたファイルを使用してストアド プロシージャを完全に実行できません。Python スクリプトの目的は、ftp を使用してファイルをダウンロードし、ファイルをローカルに保存することです。最初にリモートの場所とローカルの場所を比較して新しいファイルを見つけ、次に新しいファイルをローカルの場所にダウンロードします。次に、新しいファイルごとにストアド プロシージャを実行します。

Python スクリプト:

import os
import ftplib
import pyodbc

SQL サーバーへの接続* conn = pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;DATABASE=Development;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\'+@file+'''
    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 != '"***********"'
4

1 に答える 1

1

問題は、ストアド プロシージャを実行した直後に、まだループ中に DB 接続を閉じていることだと思います。

これは、2 回目のループでは、SP を実行しようとすると DB 接続が閉じられることを意味します。実際には、ループの 2 番目にエラーがスローされると予想されます。

これを構造化する方法は次のようなものです。

conn = pyodbc.connect(...)
for n in nfiles:
    ...
    cursor = conn.cursor()
    cursor.execute("exec SP_my_Dailyfiles('n')")
    conn.commit()
于 2012-12-03T15:28:51.457 に答える