2013-10-13 62 views
0

我試圖讓服務器從SQL數據庫中讀取int'rank',但是我得到了「使用未分配的本地變量」,因爲它沒有讀取'rank '直到它應該被設置在while語句中,但是我無法將其移出,因爲它在進入try和catch之前不會執行SQL Query。使用未分配的本地變量 - SQL + C#

具體位置:

using (var rdr = cmd.ExecuteReader()) 
      { 
       while (rdr.Read()) 
       rank = rdr.GetInt32("rank"); 
      } 

的完整代碼:

class Ban : ICommand 
{ 
    public string Command { get { return "ban"; } } 
    public int RequiredRank { get { return 3; } } 

    public void Execute(Player player, string[] args) 
    { 
     int rank; 
     string name = "'" + args[0] + "'"; 
     if (args.Length == 0) 
     { 
      player.SendHelp("Usage: /ban <username>"); 
     } 
     try 
     { 
      using (Database dbx = new Database()) 
      { 
       var cmd = dbx.CreateQuery(); 
       cmd.CommandText = "SELECT rank FROM accounts where [email protected]"; 
       cmd.Parameters.AddWithValue("@name", name); 
       cmd.ExecuteNonQuery(); 
       using (var rdr = cmd.ExecuteReader()) 
       { 
        while (rdr.Read()) 
        rank = rdr.GetInt32("rank"); 
       } 
       Console.Write("{0} ({1}) tried to ban {2}({3})", player.Name, player.Client.Account.Rank, name, rank); 
       if (rank < player.Client.Account.Rank) 
       { 
        var cmda = dbx.CreateQuery(); 
        cmda.CommandText = "UPDATE accounts SET banned=1, rank=0 WHERE [email protected]"; 
        cmda.Parameters.AddWithValue("@name", args[0]); 
        if (cmda.ExecuteNonQuery() == 0) 
        { 
         player.SendInfo("Could not ban"); 
        } 
        else 
        { 
         foreach (var i in player.Owner.Players) 
         { 
          if (i.Value.nName.ToLower() == args[0].ToLower().Trim()) 
          { 
           i.Value.Client.Disconnect(); 
           player.SendInfo("Account successfully Banned"); 
           Console.ForegroundColor = ConsoleColor.Yellow; 
           Console.Out.WriteLine(args[0] + " was Banned."); 
           Console.ForegroundColor = ConsoleColor.White; 
          } 
         } 
        } 
       } 
       else if (rank >= player.Client.Account.Rank) 
        player.SendInfo("Could not ban"); 
      } 
     } 
     catch 
     { 
      player.SendInfo("Could not ban"); 
     } 
    } 
} 

回答

1

編譯器警告您的變量可能不是你使用它的時間分配。

using (var rdr = cmd.ExecuteReader()) 
{ 
    while (rdr.Read()) 
    rank = rdr.GetInt32("rank"); 
} 

rdr.Read()可能會立即返回錯誤,並且不會發生排序分配。

初始化rank,你把它聲明,即:int rank = 0;

1
using (var rdr = cmd.ExecuteReader()) 
     { 
      while (rdr.Read()) 
      rank = rdr.GetInt32(0); //try to set index of rank 
     }