diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index 8e8b2227..ee375789 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -73,7 +73,7 @@ namespace TShockAPI.DB using (var reader = database.QueryReader("SELECT * FROM Bans WHERE IP=@0", ip)) { if (reader.Read()) - return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + return new Ban(reader.Get("IP"), reader.Get("Name"), reader.Get("Reason")); } } catch (Exception ex) @@ -97,7 +97,7 @@ namespace TShockAPI.DB using (var reader = database.QueryReader("SELECT * FROM Bans WHERE " + namecol + "=@0", name)) { if (reader.Read()) - return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + return new Ban(reader.Get("IP"), reader.Get("Name"), reader.Get("Reason")); } } diff --git a/TShockAPI/DB/DbExt.cs b/TShockAPI/DB/DbExt.cs index 269fec1c..978f79dd 100644 --- a/TShockAPI/DB/DbExt.cs +++ b/TShockAPI/DB/DbExt.cs @@ -5,42 +5,48 @@ using System.Data; namespace TShockAPI.DB { public static class DbExt - { + { /// /// Executes a query on a database. /// - /// Database to query + /// Database to query /// Query string with parameters as @0, @1, etc. /// Parameters to be put in the query /// Rows affected by query - public static int Query(this IDbConnection db, string query, params object[] args) + public static int Query(this IDbConnection olddb, string query, params object[] args) { - using (var com = db.CreateCommand()) + using (var db = olddb.CloneEx()) { - com.CommandText = query; - for (int i = 0; i < args.Length; i++) - com.AddParameter("@" + i, args[i]); + db.Open(); + using (var com = db.CreateCommand()) + { + com.CommandText = query; + for (int i = 0; i < args.Length; i++) + com.AddParameter("@" + i, args[i]); - return com.ExecuteNonQuery(); + return com.ExecuteNonQuery(); + } } } /// /// Executes a query on a database. /// - /// Database to query + /// Database to query /// Query string with parameters as @0, @1, etc. /// Parameters to be put in the query /// Query result as IDataReader - public static IDataReader QueryReader(this IDbConnection db, string query, params object[] args) + public static QueryResult QueryReader(this IDbConnection olddb, string query, params object[] args) { + var db = olddb.CloneEx(); + db.Open(); using (var com = db.CreateCommand()) { com.CommandText = query; for (int i = 0; i < args.Length; i++) com.AddParameter("@" + i, args[i]); - return com.ExecuteReader(); + return new QueryResult(db, com.ExecuteReader()); } } @@ -53,8 +59,15 @@ namespace TShockAPI.DB return parm; } - static Dictionary> ReadFuncs = new Dictionary> - { + public static IDbConnection CloneEx(this IDbConnection conn) + { + var clone = (IDbConnection)Activator.CreateInstance(conn.GetType()); + clone.ConnectionString = conn.ConnectionString; + return clone; + } + + static Dictionary> ReadFuncs = new Dictionary>() + { {typeof(bool), (s, i) => s.GetBoolean(i)}, {typeof(byte), (s, i) => s.GetByte(i)}, {typeof(Int16), (s, i) => s.GetInt16(i)}, @@ -64,7 +77,6 @@ namespace TShockAPI.DB {typeof(decimal), (s, i) => s.GetDecimal(i)}, {typeof(float), (s, i) => s.GetFloat(i)}, {typeof(double), (s, i) => s.GetDouble(i)}, - {typeof(object), (s, i) => s.GetValue(i)}, }; public static T Get(this IDataReader reader, string column) @@ -80,4 +92,34 @@ namespace TShockAPI.DB throw new NotImplementedException(); } } + + + public class QueryResult : IDisposable + { + public IDbConnection Connection { get; protected set; } + public IDataReader Reader { get; protected set; } + + public QueryResult(IDbConnection conn, IDataReader reader) + { + Connection = conn; + Reader = reader; + } + + public void Dispose() + { + Reader.Dispose(); + Connection.Dispose(); + } + + public bool Read() + { + return Reader.Read(); + } + + public T Get(string column) + { + return Reader.Get(Reader.GetOrdinal(column)); + } + } + } diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index 2dbee46c..395d69bc 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -193,7 +193,6 @@ namespace TShockAPI.DB returndata[1] = reader.Get("UserGroup"); return returndata; } - reader.Close(); } } catch (Exception ex) @@ -295,7 +294,7 @@ namespace TShockAPI.DB { try { - IDataReader result; + QueryResult result; if (string.IsNullOrEmpty(user.Address)) { result = database.QueryReader("SELECT * FROM Users WHERE Username=@0", user.Name);