J'essaie d'écrire un analyseur de code qui vérifiera s'il y a des IDataReaders qui ne sont pas fermés.
Je suis passé par cette question mais il n'explique pas comment faire. J'ai également essayé de lire la documentation dans la base de données de l'UE. github lien La langue anglaise utilisée ici est trop compliquée et je n'ai pas compris comment je vais pouvoir trouver toutes les instances du type IDataReader et vérifier que la méthode close() est appelée sur elle avant qu'une variable dudit type ne sorte de la portée.
J'ai essayé de créer un projet de type Analyzer avec code fix dans visual studio, j'ai essayé d'enregistrer le contexte d'opération dans la méthode Initialize de ma classe (qui est étendue du type DiagnosticAnalyzer
comme suit :
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class DataReaderAnalyzerAnalyzer : DiagnosticAnalyzer
{
public const string DiagnosticId = "DataReaderAnalyzer";
private static readonly LocalizableString Title = new LocalizableResourceString(nameof(Resources.AnalyzerTitle), Resources.ResourceManager, typeof(Resources));
private static readonly LocalizableString MessageFormat = new LocalizableResourceString(nameof(Resources.AnalyzerMessageFormat), Resources.ResourceManager, typeof(Resources));
private static readonly LocalizableString Description = new LocalizableResourceString(nameof(Resources.AnalyzerDescription), Resources.ResourceManager, typeof(Resources));
private const string Category = "DBConnectionCheck";
private static DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Error, isEnabledByDefault: true, description: Description);
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }
public override void Initialize(AnalysisContext context)
{
context.RegisterOperationAction((operationContext) =>
{
((Microsoft.CodeAnalysis.CSharp.Syntax.AssignmentExpressionSyntax)((Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionStatementSyntax)operationContext.Operation.Syntax).Expression).Left
}
, OperationKind.ExpressionStatement);
}
}
Je veux trouver toutes les références de l'occurrence de la variable qui contient le type IDataReader, m'assurer que la méthode close est appelée dans cette variable avant qu'elle ne soit perdue hors de la portée.
Voici un exemple de mon code que j'aimerais analyser.
class Program
{
static void Main(string[] args)
{
IDataReader reader = null;
try
{
Database db = DatabaseFactory.CreateDatabase("ApplicationConnection");
reader = GetDataReader(db);
while (reader.Read())
{
//Do somethig with the data here
}
reader.Close();
}
catch (Exception)
{
throw;
}
finally
{
if (reader != null && !reader.IsClosed)
{
reader.Close();
}
}
}
public static IDataReader GetDataReader(Database db)
{
DbCommand dbcmd = db.GetSqlStringCommand("some select statement to get data from oracle data base");
var reader = db.ExecuteReader(dbcmd);
return reader;
}
}