1

私の要件は、sqlcmd プロセスを開始し、そのプロセスに sql ステートメントをフィードして、そのシナリオで生成された出力を取得する必要があることです。sqlライブラリを使用してsqlcmdを実行するように提案する前に、私にはそれができないことを伝えさせてください.sqlcmdのみを使用してこれを実装する必要があります.

ここに私の現在のコードがあります

from subprocess import Popen, PIPE

def ms_sql_session():
    IP = "xxxx"
    port = '1433'
    username = 'sa'
    password = 'abc'
    connString = 'sqlcmd -S tcp:%s,%s -dmaster -U%s -P%s ' %(IP, port, username, password)

    try:
        session = Popen(connString, stdin=PIPE, stdout=PIPE, stderr=PIPE)
        str_cmd = '''select @@version;
        go
        '''
        session.stdin.write(str_cmd)
        stdout, stderr = session.communicate()
        print stdout
        print stderr
        str_cmd = '''select @@version;
        go
        '''
        session.stdin.write(str_cmd)
        #stdout, stderr = session.communicate()
        print stdout
        print stderr
        str_cmd = '''select @@version;
        go'''
        session.stdin.write(str_cmd)
        #stdout, stderr = session.communicate()
        print stdout
        print stderr
        return True
    except Exception, e:
        print str(e)
        return False

ms_sql_session()

3 つのステートメントを実行して o/p を取得しようとしていますが、2 番目の stdin.write 操作で例外が発生します

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86) 
    Dec 10 2010 10:56:29 
    Copyright (c) 1988-2005 Microsoft Corporation
    Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 2)


(1 rows affected)


I/O operation on closed file

これは私のコードの出力です。

4

1 に答える 1

0

そのためにシステムコマンドを使用するのはなぜですか? そのためにSQLライブラリを使用することをお勧めします...

于 2013-11-06T06:59:22.613 に答える