2017-06-11 1 views
0

Pendant de nombreuses heures maintenant, je l'ai perdu sur cette même erreur, peu importe ce que je change. J'essaye de faire une application de ligne de commande qui récupérera l'information d'une base de données basée sur deux entrées d'argument, le modname et le author facultatif. Les requêtes sont toutes gérées dans le fichier jobs.cs. Le fichier d'entrée appelle la méthode beginJob() qui obtient la cible modname et author (si spécifié) à interroger. Ce qui est différent de la centaine d'autres articles que j'ai lus ici, c'est que la première requête émise fonctionne très bien, et je suis sûr de fermer le lecteur et la connexion. (Ne pas fermer la connexion à chaque fois en production, mais je l'ai fait ici à des fins de débogage). La prochaine fois que j'appelle la connexion, il en résulte cette erreur.C# - "La connexion doit être valide et ouverte" avec plusieurs requêtes et méthodes | La connexion n'est pas fermée?

System.InvalidOperationException: Connection must be valid and open. 
    at MySql.Data.MySqlClient.ExceptionInterceptor.Throw(Exception exception) 
    at MySql.Data.MySqlClient.MySqlConnection.Throw(Exception ex) 
    at MySql.Data.MySqlClient.MySqlCommand.CheckState() 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader() 
    at vmcmod.Job.queryAuthor(String authorUID) in F:\Projects\VisualStudio\VMC-MOD\vmcmod\job.cs:line 235 
    at vmcmod.Job.StartJob() in F:\Projects\VisualStudio\VMC-MOD\vmcmod\job.cs:line 47 
    at vmcmod.Job.queryModAndAuthor(String modname, String author) in F:\Projects\VisualStudio\VMC-MOD\vmcmod\job.cs:line 205 
    at vmcmod.Job.beginJob() in F:\Projects\VisualStudio\VMC-MOD\vmcmod\job.cs:line 27 
    at vmcmod.VMCMOD.parseArgs() in F:\Projects\VisualStudio\VMC-MOD\vmcmod\vmcmod.cs:line 58 

Certains postes que j'ai regardé, mais ne semble pas aider:

C# Source Fichiers (S'il vous plaît essayer pas grincer trop fort, c'est ma première application C#):

jobs.cs [mis à jour]

using MySql.Data.MySqlClient; 
using System; 

