2013-10-13 3 views
0

J'essaie de faire lire par le serveur l'int 'rank' de la base de données SQL, mais je reçois "Utilisation de la variable locale non assignée" parce qu'elle ne lit pas "rank 'jusqu'à ce qu'il soit supposé être mis dans une déclaration while, cependant je ne peux pas le déplacer parce qu'il n'exécute pas la requête SQL jusqu'à ce qu'il entre dans l'essai et attrape.Utilisation de la variable locale non affectée - SQL + C#

spécifiquement ici:

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

Le code complet:

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"); 
     } 
    } 
} 

Répondre

1

Le compilateur vous avertit que la variable ne peut être attribué au moment où vous l'utilisez.

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

rdr.Read() peut retourner false immédiatement et l'affectation au grade ne se produira pas.

Initialiser rank où vous déclarez, à savoir: int rank = 0;

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