kreta/Sda.DataProvider/Wrappers/MSSQL/MSSQLCommandWrapper.cs
2024-03-13 00:33:46 +01:00

206 lines
5.7 KiB
C#

using System;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics.CodeAnalysis;
using SDA.DataProvider.Core;
namespace SDA.DataProvider.MSSQLWrappers
{
class MSSQLCommandWrapper : SDACommandWrapper
{
internal SqlCommand Command;
internal MSSQLConnectionWrapper ConnectionWrapper;
internal MSSQLCommandParameterCollectionWrapper InnerParameters;
internal MSSQLTransactionWrapper InnerTransaction;
internal MSSQLCommandWrapper()
{
try
{
// ReSharper disable once UseObjectOrCollectionInitializer
Command = new SqlCommand();
Command.CommandTimeout = 300;
InnerParameters = new MSSQLCommandParameterCollectionWrapper(Command);
}
catch
{
if (Command != null)
{
Command.Dispose();
}
throw;
}
}
internal MSSQLCommandWrapper(SqlCommand command)
{
Command = command;
Command.CommandTimeout = 300;
InnerParameters = new MSSQLCommandParameterCollectionWrapper(Command);
}
protected override IDbCommand WrappedCommand
{
get
{
return Command;
}
}
string SafeGetParametersText()
{
string result = "";
for (int i = 0; i < Command.Parameters.Count; i++)
{
result += Command.Parameters[i].ParameterName + "=";
if (Command.Parameters[i].Value == null)
{
result += @"csharpnull, ";
}
else if (Command.Parameters[i].Value == DBNull.Value)
{
result += @"DBNULL, ";
}
else
{
result += "[" + Command.Parameters[i].Value + "], ";
}
}
return result;
}
string SafeGetCommandText()
{
if (Command != null)
{
return Command.CommandText + "\n" + SafeGetParametersText();
}
return "";
}
public override SDAConnectionWrapper Connection
{
get
{
return ConnectionWrapper;
}
set
{
MSSQLConnectionWrapper connection = value as MSSQLConnectionWrapper;
ConnectionWrapper = connection;
Command.Connection = connection?.Connection;
}
}
[SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities")]
public override string CommandText
{
get
{
string temp = Command.CommandText.Replace("@p", ":p");
return temp;
}
set
{
if (value == null)
{
Command.CommandText = "";
return;
}
string temp = value.Replace(":p", "@p");
Command.CommandText = temp;
}
}
public override int ExecuteNonQuery()
{
try
{
return Command.ExecuteNonQuery();
}
catch (SqlException exception)
{
throw MSSQLExceptionHelper.TranslateSqlException(exception, SafeGetCommandText());
}
}
public override SDADataReaderWrapper ExecuteReader()
{
try
{
return new MSSQLDataReaderWrapper(Command.ExecuteReader());
}
catch (SqlException exception)
{
throw MSSQLExceptionHelper.TranslateSqlException(exception, SafeGetCommandText());
}
}
public override SDADataReaderWrapper ExecuteReader(CommandBehavior commandBehavior)
{
try
{
return new MSSQLDataReaderWrapper(Command.ExecuteReader(commandBehavior));
}
catch (SqlException exception)
{
throw MSSQLExceptionHelper.TranslateSqlException(exception, SafeGetCommandText());
}
}
public override object ExecuteScalar()
{
try
{
return Command.ExecuteScalar();
}
catch (SqlException exception)
{
throw MSSQLExceptionHelper.TranslateSqlException(exception, SafeGetCommandText());
}
}
public override SDATransactionWrapper Transaction
{
get
{
return InnerTransaction;
}
set
{
MSSQLTransactionWrapper transaction = value as MSSQLTransactionWrapper;
InnerTransaction = transaction;
Command.Transaction = transaction?.Transaction;
}
}
bool _disposed;
protected override void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
base.Dispose(disposing);
if (disposing)
{
if (Command != null)
{
Command.Dispose();
Command = null;
}
}
_disposed = true;
}
public override SDACommandParameterCollectionWrapper Parameters
{
get
{
return InnerParameters;
}
}
}
}