namespace vmcmod 
{ 
    class Job 
    { 
     public bool checkInput() 
     { 
      if (Global.currentJobTargetModname == "undefined") 
      { 
       Utils.consoleLog("The mod name is required.", 3); 
       return false; 
      } 
      else 
      { 
       return true; 
      } 
     } 
     public void beginJob() 
     { 
      string targetModname = Global.currentJobTargetModname.ToLower(); 
      string targetModAuthor = Global.currentJobTargetAuthor.ToLower(); 
      if (targetModAuthor != "undefined") 
      { 
       queryModAndAuthor(targetModname, targetModAuthor); 
       Utils.consoleLog("Job Call. (Author defined)", 4); 
      } 
      else 
      { 
       queryMod(targetModname); 
       Utils.consoleLog("Job Call. (Author undefined)", 4); 
      } 
     } 
     private void StartJob() 
     { 
      string author = null; 
      string targetModAuthor = Global.currentJobTargetAuthor.ToLower(); 
      Utils.consoleLog("Mod exists.", 5); 
      if (targetModAuthor == "undefined") 
      { 
       author = "(None; First in row)"; 
      } 
      else 
      { 
       queryAuthor(Global.queryResModAuthorID); 
       author = "'" + Global.queryResModAuthor + "' (UUID:" + Global.queryResModAuthorID + ") "; 
      } 
      var collaborators_obj = Newtonsoft.Json.Linq.JObject.Parse(Global.queryResModCollab); 
      var tags_obj = Newtonsoft.Json.Linq.JObject.Parse(Global.queryResModTags); 
      Console.BackgroundColor = ConsoleColor.Blue; 
      Console.ForegroundColor = ConsoleColor.White; 
      Console.WriteLine("MOD INSTALL SPECIFICATIONS:"); 
      Console.BackgroundColor = ConsoleColor.Black; 
      Console.WriteLine("  Mod Name: '" + Global.queryResModName + "'"); 
      Console.Write("  Mod Author: " + author); 
      if (Global.queryResModAuthorVerified == true && targetModAuthor != "undefined") 
      { 
       Utils.consoleTag("*VERIFIED*", ConsoleColor.Green); 
      } 
      if (Global.queryResModAuthorVerified == false && targetModAuthor != "undefined") 
      { 
       Utils.consoleTag("*UNVERIFIED*", ConsoleColor.Red); 
      } 
      Console.Write("\n"); 
      Console.WriteLine("  Mod Version: " + Global.queryResModVersion); 
      Console.WriteLine("  Installations: " + Global.queryResModInstalls); 
      Console.WriteLine("  Description:\n  " + Global.queryResDescription); 
      Console.WriteLine("  Mod UUID: " + Global.queryResModUid); 
      if (Global.advInfo == true) 
      { 
       Console.WriteLine("  Rep. Entry #" + Global.queryResModID); 
       Console.WriteLine("  Mod Created On: " + Utils.UnixTimeStampToDateTime(Convert.ToDouble(Global.queryResDateCreated))); 
       Console.WriteLine("  Mod Last Modified On: " + Utils.UnixTimeStampToDateTime(Convert.ToDouble(Global.queryResDateLastModf))); 
       Console.WriteLine("  Tags: \n  " + Convert.ToString(tags_obj["tags"])); 
       Console.WriteLine("  Collaborators: \n  " + Convert.ToString(collaborators_obj["collaborators"])); 
      } 
      Utils.consoleSeparator(); 
      bool user_response = Utils.consoleAskYN("Are you sure you want to install this mod?"); 
      if (user_response == true) 
      { 
       queryGetModJSON(Global.queryResModUid); 
       Utils.consoleLog("JSON Data: "+Global.queryResModJSON,5); 
       //FileIO fio = new FileIO(); 
       //fio.jsonToFiles(fio.jsonToArray(Global.queryResModJSON)); 
      } 
      else 
      { 
       Utils.consoleSetKeyExit(); 
      } 
     } 
     private void queryGetModJSON(string uuid) 
     { 
      var dbCon = new DBConnection(); 
      if (dbCon.IsConnect() == false) 
      { 
       Utils.consoleLog("Unable to query repository or no results.", 3); 
       Utils.consoleSetKeyExit(); 
      } 
      else 
      { 
       string q = "SELECT data_json FROM vmcmod_repository_data WHERE uid='" + uuid + "' LIMIT 1;"; 
       MySqlCommand cmd = new MySqlCommand(q, dbCon.Connection); 
       var reader = cmd.ExecuteReader(); 
       if (!reader.HasRows) 
       { 
        Utils.consoleLog("Mod data not found.", 3); 
        reader.Close(); 
        dbCon.Close(); 
       } 
       else 
       { 
        while (reader.Read()) 
        { 
         Global.queryResModJSON = reader.GetString(0); 
        } 
        reader.Close(); 
        dbCon.Close(); 
       } 
      } 
     } 
     private void queryMod(string modname) 
     { 
      var dbCon = new DBConnection(); 
      if (dbCon.IsConnect() == false) 
      { 
       Utils.consoleLog("Unable to query repository or no results.", 3); 
       Utils.consoleSetKeyExit(); 
      } 
      else 
      { 
       string q = "SELECT id,uid,author_id,mod_name,status,dependencies_json,description,mod_version,date_created,date_last_modified,collaborators,tags_json,installs FROM vmcmod_repository_info WHERE mod_name LIKE'" + modname + "' LIMIT 1;"; 
       MySqlCommand cmd = new MySqlCommand(q, dbCon.Connection); 
       var reader = cmd.ExecuteReader(); 
       if (!reader.HasRows) 
       { 
        Utils.consoleLog("Mod not found.", 3); 
        reader.Close(); 
        dbCon.Close(); 
       } 
       else 
       { 
        while (reader.Read()) 
        { 
         Global.queryResModInstalls = reader.GetInt32(12); 
         Global.queryResModTags = reader.GetString(11); 
         Global.queryResModCollab = reader.GetString(10); 
         Global.queryResDateLastModf = reader.GetInt32(9); 
         Global.queryResDateCreated = reader.GetInt32(8); 
         Global.queryResModVersion = reader.GetFloat(7); 
         Global.queryResDescription = reader.GetString(6); 
         Global.queryResModDependencies = reader.GetString(5); 
         Global.queryResModStatus = reader.GetInt16(4); 
         Global.queryResModName = reader.GetString(3); 
         Global.queryResModAuthorID = reader.GetString(2); 
         Global.queryResModUid = reader.GetString(1); 
         Global.queryResModID = Convert.ToInt32(reader.GetInt32(0)); 
        } 
        reader.Close(); 
        dbCon.Close(); 
        StartJob(); 
       } 
      } 
     } 
     private void queryModAndAuthor(string modname, string author) 
     { 
      var dbCon = new DBConnection(); 
      if (dbCon.IsConnect() == false) 
      { 
       Utils.consoleLog("Unable to query repository or no results.", 3); 
       Utils.consoleSetKeyExit(); 
      } 
      else 
      { 
       string q = "SELECT id,uid,author_id,mod_name,status,dependencies_json,description,mod_version,date_created,date_last_modified,collaborators,tags_json,installs FROM vmcmod_repository_info WHERE mod_name LIKE'" + modname + "' LIMIT 1;"; 
       MySqlCommand cmd = new MySqlCommand(q, dbCon.Connection); 
       var reader = cmd.ExecuteReader(); 
       if (!reader.HasRows) 
       { 
        Utils.consoleLog("Mod not found.", 3); 
        reader.Close(); 
        dbCon.Close(); 
       } 
       else 
       { 
        while (reader.Read()) 
        { 
         Global.queryResModInstalls = reader.GetInt32(12); 
         Global.queryResModTags = reader.GetString(11); 
         Global.queryResModCollab = reader.GetString(10); 
         Global.queryResDateLastModf = reader.GetInt32(9); 
         Global.queryResDateCreated = reader.GetInt32(8); 
         Global.queryResModVersion = reader.GetFloat(7); 
         Global.queryResDescription = reader.GetString(6); 
         Global.queryResModDependencies = reader.GetString(5); 
         Global.queryResModStatus = reader.GetInt16(4); 
         Global.queryResModName = reader.GetString(3); 
         Global.queryResModAuthorID = reader.GetString(2); 
         Global.queryResModUid = reader.GetString(1); 
         Global.queryResModID = Convert.ToInt32(reader.GetInt32(0)); 
        } 
        reader.Close(); 
        dbCon.Close(); 
        StartJob(); 
       } 
      } 
     } 
     private bool queryCheckAuthorExists(string author) 
     { 
      var dbCon = new DBConnection(); 
      string q = "SELECT * FROM vmcmod_users WHERE username='"+author+ "' AND is_author=true LIMIT 1;"; 
      MySqlCommand cmd = new MySqlCommand(q, dbCon.Connection); 
      var reader = cmd.ExecuteReader(); 
      if (reader.HasRows == false) 
      { 
       Utils.consoleLog("Author not found.", 3); 
       reader.Close(); 
       dbCon.Close(); 
       return false; 
      } 
      else 
      { 
       Utils.consoleLog("Author found.", 4); 
       reader.Close(); 
       dbCon.Close(); 
       return true; 
      } 
     } 
     private void queryAuthor(string authorUID) 
     { 
      var dbCon = new DBConnection(); 
      string q = "SELECT username,is_verified_user FROM vmcmod_users WHERE uid='" + authorUID + "' AND is_author=true LIMIT 1;"; 
      MySqlCommand cmd = new MySqlCommand(q, dbCon.Connection); 
      var reader = cmd.ExecuteReader(); 
      if (reader.HasRows == false) 
      { 
       Utils.consoleLog("Author not found.", 3); 
       reader.Close(); 
       dbCon.Close(); 
      } 
      else 
      { 
       while (reader.Read()) 
       { 
        Global.queryResModAuthor = reader.GetString(0); 
        Global.queryResModAuthorVerified = reader.GetBoolean(1); 
       } 
       Utils.consoleLog("Author found.", 4); 
       reader.Close(); 
       dbCon.Close(); 
      } 
     } 
    } 
} 

