私は、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を見ると
おかげ
ありがとう、私はまた、ドキュメントでそれを読んで、それを昨日試しましたが、私は彼らがドキュメントページで詳細には入っていないので、私は正しいパラメータを使用していると確信していません。私はexecdirectメソッドを試してもデータベースの構文エラーが出てきます。私はexecdirect文の構文を見渡し、正しい組み合わせが得られるかどうかを試してみました。 – cloud311
私は何をしていても、これを動作させることはできません!それはいつも私の早い段階で終わる。 – cloud311