Skip to content

Commit

Permalink
SqlDb - persistent connection
Browse files Browse the repository at this point in the history
  • Loading branch information
cattaneoinfoesse committed Sep 23, 2022
1 parent 6b67135 commit e7a9a40
Show file tree
Hide file tree
Showing 19 changed files with 495 additions and 350 deletions.
4 changes: 2 additions & 2 deletions ACUtils.SqlDb.Utils/ACUtils.SqlDb.Utils.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
<Authors>Andrea Cattaneo</Authors>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<Version>1.0.0.143</Version>
<PackageVersion>1.0.0.143</PackageVersion>
<Version>1.0.0.144</Version>
<PackageVersion>1.0.0.144</PackageVersion>
<Description>Utilities per gestione DataTable</Description>
<NeutralLanguage>it</NeutralLanguage>
<IncludeSymbols>true</IncludeSymbols>
Expand Down
30 changes: 24 additions & 6 deletions ACUtils.SqlDb.Utils/DBModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,20 +51,38 @@ public static List<T> Idrate(DataTable dt)
return IdrateGenerator(dt).ToList();
}

public static IEnumerable<T> Idrate(SqlDataReader reader)
public static IEnumerable<T> 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<T> IdrateAsync(SqlDataReader reader)
{
while (await reader.ReadAsync())
{
foreach (var o in _returnIdrate(reader))
{
yield return o;
}
}
}

private static IEnumerable<T> _returnIdrate(IDataReader reader)
{
for (int i = 0; i < reader.FieldCount; i++)
{
var obj = new T();
obj.idrate(reader);
yield return obj;
}
}


#endregion

Expand Down
6 changes: 3 additions & 3 deletions ACUtils.SqlDb/ACUtils.SqlDb.csproj
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
<Authors>Andrea Cattaneo</Authors>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<Version>1.0.0.144</Version>
<PackageVersion>1.0.0.144</PackageVersion>
<Version>1.0.0.146</Version>
<PackageVersion>1.0.0.146</PackageVersion>
<Description>Utility per interrogazione database MSSQL</Description>
<NeutralLanguage>it</NeutralLanguage>
<IncludeSymbols>true</IncludeSymbols>
Expand Down
28 changes: 28 additions & 0 deletions ACUtils.SqlDb/ConnectionWrapper.cs
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
}
79 changes: 57 additions & 22 deletions ACUtils.SqlDb/SqlDb.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Data.SqlClient;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using System.Transactions;

namespace ACUtils
Expand All @@ -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
Expand Down Expand Up @@ -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")
Expand All @@ -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<string, object>[] queryParams)
{
if (logger == null)
Expand Down Expand Up @@ -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<ConnectionWrapper> _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<T>(DataRow dataRow, string columnName)
{
// dataRow.Field<T>(columnName)
Expand Down
14 changes: 10 additions & 4 deletions ACUtils.SqlDb/SqlDb_BulkInsert.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,22 @@ public static class SqlDb_BulkInsert
{
public static void BulkInsert<T>(this SqlDb self, string tablename, IEnumerable<T> 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<T>(this SqlDb self, string tablename, IEnumerable<T> 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));
}
}
}

Expand Down
96 changes: 36 additions & 60 deletions ACUtils.SqlDb/SqlDb_Execute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,101 +8,77 @@ namespace ACUtils
{
public static class SqlDb_Execute
{
public static bool Execute(this SqlDb self, string queryString, params KeyValuePair<string, object>[] queryParams)
#region static without params
public static int Execute(SqlConnection connection, string queryString)
{
return Execute(connection, queryString, new KeyValuePair<string, object>[0]);
}
#endregion
#region static with simple params
public static int Execute(SqlConnection connection, string queryString, params KeyValuePair<string, object>[] 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<string, object>[] queryParams)
#endregion
#region static with typed params
public static int Execute(SqlConnection connection, string queryString, params KeyValuePair<string, KeyValuePair<SqlDbType, object>>[] 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<string, KeyValuePair<SqlDbType, object>>[] queryParams)
#region without params
public static int Execute(this SqlDb self, string queryString)
{
return self.Execute(queryString, new KeyValuePair<string, object>[0]);
}
#endregion
#region with simple params
public static int Execute(this SqlDb self, string queryString, params KeyValuePair<string, object>[] 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<string, KeyValuePair<SqlDbType, object>>[] 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<string, KeyValuePair<SqlDbType, object>>[] 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
}
}
Loading

0 comments on commit e7a9a40

Please sign in to comment.