2017-08-05 17 views
0

私は 'serverlist.txt'の名前のリストを通って走るプログラムを持っています。 ユーザーは、オプション1またはオプション2を選択して、検索するデータベースを選択します。 プログラムはリスト内のすべての名前を実行し、各名前に関連付けられたIDを提供します。whileループを正しく終了させるには?

名:木星ID:23 名:火星ID:26 名:マーキュリーID:27

これは正常に動作しますが、それは停止しません。リストが完了すると、すべてのものが再びループします。

リストを複数回通過しないようにするにはどうすればよいですか?

import pypyodbc 
import os 

def replaceid(connection, servername): 
    try: 
     cursor = connection.cursor() 

     SQLCommand = ("SELECT Name, Location_ID " 
      "FROM dbo.Server_ID " # table name 
      "with (nolock)" 
      "WHERE Name = ?") 
     Values = [servername] 
     cursor.execute(SQLCommand,Values) 
     results = cursor.fetchone() 
     if results: 

      print (" Name: " + results[0] + " ID: " + str(results[1])) 
      print (" ") 
      locationid(results, connection, servername) 
     else: 
      print (" ID for " + servername + " does not exist.") 
      print (" ") 
      connection.close() 
    except: 
     print("Database is down or you are not connected to network.") 
     exit() 

def start1(): 

    os.system('cls' if os.name == 'nt' else 'clear') 
    array = [] 
    local = input('\n\n Type option 1 or 2: ') 
    while True: 
     with open("serverlist.txt", "r") as f: 
      for servername in f: 
       try:     

        if local in ['1']: 
         connection = pypyodbc.connect('Driver={SQL Server};Server=db1;Database=WinOasis;Trusted_Connection=yes;') 
        elif local in ['2']: 
         connection = pypyodbc.connect('Driver={SQL Server};Server=db2;Database=WinOasis;Trusted_Connection=yes;') 
        else: 
         return 
       except pypyodbc.Error as ex: 
        sqlstate = ex.args[0] 
        if sqlstate == '28000': 
         print ("You do not have access.") 

       replaceid(connection, servername.strip()) 
    return 

start1() 
+0

'grab'と' replaceid'関数はどこで使われていますか? – Cuber

+1

申し訳ありませんが、訂正しました。私がここに貼り付けるプログラムを短くしていたとき、その言葉の一つが混ざってしまった。 – Prox

+1

コードを一度しか実行しない場合は、なぜループを使用するのですか? – Blckknght

答えて

3

3行目から最後の行までのreturn文は、1段階インデントする必要があると思います。それ以外の場合、Trueは常に真であるため、whileループは永遠に実行されます。

0

あなたは例外句が終了した後は、また、break文をお勧めしますstart1()

replaceid(connection, servername.strip())を呼び出した後、break文を追加することもできます。

関連する問題