From e7a9a404e0c595272e258f53012d96ca9e3494ec Mon Sep 17 00:00:00 2001 From: Andrea Cattaneo Date: Fri, 23 Sep 2022 10:44:46 +0200 Subject: [PATCH] SqlDb - persistent connection --- .../ACUtils.SqlDb.Utils.csproj | 4 +- ACUtils.SqlDb.Utils/DBModel.cs | 30 ++++- ACUtils.SqlDb/ACUtils.SqlDb.csproj | 6 +- ACUtils.SqlDb/ConnectionWrapper.cs | 28 +++++ ACUtils.SqlDb/SqlDb.cs | 79 +++++++++---- ACUtils.SqlDb/SqlDb_BulkInsert.cs | 14 ++- ACUtils.SqlDb/SqlDb_Execute.cs | 96 ++++++---------- ACUtils.SqlDb/SqlDb_QueryDataRow.cs | 64 ++++++++--- ACUtils.SqlDb/SqlDb_QueryDataSet.cs | 108 +++++++----------- ACUtils.SqlDb/SqlDb_QueryDataTable.cs | 59 +++++----- ACUtils.SqlDb/SqlDb_QueryMany.cs | 46 ++++++-- ACUtils.SqlDb/SqlDb_QueryManyAsync.cs | 90 +++++++++++++++ .../SqlDb_QueryNullableSingleValue.cs | 32 ------ ACUtils.SqlDb/SqlDb_QueryOne.cs | 62 ++++++++-- ACUtils.SqlDb/SqlDb_QuerySingleValue.cs | 104 ++++++----------- ACUtils.SqlDbExt/ACUtils.SqlDbExt.csproj | 6 +- ACUtils.SqlDbExt/SqlDbExt.cs | 5 +- .../ACUtils.StringUtils.csproj | 6 +- Tests/SqlDbTest.cs | 6 +- 19 files changed, 495 insertions(+), 350 deletions(-) create mode 100644 ACUtils.SqlDb/ConnectionWrapper.cs create mode 100644 ACUtils.SqlDb/SqlDb_QueryManyAsync.cs delete mode 100644 ACUtils.SqlDb/SqlDb_QueryNullableSingleValue.cs diff --git a/ACUtils.SqlDb.Utils/ACUtils.SqlDb.Utils.csproj b/ACUtils.SqlDb.Utils/ACUtils.SqlDb.Utils.csproj index 08d2726..78356ad 100644 --- a/ACUtils.SqlDb.Utils/ACUtils.SqlDb.Utils.csproj +++ b/ACUtils.SqlDb.Utils/ACUtils.SqlDb.Utils.csproj @@ -4,8 +4,8 @@ Andrea Cattaneo true false - 1.0.0.143 - 1.0.0.143 + 1.0.0.144 + 1.0.0.144 Utilities per gestione DataTable it true diff --git a/ACUtils.SqlDb.Utils/DBModel.cs b/ACUtils.SqlDb.Utils/DBModel.cs index 366be85..8507fe5 100644 --- a/ACUtils.SqlDb.Utils/DBModel.cs +++ b/ACUtils.SqlDb.Utils/DBModel.cs @@ -51,20 +51,38 @@ public static List Idrate(DataTable dt) return IdrateGenerator(dt).ToList(); } - public static IEnumerable Idrate(SqlDataReader reader) + public static IEnumerable Idrate(IDataReader reader) { while (reader.Read()) { - for (int i = 0; i < reader.FieldCount; i++) + foreach (var o in _returnIdrate(reader)) { - var obj = new T(); - obj.idrate((IDataRecord)reader); - yield return obj; + yield return o; } } } - + public async static IAsyncEnumerable IdrateAsync(SqlDataReader reader) + { + while (await reader.ReadAsync()) + { + foreach (var o in _returnIdrate(reader)) + { + yield return o; + } + } + } + + private static IEnumerable _returnIdrate(IDataReader reader) + { + for (int i = 0; i < reader.FieldCount; i++) + { + var obj = new T(); + obj.idrate(reader); + yield return obj; + } + } + #endregion diff --git a/ACUtils.SqlDb/ACUtils.SqlDb.csproj b/ACUtils.SqlDb/ACUtils.SqlDb.csproj index cf7c5ed..fe97431 100644 --- a/ACUtils.SqlDb/ACUtils.SqlDb.csproj +++ b/ACUtils.SqlDb/ACUtils.SqlDb.csproj @@ -1,12 +1,12 @@ - + net461;netstandard2.0 Andrea Cattaneo true false - 1.0.0.144 - 1.0.0.144 + 1.0.0.146 + 1.0.0.146 Utility per interrogazione database MSSQL it true diff --git a/ACUtils.SqlDb/ConnectionWrapper.cs b/ACUtils.SqlDb/ConnectionWrapper.cs new file mode 100644 index 0000000..ebb0547 --- /dev/null +++ b/ACUtils.SqlDb/ConnectionWrapper.cs @@ -0,0 +1,28 @@ +using System; +using System.Data.SqlClient; + +namespace ACUtils +{ + class ConnectionWrapper : IDisposable + { + public readonly SqlConnection Connection; + private bool _closeOnDispose; + public ConnectionWrapper(SqlConnection connection, bool closeOnDispose = true) + { + this.Connection = connection; + _closeOnDispose = closeOnDispose; + } + + public void Dispose() + { + if (_closeOnDispose) + { + if (Connection?.State == System.Data.ConnectionState.Open) + { + Connection.Close(); + } + Connection?.Dispose(); + } + } + } +} diff --git a/ACUtils.SqlDb/SqlDb.cs b/ACUtils.SqlDb/SqlDb.cs index f7ea2f6..5456d58 100644 --- a/ACUtils.SqlDb/SqlDb.cs +++ b/ACUtils.SqlDb/SqlDb.cs @@ -4,6 +4,7 @@ using System.Data.SqlClient; using System.Globalization; using System.Linq; +using System.Threading.Tasks; using System.Transactions; namespace ACUtils @@ -17,7 +18,7 @@ public class SqlDb : IDisposable private static MissingSchemaAction? missingSchemaAction; private bool _persistentConnection = false; - + private SqlConnection _connection = null; public static MissingSchemaAction MissingSchemaAction { get @@ -120,7 +121,7 @@ public string Switch(object x) } } - internal static string ValueToString(object obj) + private static string ValueToString(object obj) { TypeSwitch ts = new TypeSwitch() .Case((bool x) => x ? "1" : "0") @@ -136,26 +137,6 @@ internal static string ValueToString(object obj) return ts.Switch(obj); } - internal void WriteLog(string queryString) - { - if (logger == null) - { - return; - } - string callerStack = GetCallerStack(4, 3); - logger.Debug($"SQL {callerStack}{Environment.NewLine}{queryString}"); - } - - internal void WriteLog(Exception exception, string queryString) - { - if (logger == null) - { - return; - } - string callerStack = GetCallerStack(4, 3); - logger.Error($"SQL {callerStack} : {exception}"); - } - internal void WriteLog(string queryString, KeyValuePair[] queryParams) { if (logger == null) @@ -352,9 +333,63 @@ protected virtual void Dispose(bool disposing) AbortTransaction(); } catch { } + + try + { + if (_connection?.State == ConnectionState.Open) + { + _connection.Close(); + SqlConnection.ClearPool(_connection); + } + } + catch { } } #endregion + private SqlConnection _rawConnection() + { + if (_persistentConnection) + { + if (_connection == null) + { + _connection = new SqlConnection(ConnectionString); + } + + return _connection; + } + var newConn = new SqlConnection(ConnectionString); + return newConn; + } + + internal ConnectionWrapper _getConnection() + { + var conn = _rawConnection(); + if (conn.State != ConnectionState.Open) + { + conn.Open(); + } + return new ConnectionWrapper(conn, !this._persistentConnection); + + } + + internal async Task _getConnectionAsync(System.Threading.CancellationToken? cancellationToken = null) + { + var conn = _rawConnection(); + if (conn.State != ConnectionState.Open) + { + if (cancellationToken.HasValue) + { + await conn.OpenAsync(cancellationToken.Value); + + } + else + { + await conn.OpenAsync(); + } + } + return new ConnectionWrapper(conn, !this._persistentConnection); + } + public static T GetColVal(DataRow dataRow, string columnName) { // dataRow.Field(columnName) diff --git a/ACUtils.SqlDb/SqlDb_BulkInsert.cs b/ACUtils.SqlDb/SqlDb_BulkInsert.cs index 635f5b9..e2bae0f 100644 --- a/ACUtils.SqlDb/SqlDb_BulkInsert.cs +++ b/ACUtils.SqlDb/SqlDb_BulkInsert.cs @@ -8,16 +8,22 @@ public static class SqlDb_BulkInsert { public static void BulkInsert(this SqlDb self, string tablename, IEnumerable records) { - using (var bc = new SqlBulkCopy(self.ConnectionString)) + using (var connection = self._getConnection()) { - bc.WriteToServer(self.BulkInsertPrepare(bc, tablename, records)); + using (var bc = new SqlBulkCopy(connection.Connection)) + { + bc.WriteToServer(self.BulkInsertPrepare(bc, tablename, records)); + } } } public static async System.Threading.Tasks.Task BulkInsertAsync(this SqlDb self, string tablename, IEnumerable records) { - using (var bc = new SqlBulkCopy(self.ConnectionString)) + using (var connection = await self._getConnectionAsync()) { - await bc.WriteToServerAsync(self.BulkInsertPrepare(bc, tablename, records)); + using (var bc = new SqlBulkCopy(connection.Connection)) + { + await bc.WriteToServerAsync(self.BulkInsertPrepare(bc, tablename, records)); + } } } diff --git a/ACUtils.SqlDb/SqlDb_Execute.cs b/ACUtils.SqlDb/SqlDb_Execute.cs index 4b7f51b..33d81e3 100644 --- a/ACUtils.SqlDb/SqlDb_Execute.cs +++ b/ACUtils.SqlDb/SqlDb_Execute.cs @@ -8,101 +8,77 @@ namespace ACUtils { public static class SqlDb_Execute { - public static bool Execute(this SqlDb self, string queryString, params KeyValuePair[] queryParams) + #region static without params + public static int Execute(SqlConnection connection, string queryString) + { + return Execute(connection, queryString, new KeyValuePair[0]); + } + #endregion + #region static with simple params + public static int Execute(SqlConnection connection, string queryString, params KeyValuePair[] queryParams) { //queryString = queryString.Trim().Replace(System.Environment.NewLine, " "); //queryString = System.Text.RegularExpressions.Regex.Replace(queryString, @"\s+", " "); - using (SqlConnection connection = new SqlConnection(self.ConnectionString)) + using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString, queryParams)) { - try - { - connection.Open(); - var value = self.Execute(connection, queryString, queryParams); - return value; - } - catch (Exception ex) - { - self.WriteLog(ex, queryString, queryParams); - throw; - } - finally - { - try { connection.Close(); } catch { } - } + return selectCommand.ExecuteNonQuery(); } } - - public static bool Execute(this SqlDb self, SqlConnection connection, string queryString, params KeyValuePair[] queryParams) + #endregion + #region static with typed params + public static int Execute(SqlConnection connection, string queryString, params KeyValuePair>[] queryParams) { - //queryString = queryString.Trim().Replace(System.Environment.NewLine, " "); - //queryString = System.Text.RegularExpressions.Regex.Replace(queryString, @"\s+", " "); using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString, queryParams)) { - var value = selectCommand.ExecuteNonQuery() > 0; - return value; + return selectCommand.ExecuteNonQuery(); } } + #endregion - public static bool Execute(this SqlDb self, string queryString, params KeyValuePair>[] queryParams) + #region without params + public static int Execute(this SqlDb self, string queryString) + { + return self.Execute(queryString, new KeyValuePair[0]); + } + #endregion + #region with simple params + public static int Execute(this SqlDb self, string queryString, params KeyValuePair[] queryParams) { - using (SqlConnection connection = new SqlConnection(self.ConnectionString)) + //queryString = queryString.Trim().Replace(System.Environment.NewLine, " "); + //queryString = System.Text.RegularExpressions.Regex.Replace(queryString, @"\s+", " "); + using (var connection = self._getConnection()) { + self.WriteLog(queryString, queryParams); try { - connection.Open(); - var value = self.Execute(connection, queryString, queryParams); - return value; + return Execute(connection.Connection, queryString, queryParams); } catch (Exception ex) { self.WriteLog(ex, queryString, queryParams); throw; } - finally - { - try { connection.Close(); } catch { } - } - } - } - - public static bool Execute(this SqlDb self, SqlConnection connection, string queryString, params KeyValuePair>[] queryParams) - { - using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString, queryParams)) - { - var value = selectCommand.ExecuteNonQuery() > 0; - return value; } } - - public static bool Execute(this SqlDb self, string queryString) + #endregion + #region whit typed params + public static int Execute(this SqlDb self, string queryString, params KeyValuePair>[] queryParams) { - using (SqlConnection connection = new SqlConnection(self.ConnectionString)) + using (var connection = self._getConnection()) { + self.WriteLog(queryString, queryParams); try { - connection.Open(); - self.WriteLog(queryString); - var value = self.Execute(connection, queryString); - return value; + return Execute(connection.Connection, queryString, queryParams); } catch (Exception ex) { - self.WriteLog(ex, queryString); + self.WriteLog(ex, queryString, queryParams); throw; } - finally - { - try { connection.Close(); } catch { } - } } } - public static bool Execute(this SqlDb self, SqlConnection connection, string queryString) - { - using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString)) - { - return selectCommand.ExecuteNonQuery() > 0; - } - } + #endregion } } diff --git a/ACUtils.SqlDb/SqlDb_QueryDataRow.cs b/ACUtils.SqlDb/SqlDb_QueryDataRow.cs index b7ced0e..57e564a 100644 --- a/ACUtils.SqlDb/SqlDb_QueryDataRow.cs +++ b/ACUtils.SqlDb/SqlDb_QueryDataRow.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Data; using System.Data.SqlClient; @@ -6,33 +7,61 @@ namespace ACUtils { public static class SqlDb_QueryDataRow { - public static DataRow QueryDataRow(this SqlDb self, string queryString, params KeyValuePair[] queryParams) + + #region static without params + public static DataRow QueryDataRow(SqlConnection connection, string queryString) + { + return QueryDataRow( + connection, + queryString, + new KeyValuePair[0] + ); + } + #endregion + #region static with simple params + public static DataRow QueryDataRow(SqlConnection connection, string queryString, params KeyValuePair[] queryParams) { - DataTable dt = self.QueryDataTable( + DataTable dt = SqlDb_QueryDataTable.QueryDataTable( + connection, queryString, queryParams ); - - if (dt.Rows.Count == 0) - { - throw new Exceptions.NotFoundException("nessun risultato ottenuto"); - } - - if (dt.Rows.Count > 1) - { - throw new Exceptions.TooMuchResultsException("ottenuto più valori"); - } - return dt.Rows[0]; + return _return(dt); } - - public static DataRow QueryDataRow(this SqlDb self, SqlConnection connection, string queryString, params KeyValuePair[] queryParams) + #endregion + #region static with typed params + public static DataRow QueryDataRow(SqlConnection connection, string queryString, params KeyValuePair>[] queryParams) { - DataTable dt = self.QueryDataTable( + DataTable dt = SqlDb_QueryDataTable.QueryDataTable( connection, queryString, queryParams ); + return _return(dt); + } + #endregion + #region without params + public static DataRow QueryDataRow(this SqlDb self, string queryString) + { + return self.QueryDataRow(queryString, new KeyValuePair[0]); + } + #endregion + #region with simple params + public static DataRow QueryDataRow(this SqlDb self, string queryString, params KeyValuePair[] queryParams) + { + return _return(self.QueryDataTable(queryString, queryParams)); + } + #endregion + #region whit typed params + public static DataRow QueryDataRow(this SqlDb self, string queryString, params KeyValuePair>[] queryParams) + { + return _return(self.QueryDataTable(queryString, queryParams)); + } + #endregion + + private static DataRow _return(DataTable dt) + { if (dt.Rows.Count == 0) { throw new Exceptions.NotFoundException("nessun risultato ottenuto"); @@ -45,6 +74,5 @@ public static DataRow QueryDataRow(this SqlDb self, SqlConnection connection, st return dt.Rows[0]; } - } } diff --git a/ACUtils.SqlDb/SqlDb_QueryDataSet.cs b/ACUtils.SqlDb/SqlDb_QueryDataSet.cs index b0cfd2b..005d832 100644 --- a/ACUtils.SqlDb/SqlDb_QueryDataSet.cs +++ b/ACUtils.SqlDb/SqlDb_QueryDataSet.cs @@ -7,52 +7,46 @@ namespace ACUtils { public static class SqlDb_QueryDataSet { - public static DataSet QueryDataSet(this SqlDb self, string queryString, params KeyValuePair>[] queryParams) + #region static without params + public static DataSet QueryDataSet(SqlConnection connection, string queryString) + { + return QueryDataSet(connection, queryString, new KeyValuePair[0]); + } + #endregion + #region static with simple params + public static DataSet QueryDataSet(SqlConnection connection, string queryString, params KeyValuePair[] queryParams) { - using (SqlConnection connection = new SqlConnection(self.ConnectionString)) + using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString, queryParams)) { - try - { - connection.Open(); - self.WriteLog(queryString, queryParams); - var ds = self.QueryDataSet(connection, queryString, queryParams); - return ds; - } - catch (Exception ex) - { - self.WriteLog(ex, queryString, queryParams); - throw; - } - finally - { - try { connection.Close(); } catch { } - } + return _return(selectCommand); } } - - public static DataSet QueryDataSet(this SqlDb self, SqlConnection connection, string queryString, params KeyValuePair>[] queryParams) + #endregion + #region static with typed params + public static DataSet QueryDataSet(SqlConnection connection, string queryString, params KeyValuePair>[] queryParams) { using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString, queryParams)) { - using (SqlDataAdapter adapter = new SqlDataAdapter(selectCommand)) - { - DataSet ds = new DataSet(); - adapter.MissingSchemaAction = SqlDb.MissingSchemaAction; - adapter.Fill(ds); - return ds; - } + return _return(selectCommand); } } + #endregion + #region without params + public static DataSet QueryDataSet(this SqlDb self, string queryString) + { + return self.QueryDataSet(queryString, new KeyValuePair[0]); + } + #endregion + #region with simple params public static DataSet QueryDataSet(this SqlDb self, string queryString, params KeyValuePair[] queryParams) { - using (SqlConnection connection = new SqlConnection(self.ConnectionString)) + using (var connection = self._getConnection()) { + self.WriteLog(queryString, queryParams); try { - connection.Open(); - self.WriteLog(queryString, queryParams); - var ds = self.QueryDataSet(connection, queryString, queryParams); + var ds = QueryDataSet(connection.Connection, queryString, queryParams); return ds; } catch (Exception ex) @@ -60,61 +54,37 @@ public static DataSet QueryDataSet(this SqlDb self, string queryString, params K self.WriteLog(ex, queryString, queryParams); throw; } - finally - { - try { connection.Close(); } catch { } - } } } - - public static DataSet QueryDataSet(this SqlDb self, SqlConnection connection, string queryString, params KeyValuePair[] queryParams) - { - using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString, queryParams)) - { - using (SqlDataAdapter adapter = new SqlDataAdapter(selectCommand)) - { - DataSet ds = new DataSet(); - adapter.MissingSchemaAction = SqlDb.MissingSchemaAction; - adapter.Fill(ds); - return ds; - } - } - } - - public static DataSet QueryDataSet(this SqlDb self, string queryString) + #endregion + #region whit typed params + public static DataSet QueryDataSet(this SqlDb self, string queryString, params KeyValuePair>[] queryParams) { - using (SqlConnection connection = new SqlConnection(self.ConnectionString)) + using (var connection = self._getConnection()) { + self.WriteLog(queryString, queryParams); try { - connection.Open(); - self.WriteLog(queryString); - var ds = self.QueryDataSet(connection, queryString); + var ds = QueryDataSet(connection.Connection, queryString, queryParams); return ds; } catch (Exception ex) { - self.WriteLog(ex, queryString); + self.WriteLog(ex, queryString, queryParams); throw; } - finally - { - try { connection.Close(); } catch { } - } } } + #endregion - public static DataSet QueryDataSet(this SqlDb self, SqlConnection connection, string queryString) + private static DataSet _return(SqlCommand selectCommand) { - using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString)) + using (SqlDataAdapter adapter = new SqlDataAdapter(selectCommand)) { - using (SqlDataAdapter adapter = new SqlDataAdapter(selectCommand)) - { - DataSet ds = new DataSet(); - adapter.MissingSchemaAction = SqlDb.MissingSchemaAction; - adapter.Fill(ds); - return ds; - } + DataSet ds = new DataSet(); + adapter.MissingSchemaAction = SqlDb.MissingSchemaAction; + adapter.Fill(ds); + return ds; } } } diff --git a/ACUtils.SqlDb/SqlDb_QueryDataTable.cs b/ACUtils.SqlDb/SqlDb_QueryDataTable.cs index f81ad6b..7bbcc31 100644 --- a/ACUtils.SqlDb/SqlDb_QueryDataTable.cs +++ b/ACUtils.SqlDb/SqlDb_QueryDataTable.cs @@ -6,50 +6,49 @@ namespace ACUtils { public static class SqlDb_QueryDataTable { - /// - /// Esegue la query e restituisce il DataTable del risultato - /// - /// - /// db.QueryDataTable("SELECT * FROM A WHERE B = @B", "@B".WithValue("1")); - /// - /// stringa contenente la stringa di interrogazione SQL - /// nomi dei parametri associati a i loro valori. utilizzare come helper - /// - public static DataTable QueryDataTable(this SqlDb self, string queryString, params KeyValuePair[] queryParams) + #region static without params + public static DataTable QueryDataTable(SqlConnection connection, string queryString) { - DataSet ds = self.QueryDataSet(queryString, queryParams); - return ds.Tables[0]; + return QueryDataTable(connection, queryString, new KeyValuePair[0]); } - - public static DataTable QueryDataTable(this SqlDb self, SqlConnection connection, string queryString, params KeyValuePair[] queryParams) + #endregion + #region static with simple params + public static DataTable QueryDataTable(SqlConnection connection, string queryString, params KeyValuePair[] queryParams) { - DataSet ds = self.QueryDataSet(connection, queryString, queryParams); - return ds.Tables[0]; + DataSet ds = SqlDb_QueryDataSet.QueryDataSet(connection, queryString, queryParams); + return _return(ds); } - - public static DataTable QueryDataTable(this SqlDb self, string queryString, params KeyValuePair>[] queryParams) + #endregion + #region static with typed params + public static DataTable QueryDataTable(SqlConnection connection, string queryString, params KeyValuePair>[] queryParams) { - DataSet ds = self.QueryDataSet(queryString, queryParams); - return ds.Tables[0]; + DataSet ds = SqlDb_QueryDataSet.QueryDataSet(connection, queryString, queryParams); + return _return(ds); } + #endregion - public static DataTable QueryDataTable(this SqlDb self, SqlConnection connection, string queryString, params KeyValuePair>[] queryParams) + #region without params + public static DataTable QueryDataTable(this SqlDb self, string queryString) { - DataSet ds = self.QueryDataSet(connection, queryString, queryParams); - return ds.Tables[0]; + return self.QueryDataTable(queryString, new KeyValuePair[0]); } - - public static DataTable QueryDataTable(this SqlDb self, string queryString) + #endregion + #region with simple params + public static DataTable QueryDataTable(this SqlDb self, string queryString, params KeyValuePair[] queryParams) { - DataSet ds = self.QueryDataSet(queryString); - return ds.Tables[0]; + return _return(self.QueryDataSet(queryString, queryParams)); } + #endregion + #region whit typed params + public static DataTable QueryDataTable(this SqlDb self, string queryString, params KeyValuePair>[] queryParams) + { + return _return(self.QueryDataSet(queryString, queryParams)); + } + #endregion - public static DataTable QueryDataTable(this SqlDb self, SqlConnection connection, string queryString) + private static DataTable _return(DataSet ds) { - DataSet ds = self.QueryDataSet(connection, queryString); return ds.Tables[0]; } - } } diff --git a/ACUtils.SqlDb/SqlDb_QueryMany.cs b/ACUtils.SqlDb/SqlDb_QueryMany.cs index f995820..3f8b7ee 100644 --- a/ACUtils.SqlDb/SqlDb_QueryMany.cs +++ b/ACUtils.SqlDb/SqlDb_QueryMany.cs @@ -1,29 +1,53 @@  using System.Collections.Generic; +using System.Data; using System.Data.SqlClient; namespace ACUtils { public static class SqlDb_QueryMany { - public static List QueryMany(this SqlDb self, string sql, params KeyValuePair[] queryParams) where T : ACUtils.DBModel, new() + + #region static without params + public static List QueryMany(SqlConnection connection, string queryString) where T : ACUtils.DBModel, new() { - var dt = self.QueryDataTable(sql, queryParams); - return ACUtils.DBModel.Idrate(dt); + return QueryMany(connection, queryString, new KeyValuePair[0]); + } + #endregion + #region static with simple params + public static List QueryMany(SqlConnection connection, string queryString, params KeyValuePair[] queryParams) where T : ACUtils.DBModel, new() + { + return _return(SqlDb_QueryDataTable.QueryDataTable(connection, queryString, queryParams)); + } + #endregion + #region static with typed params + public static List QueryMany(SqlConnection connection, string queryString, params KeyValuePair>[] queryParams) where T : ACUtils.DBModel, new() + { + return _return(SqlDb_QueryDataTable.QueryDataTable(connection: connection, queryString: queryString, queryParams: queryParams)); } + #endregion - public static async IAsyncEnumerable QueryManyAsync(this SqlDb self, string sql, params KeyValuePair[] queryParams) where T : ACUtils.DBModel, new() + #region without params + public static List QueryMany(this SqlDb self, string queryString) where T : ACUtils.DBModel, new() + { + return self.QueryMany(queryString, new KeyValuePair[0]); + } + #endregion + #region with simple params + public static List QueryMany(this SqlDb self, string queryString, params KeyValuePair[] queryParams) where T : ACUtils.DBModel, new() + { + return _return(self.QueryDataTable(queryString: queryString, queryParams: queryParams)); + } + #endregion + #region whit typed params + public static List QueryMany(this SqlDb self, string queryString, params KeyValuePair>[] queryParams) where T : ACUtils.DBModel, new() { - var dt = self.QueryDataTable(sql, queryParams); - await foreach (var q in ACUtils.DBModel.IdrateAsyncGenerator(dt)) - { - yield return q; - } + return _return(self.QueryDataTable(queryString: queryString, queryParams: queryParams)); } + #endregion - public static List QueryMany(this SqlDb self, SqlConnection connection, string sql, params KeyValuePair[] queryParams) where T : ACUtils.DBModel, new() + private static List _return(DataTable dt) where T : ACUtils.DBModel, new() { - var dt = self.QueryDataTable(connection, sql, queryParams); return ACUtils.DBModel.Idrate(dt); } } diff --git a/ACUtils.SqlDb/SqlDb_QueryManyAsync.cs b/ACUtils.SqlDb/SqlDb_QueryManyAsync.cs new file mode 100644 index 0000000..5678e83 --- /dev/null +++ b/ACUtils.SqlDb/SqlDb_QueryManyAsync.cs @@ -0,0 +1,90 @@ +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; + +namespace ACUtils +{ + public static class SqlDb_QueryManyAsync + { + #region static without params + public static async IAsyncEnumerable QueryManyAsync(SqlConnection connection, string queryString) where T : ACUtils.DBModel, new() + { + await foreach (var q in QueryManyAsync(connection, queryString, new KeyValuePair[0])) + { + yield return q; + } + } + #endregion + #region static with simple params + public static async IAsyncEnumerable QueryManyAsync(SqlConnection connection, string queryString, params KeyValuePair[] queryParams) where T : ACUtils.DBModel, new() + { + using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString, queryParams)) + { + using (var dr = selectCommand.ExecuteReader()) + { + await foreach (var q in _return(dr)) + { + yield return q; + } + } + } + } + #endregion + #region static with typed params + public static async IAsyncEnumerable QueryManyAsync(SqlConnection connection, string queryString, params KeyValuePair>[] queryParams) where T : ACUtils.DBModel, new() + { + using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString, queryParams)) + { + using (var dr = selectCommand.ExecuteReader()) + { + await foreach (var q in _return(dr)) + { + yield return q; + } + } + } + } + #endregion + + #region without params + public static async IAsyncEnumerable QueryManyAsync(this SqlDb self, string queryString) where T : ACUtils.DBModel, new() + { + await foreach (var q in self.QueryManyAsync(queryString, new KeyValuePair[0])) + { + yield return q; + } + } + #endregion + #region with simple params + public static async IAsyncEnumerable QueryManyAsync(this SqlDb self, string queryString, params KeyValuePair[] queryParams) where T : ACUtils.DBModel, new() + { + using (var connection = await self._getConnectionAsync()) + { + self.WriteLog(queryString, queryParams); + await foreach (var q in QueryManyAsync(connection.Connection, queryString, queryParams)) + { + yield return q; + } + } + } + #endregion + #region whit typed params + public static async IAsyncEnumerable QueryManyAsync(this SqlDb self, string queryString, params KeyValuePair>[] queryParams) where T : ACUtils.DBModel, new() + { + using (var connection = await self._getConnectionAsync()) + { + self.WriteLog(queryString, queryParams); + await foreach (var q in QueryManyAsync(connection.Connection, queryString, queryParams)) + { + yield return q; + } + } + } + #endregion + + private static IAsyncEnumerable _return(SqlDataReader dr) where T : ACUtils.DBModel, new() + { + return ACUtils.DBModel.IdrateAsync(dr); + } + } +} diff --git a/ACUtils.SqlDb/SqlDb_QueryNullableSingleValue.cs b/ACUtils.SqlDb/SqlDb_QueryNullableSingleValue.cs deleted file mode 100644 index 88d595d..0000000 --- a/ACUtils.SqlDb/SqlDb_QueryNullableSingleValue.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data.SqlClient; - -namespace ACUtils -{ - public static class SqlDb_QueryNullableSingleValue - { - public static T? QueryNullableSingleValue(this SqlDb self, string queryString, params KeyValuePair[] queryParams) where T : struct - { - using (SqlConnection connection = new SqlConnection(self.ConnectionString)) - { - try - { - connection.Open(); - self.WriteLog(queryString, queryParams); - var value = self.QueryNullableSingleValue(connection, queryString, queryParams); - return value; - } - catch (Exception ex) - { - self.WriteLog(ex, queryString, queryParams); - throw; - } - finally - { - try { connection.Close(); } catch { } - } - } - } - } -} diff --git a/ACUtils.SqlDb/SqlDb_QueryOne.cs b/ACUtils.SqlDb/SqlDb_QueryOne.cs index b06d8e0..6a7e890 100644 --- a/ACUtils.SqlDb/SqlDb_QueryOne.cs +++ b/ACUtils.SqlDb/SqlDb_QueryOne.cs @@ -1,29 +1,73 @@ using System.Collections.Generic; +using System.Data; using System.Data.SqlClient; namespace ACUtils { public static class SqlDb_QueryOne { + #region static without params public static T QueryOne( - this SqlDb self, - string sql, + SqlConnection connection, + string queryString + ) where T : ACUtils.DBModel, new() + { + return QueryOne(connection, queryString, new KeyValuePair[0]); + } + #endregion + #region static with simple params + public static T QueryOne( + SqlConnection connection, + string queryString, params KeyValuePair[] queryParams ) where T : ACUtils.DBModel, new() { - var dr = self.QueryDataRow(sql, queryParams); - return ACUtils.DBModel.Idrate(dr); + return _return(SqlDb_QueryDataRow.QueryDataRow(connection, queryString, queryParams)); } + #endregion + #region static with typed params + public static T QueryOne( + SqlConnection connection, + string queryString, + params KeyValuePair>[] queryParams + ) where T : DBModel, new() + { + return _return(SqlDb_QueryDataRow.QueryDataRow(connection, queryString, queryParams)); + } + #endregion - + #region without params public static T QueryOne( this SqlDb self, - SqlConnection connection, - string sql, + string queryString + ) where T : DBModel, new() + { + return _return(self.QueryDataRow(queryString, new KeyValuePair[0])); + } + #endregion + #region with simple params + public static T QueryOne( + this SqlDb self, + string queryString, params KeyValuePair[] queryParams - ) where T : ACUtils.DBModel, new() + ) where T : DBModel, new() + { + return _return(self.QueryDataRow(queryString, queryParams)); + } + #endregion + #region whit typed params + public static T QueryOne( + this SqlDb self, + string queryString, + params KeyValuePair>[] queryParams + ) where T : DBModel, new() + { + return _return(self.QueryDataRow(queryString, queryParams)); + } + #endregion + + private static T _return(DataRow dr) where T : ACUtils.DBModel, new() { - var dr = self.QueryDataRow(connection, sql, queryParams); return ACUtils.DBModel.Idrate(dr); } } diff --git a/ACUtils.SqlDb/SqlDb_QuerySingleValue.cs b/ACUtils.SqlDb/SqlDb_QuerySingleValue.cs index e08862a..c010c8a 100644 --- a/ACUtils.SqlDb/SqlDb_QuerySingleValue.cs +++ b/ACUtils.SqlDb/SqlDb_QuerySingleValue.cs @@ -8,115 +8,77 @@ namespace ACUtils { public static class SqlDb_QuerySingleValue { - public static T QuerySingleValue(this SqlDb self, string queryString, params KeyValuePair[] queryParams) + #region static without params + public static T QuerySingleValue(SqlConnection connection, string queryString) { - using (SqlConnection connection = new SqlConnection(self.ConnectionString)) - { - try - { - connection.Open(); - self.WriteLog(queryString, queryParams); - var value = self.QuerySingleValue(connection, queryString, queryParams); - return value; - } - catch (Exception ex) - { - self.WriteLog(ex, queryString, queryParams); - throw; - } - finally - { - try { connection.Close(); } catch { } - } - } + return QuerySingleValue(connection, queryString, new KeyValuePair[0]); } - public static T QuerySingleValue(this SqlDb self, SqlConnection connection, string queryString, params KeyValuePair[] queryParams) + #endregion + #region static with simple params + public static T QuerySingleValue(SqlConnection connection, string queryString, params KeyValuePair[] queryParams) { using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString, queryParams)) { - object value = selectCommand.ExecuteScalar(); - return SqlDb._changeType(value); + return _return(selectCommand.ExecuteScalar()); } } - - public static Nullable QueryNullableSingleValue(this SqlDb self, SqlConnection connection, string queryString, params KeyValuePair[] queryParams) where T : struct + #endregion + #region static with typed params + public static T QuerySingleValue(SqlConnection connection, string queryString, params KeyValuePair>[] queryParams) { using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString, queryParams)) { - object value = selectCommand.ExecuteScalar(); - if (value == null || value == DBNull.Value || value is DBNull) - { - return null; - } - // conversione variabile da object a type specificato - //return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value); - return SqlDb._changeType(value); + return _return(selectCommand.ExecuteScalar()); } } + #endregion - public static T QuerySingleValue(this SqlDb self, string queryString, params KeyValuePair>[] queryParams) + #region without params + public static T QuerySingleValue(this SqlDb self, string queryString) { - using (SqlConnection connection = new SqlConnection(self.ConnectionString)) + return self.QuerySingleValue(queryString, new KeyValuePair[0]); + } + #endregion + #region with simple params + public static T QuerySingleValue(this SqlDb self, string queryString, params KeyValuePair[] queryParams) + { + using (var connection = self._getConnection()) { + self.WriteLog(queryString, queryParams); try { - connection.Open(); - self.WriteLog(queryString, queryParams); - var value = self.QuerySingleValue(connection, queryString, queryParams); - return value; + return QuerySingleValue(connection.Connection, queryString, queryParams); } catch (Exception ex) { self.WriteLog(ex, queryString, queryParams); throw; } - finally - { - try { connection.Close(); } catch { } - } - } - } - - public static T QuerySingleValue(this SqlDb self, SqlConnection connection, string queryString, params KeyValuePair>[] queryParams) - { - using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString, queryParams)) - { - object value = selectCommand.ExecuteScalar(); - return SqlDb._changeType(value); } } - - - public static T QuerySingleValue(this SqlDb self, string queryString) + #endregion + #region whit typed params + public static T QuerySingleValue(this SqlDb self, string queryString, params KeyValuePair>[] queryParams) { - using (SqlConnection connection = new SqlConnection(self.ConnectionString)) + using (var connection = self._getConnection()) { + self.WriteLog(queryString, queryParams); try { - connection.Open(); - var value = self.QuerySingleValue(connection, queryString); - return SqlDb._changeType(value); + return QuerySingleValue(connection.Connection, queryString, queryParams); } catch (Exception ex) { - self.WriteLog(ex, queryString); + self.WriteLog(ex, queryString, queryParams); throw; } - finally - { - try { connection.Close(); } catch { } - } } } + #endregion - - public static T QuerySingleValue(this SqlDb self, SqlConnection connection, string queryString) + private static T _return(object value) { - using (SqlCommand selectCommand = SqlDb.generateCommand(connection, queryString)) - { - object value = selectCommand.ExecuteScalar(); - return SqlDb._changeType(value); - } + return SqlDb._changeType(value); } } } diff --git a/ACUtils.SqlDbExt/ACUtils.SqlDbExt.csproj b/ACUtils.SqlDbExt/ACUtils.SqlDbExt.csproj index 4116b58..00eca5d 100644 --- a/ACUtils.SqlDbExt/ACUtils.SqlDbExt.csproj +++ b/ACUtils.SqlDbExt/ACUtils.SqlDbExt.csproj @@ -1,12 +1,12 @@ - + net461;netstandard2.0 Andrea Cattaneo true false - 1.0.0.140 - 1.0.0.140 + 1.0.0.142 + 1.0.0.142 Utility per interrogazione database MSSQL it true diff --git a/ACUtils.SqlDbExt/SqlDbExt.cs b/ACUtils.SqlDbExt/SqlDbExt.cs index 9bdbd39..d8a2198 100644 --- a/ACUtils.SqlDbExt/SqlDbExt.cs +++ b/ACUtils.SqlDbExt/SqlDbExt.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Globalization; @@ -24,7 +23,7 @@ public static class SqlDbExt public static void ToCSV(SqlConnection connection, string queryString, string csvFilePath, char Escape = '"', char Quote = '"', string Delimiter = ";", bool BoolToIntConvert = false, params KeyValuePair[] queryParams) { - DataTable dt = SqlDb.QueryDataTable(connection, queryString, queryParams); + DataTable dt = SqlDb_QueryDataTable.QueryDataTable(connection, queryString, queryParams); SqlDbExt.ToCsv( dataTable: dt, csvFilePath: csvFilePath, diff --git a/ACUtils.StringUtils/ACUtils.StringUtils.csproj b/ACUtils.StringUtils/ACUtils.StringUtils.csproj index 141cd9b..04ce2e6 100644 --- a/ACUtils.StringUtils/ACUtils.StringUtils.csproj +++ b/ACUtils.StringUtils/ACUtils.StringUtils.csproj @@ -1,17 +1,15 @@ - net461;netstandard2.0 Andrea Cattaneo true false - 1.0.0.140 - 1.0.0.140 + 1.0.0.141 + 1.0.0.141 Collezione di utility varie it true snupkg ..\dist\ - \ No newline at end of file diff --git a/Tests/SqlDbTest.cs b/Tests/SqlDbTest.cs index 87261e9..7912624 100644 --- a/Tests/SqlDbTest.cs +++ b/Tests/SqlDbTest.cs @@ -38,7 +38,7 @@ public void Teardown() public void TestSelect(string value) { SqlDb.MissingSchemaAction = System.Data.MissingSchemaAction.AddWithKey; - SqlDb.QueryDataRow( + SqlDb_QueryDataRow.QueryDataRow( new System.Data.SqlClient.SqlConnection(CONNECTION_STRING), "SELECT @a AS A", "@a".WithValue(value, 3) @@ -73,7 +73,7 @@ public void TestSelect(string value) public void TestSelectInt(int value) { SqlDb.MissingSchemaAction = System.Data.MissingSchemaAction.AddWithKey; - SqlDb.QueryDataRow( + SqlDb_QueryDataRow.QueryDataRow( new System.Data.SqlClient.SqlConnection(CONNECTION_STRING), "SELECT @a AS A", "@a".WithValue(value) @@ -102,7 +102,7 @@ public void TestSelectInt(int value) public void TestSelectNullableInt(int? value) { SqlDb.MissingSchemaAction = System.Data.MissingSchemaAction.AddWithKey; - SqlDb.QueryDataRow( + SqlDb_QueryDataRow.QueryDataRow( new System.Data.SqlClient.SqlConnection(CONNECTION_STRING), "SELECT @a AS A", "@a".WithValue(value)