dbinterface.cs (ce qui n'a pas été écrit par moi plutôt pris et édité à partir d'un poste sur stackoverflow, here) [mis à jour]

using MySql.Data.MySqlClient; 
using System; 

namespace vmcmod 
{ 
    public class DBConnection 
    { 
     public DBConnection() 
     { 
     } 

     public string Password { get; set; } 
     private MySqlConnection connection = null; 
     public MySqlConnection Connection 
     { 
      get { return connection; } 
     } 

     public bool IsConnect() 
     { 
      bool result = true; 
      if (Connection == null) 
      { 
       string connString = "Server=...; Port=...; Database=...; Uid=...; Pwd=...;"; 
       connection = new MySqlConnection(connString); 
       try 
       { 
        connection.Open(); 
        Utils.consoleLog("Connected to repository.", 4); 
        result = true; 
       } 
       catch (Exception e) 
       { 
        Utils.consoleLog("Error occured while connecting to repository.", 3); 
        Utils.consoleLog("MySQL Exception: "+e,5); 
        result = false; 
       } 
      } 

      return result; 
     } 

     public void Close() 
     { 
      connection.Close(); 
      connection = null; 
     } 
    } 
} 

global.cs (stockage global variable)

using System; 

namespace vmcmod 
{ 
    class Global 
    { 
     internal const float version = 0.1F; 
     internal static string currentJobWorld = "New World"; 
     internal static string currentJobTargetModname = "undefined"; 
     internal static string currentJobTargetAuthor = "undefined"; 
     internal static string currentJobProfile = "default"; 
     internal static int currentJobAccountPIN; 
     internal static bool verbose = false; 
     internal static bool debug = false; 
     internal static bool advInfo = false; 
     internal static bool queryResModAuthorVerified = false; 
     internal static string queryResModUid; 
     internal static string queryResModAuthorID; 
     internal static string queryResModAuthor; 
     internal static string queryResModName; 
     internal static string queryResModDependencies = "{\"dependencies\":[]}"; 
     internal static int queryResModStatus; 
     internal static float queryResModVersion; 
     internal static string queryResDescription = "None provided."; 
     internal static int queryResDateCreated; 
     internal static int queryResDateLastModf; 
     internal static int queryResModID; 
     internal static string queryResModCollab = "{\"collaborators\":[]}"; 
     internal static string queryResModTags = "{\"tags\":[]}"; 
     internal static int queryResModInstalls; 
     internal static string queryResModJSON = "{}"; 
    } 
} 

