2011-06-16 14 views
1

私は、ceODBCというモジュールを使用してPython3で作業しており、SQL Server 2005でストアドプロシージャを呼び出そうとしています.Sql Server Management Studio(ストアドプロシージャをPythonに関係なく)から実行すると、正しい結果と278行が目的のテーブルに挿入されますが、Pythonでは31より後に停止します。なぜ誰かがストアドプロシージャが途中で停止しているのかもしれないと教えてもらえますか?ここに私のPythonのコードは次のとおりです。ストアドプロシージャをPythonから実行する

import ceODBC 
connect=ceODBC.connect("""DSN=mydatabase;SERVER=xxx.xxx.x.xxx; 
DRIVER={SQLServer};UID=user;PWD=password""", autocommit= True) 
cursor = connect.cursor() 
cursor.execute(""" 
        CREATE TABLE mydatabase.dbo.Vision_TempTable 
        (
        CustId bigint, 
        PayProcId int, 
        WebUserId bigint, 
        SubTypeId bigint, 
        PayAmt decimal(18,2), 
        Paydate datetime, 
        PayType varchar(1), 
        DateCreated datetime, 
        PayStatus varchar(1), 
        Account varchar(30), 
        V_Account varchar(30) 
        )""")#Create a temp table which will be used in the SP insert 
connect.commit() 
f=open('F:/clients/UTA/Vision/Data/ExternalPay_Data/lbox.txt') 
CUST_ID=44 
PAYPROCID=4 
SUBTYPE_ID=64 
WEBUSER_ID=2432 
PAYTYPE='C' 
PAYSTATUS='J' 
for line in f: #parse a text file and insert values into temp table I just created 
    lineLength=len(line.strip()) 
    if lineLength>=49: 
     visionAccount=int(line[10:17]) 
     visionAccount=str(visionAccount) 
     recipientID=line[17:29] 
     invoiceAmount=line[31:39] 
     invoiceAmount=float(invoiceAmount) 
     pmtType=line[39:41]#make sure it will always be ck 
     pmtDate=line[45:47]+'/'+line[47:49]+'/'+line[41:45] 
     cursor.execute("""INSERT INTO mydatabase.dbo.Vision_TempTable 
          (CustId,PayProcId,WebUserId,SubTypeId,PayAmt,Paydate, 
          PayType,DateCreated,PayStatus,Account,V_Account) 
          VALUES 
           (?,?,?,?,?,?,?,GETDATE(),?,?,?)""", 
       CUST_ID,PAYPROCID,WEBUSER_ID,SUBTYPE_ID, 
       invoiceAmount,pmtDate,PAYTYPE,PAYSTATUS,recipientID,visionAccount) 

     connect.commit() 
cursor.callproc("mydatabase.dbo.VisionExternalPMTS")# turn over control to SP 

f.close() 
connect.close() 
print('Done') 

とちょうどそう、私たちは全体像を持っている私は、以下のストアドプロシージャが含まれます:

USE [mydatabase] 
GO 
/****** Object: StoredProcedure [dbo].[VisionExternalPMTS] Script Date: 06/16/2011 08:38:15 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[VisionExternalPMTS] as 

BEGIN 
declare @custid bigint, 
@payprocid int, 
@webuserid bigint, 
@subtypeid bigint, 
@payamt decimal(18,2), 
@paydate datetime, 
@paytype varchar(1), 
@datecreated datetime, 
@paystatus varchar(1), 
@account varchar(30), 
@v_account varchar(30) 

DECLARE update_webPayments CURSOR for --select from temp table created in python 
SELECT CustId,PayProcId,WebUserId,SubTypeId,PayAmt,Paydate,PayType, 
     DateCreated,PayStatus 
FROM Vision_TempTable 

OPEN update_webPayments 

FETCH NEXT FROM update_webPayments INTO @custid,@payprocid,@webuserid, 
       @subtypeid,@payamt,@paydate,@paytype,@datecreated, 
       @paystatus 

WHILE @@fetch_status = 0 --insert into target table 
    BEGIN 
     INSERT INTO WEBPAYMENTS(CUSTID,PAYPROCID,WEBUSERID,SUBTYPEID, 
           PAYAMT,PAYDATE,PAYTYPE,DATECREATED,PAYSTATUS) 
     VALUES (@custid,@payprocid,@webuserid,@subtypeid,@payamt, 
       @paydate,@paytype,@datecreated,@paystatus) 
     FETCH NEXT FROM update_webPayments INTO @custid,@payprocid,@webuserid, 
        @subtypeid,@payamt,@paydate,@paytype,@datecreated, 
        @paystatus       
    END 
--DROP TABLE VISION_TempTable 
END 

いつも私は278を得る仕事のPythonからtable文と初期のインサートを作成します私の一時テーブル内の行は、私がストアドプロシージャをPythonから呼び出すときにのみ間違っていることになります。ストアドプロシージャは早期に終了します。これはPythonがプログラムが終了する前に実行するのに十分な時間が与えられていない可能性があるためだと思っていたので、何らかのカウンターを置いてみましたが、ストアドプロシージャは正常に動作しましたがデータベースエラーが発生しました。カウンタ。私が欲しいのは、ストアドプロシージャに制御を渡し、ストアドプロシージャが完了するまで、Pythonプログラムに戻らないことです。どんな助けでも大歓迎です。 http://ceodbc.sourceforge.net/html/cursor.htmlを見ると

おかげ

答えて

1

このコメントがあります:

Cursor.execdirect(ステートメント)

は、SQLExecDirectの代わりのSQLExecuteのを使用してデータベースに対して文を実行します。これは、特定のストアドプロシージャを呼び出すときにSQL Server ODBCドライバが表示するようなODBCドライバのバグにより、状況によっては必要です。 ステートメントがクエリの場合、カーソルはイテレータプロトコルを実装しているため便利です。したがって、適切なフェッチメソッドの1つを呼び出す必要はありません。それ以外の場合はNoneが返されます。

SQL Server ODBC経由のストアドプロシージャでは、ある種の狂気のような音が出ます(特別な処理のためにそれを1つにまとめたもの)。試してみる必要があります:

cursor.execdirect("mydatabase.dbo.VisionExternalPMTS") 

私はそれが動作するかどうかを教えてください。

+1

ありがとう、私はまた、ドキュメントでそれを読んで、それを昨日試しましたが、私は彼らがドキュメントページで詳細には入っていないので、私は正しいパラメータを使用していると確信していません。私はexecdirectメソッドを試してもデータベースの構文エラーが出てきます。私はexecdirect文の構文を見渡し、正しい組み合わせが得られるかどうかを試してみました。 – cloud311

+0

私は何をしていても、これを動作させることはできません!それはいつも私の早い段階で終わる。 – cloud311

関連する問題