Répondre

0

La solution rapide et sale serait de changer:

public void Close() 
    { 
     connection.Close(); 
    } 

à:

public void Close() 
    { 
     connection.Close(); 
     connection = null; 
    } 

En outre, supprimer ce code:

private static DBConnection _instance = null; 
    public static DBConnection Instance() 
    { 
     if (_instance == null) 
      _instance = new DBConnection(); 
     return _instance; 
    } 

et plutôt que d'utiliser DBConnection.Instance, il suffit d'utiliser new DBConnection();

Et le changement:

public MySqlConnection Connection 
    { 
     get { return connection; } 
    } 

à:

public MySqlConnection Connection 
    { 
     get { 
      IsConnect(); 
      return connection; } 
    } 

et le changement:

public bool IsConnect() 
    { 
     bool result = true; 
     if (Connection == null) 

à:

public bool IsConnect() 
    { 
     bool result = true; 
     if (connection == null) 
+0

Pendant une minute qui semblait très logique, mais je l'ai essayé et ça ne marche toujours miraculeusement fonctionnent pas, même erreur aussi. :( –

+0

Je l'ai fait, et pourtant la même erreur, je pensais à ça et je suis sûr que j'ai déjà essayé ça et je l'ai mis en boîte –

+0

Ok, c'est trop marrant, maintenant ça plante avec l'erreur ironique: ' StackOverflowException'. –

1

Je vois que vous utilisez un pattern singletne pour DBConnection ce n'est pas une bonne idée.

private static DBConnection _instance = null; 
    public static DBConnection Instance() 
    { 
     if (_instance == null) 
      _instance = new DBConnection(); 
     return _instance; 
    } 

Vous pouvez vérifier cette réponse pour plus d'informations: https://stackoverflow.com/a/814606/8143718

0

Selon la réponse de @mjwills, le script d'interface DB j'avais chipé était assez funky et seulement permis un cas à la fois .

Interface de travail DB

using MySql.Data.MySqlClient; 
using System; 

namespace vmcmod 
{ 
    public class DBConnection 
    { 
     public DBConnection() 
     { 
     } 
     public string Password { get; set; } 
     private MySqlConnection connection = null; 
     public MySqlConnection Connection 
     { 
      get 
      { 
       IsConnect(); 
       return connection; 
      } 
     } 
     public bool IsConnect() 
     { 
      bool result = true; 
      if (connection == null) 
      { 
       string connString = "Server=...; Port=...; Database=...; Uid=...; Pwd=...;"; 
       connection = new MySqlConnection(connString); 
       try 
       { 
        connection.Open(); 
        Utils.consoleLog("Connected to repository.", 4); 
        result = true; 
       } 
       catch (Exception e) 
       { 
        Utils.consoleLog("Error occured while connecting to repository.", 3); 
        Utils.consoleLog("MySQL Exception: "+e,5); 
        result = false; 
       } 
      } 

      return result; 
     } 

     public void Close() 
     { 
      connection.Close(); 
      connection = null; 
     } 
    } 
}