From 95915e0a7a07710848b39720f744786ff3f61f70 Mon Sep 17 00:00:00 2001 From: jas88 Date: Wed, 22 Nov 2023 09:33:04 -0600 Subject: [PATCH 1/2] Target .Net 8, enable AOT warnings --- FAnsiSql/Discovery/BulkCopy.cs | 26 +++++++++++++------------- FAnsiSql/FAnsi.csproj | 6 +++--- Tests/FAnsiTests/FAnsiTests.csproj | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/FAnsiSql/Discovery/BulkCopy.cs b/FAnsiSql/Discovery/BulkCopy.cs index 1d2a018b..70532e87 100644 --- a/FAnsiSql/Discovery/BulkCopy.cs +++ b/FAnsiSql/Discovery/BulkCopy.cs @@ -107,24 +107,24 @@ protected void ConvertStringTypesToHardTypes(DataTable dt) var deciders = factory.Dictionary; //for each column in the destination - foreach(var kvp in dict) + foreach(var (dataColumn, discoveredColumn) in dict) { //if the destination column is a problematic type - var dataType = kvp.Value.DataType.GetCSharpDataType(); + var dataType = discoveredColumn.DataType.GetCSharpDataType(); if (!deciders.TryGetValue(dataType, out var decider)) continue; - //if it's already not a string then that's fine (hopefully its a legit Type e.g. DateTime!) - if(kvp.Key.DataType != typeof(string)) + //if it's already not a string then that's fine (hopefully it's a legit Type e.g. DateTime!) + if(dataColumn.DataType != typeof(string)) continue; //create a new column hard typed to DateTime - var newColumn = dt.Columns.Add($"{kvp.Key.ColumnName}_{Guid.NewGuid()}",dataType); + var newColumn = dt.Columns.Add($"{dataColumn.ColumnName}_{Guid.NewGuid()}",dataType); //if it's a DateTime decider then guess DateTime culture based on values in the table if(decider is DateTimeTypeDecider) { //also use this one in case the user has set up explicit stuff on it e.g. Culture/Settings decider = DateTimeDecider; - DateTimeDecider.GuessDateFormat(dt.Rows.Cast().Take(500).Select(r=>r[kvp.Key] as string)); + DateTimeDecider.GuessDateFormat(dt.Rows.Cast().Take(500).Select(r=>r[dataColumn] as string)); } @@ -133,27 +133,27 @@ protected void ConvertStringTypesToHardTypes(DataTable dt) try { //parse the value - dr[newColumn] = decider.Parse(dr[kvp.Key] as string)??DBNull.Value; + dr[newColumn] = decider.Parse(dr[dataColumn] as string)??DBNull.Value; } catch(Exception ex) { - throw new Exception($"Failed to parse value '{dr[kvp.Key]}' in column '{kvp.Key}'",ex); + throw new Exception($"Failed to parse value '{dr[dataColumn]}' in column '{dataColumn}'",ex); } } //if the DataColumn is part of the Primary Key of the DataTable (in memory) //then we need to update the primary key to include the new column not the old one - if(dt.PrimaryKey != null && dt.PrimaryKey.Contains(kvp.Key)) - dt.PrimaryKey = dt.PrimaryKey.Except(new []{kvp.Key }).Union(new []{newColumn }).ToArray(); + if(dt.PrimaryKey != null && dt.PrimaryKey.Contains(dataColumn)) + dt.PrimaryKey = dt.PrimaryKey.Except(new [] { dataColumn }).Union(new []{newColumn }).ToArray(); - var oldOrdinal = kvp.Key.Ordinal; + var oldOrdinal = dataColumn.Ordinal; //drop the original column - dt.Columns.Remove(kvp.Key); + dt.Columns.Remove(dataColumn); //rename the hard typed column to match the old column name - newColumn.ColumnName = kvp.Key.ColumnName; + newColumn.ColumnName = dataColumn.ColumnName; if(oldOrdinal != -1) newColumn.SetOrdinal(oldOrdinal); } diff --git a/FAnsiSql/FAnsi.csproj b/FAnsiSql/FAnsi.csproj index 7483ee49..73c0be45 100644 --- a/FAnsiSql/FAnsi.csproj +++ b/FAnsiSql/FAnsi.csproj @@ -10,16 +10,16 @@ GPL-3.0-or-later false FAnsiSql is a database management/ETL library that allows you to perform common SQL operations without having to know which Database Management System (DBMS) you are targetting (e.g. Sql Server, My Sql, Oracle). - Copyright 2019 Ansi,SQL - net6.0 + net8.0 HIC.FAnsiSql Health Informatics Centre, University of Dundee HIC.FAnsiSql FAnsiSql is a database management/ETL library that allows you to perform common SQL operations without having to know which Database Management System (DBMS) you are targetting (e.g. Sql Server, My Sql, Oracle). - Copyright © 2019 + Copyright © 2019-2023 false true + true CS1591 diff --git a/Tests/FAnsiTests/FAnsiTests.csproj b/Tests/FAnsiTests/FAnsiTests.csproj index 374a4691..50090ddb 100644 --- a/Tests/FAnsiTests/FAnsiTests.csproj +++ b/Tests/FAnsiTests/FAnsiTests.csproj @@ -1,6 +1,6 @@ - net7.0 + net8.0 FAnsiSqlTests FAnsiSqlTests Copyright © 2019 From 129e464f976bff268f397905ce9c3218e6a9bf14 Mon Sep 17 00:00:00 2001 From: jas88 Date: Wed, 22 Nov 2023 10:27:51 -0600 Subject: [PATCH 2/2] Add DynamicallyAccessedMembers annotations --- FAnsiSql/Discovery/DiscoveredDataType.cs | 2 ++ FAnsiSql/Discovery/TypeTranslation/ITypeTranslater.cs | 7 +++++++ FAnsiSql/Discovery/TypeTranslation/TypeTranslater.cs | 7 +++++++ 3 files changed, 16 insertions(+) diff --git a/FAnsiSql/Discovery/DiscoveredDataType.cs b/FAnsiSql/Discovery/DiscoveredDataType.cs index c5102a1e..95967c84 100644 --- a/FAnsiSql/Discovery/DiscoveredDataType.cs +++ b/FAnsiSql/Discovery/DiscoveredDataType.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Data.Common; +using System.Diagnostics.CodeAnalysis; using FAnsi.Connections; using FAnsi.Discovery.TypeTranslation; using FAnsi.Exceptions; @@ -65,6 +66,7 @@ public DecimalSize GetDecimalSize() /// Returns the System.Type that should be used to store values read out of columns of this data type (See /// /// + [return:DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties|DynamicallyAccessedMemberTypes.PublicFields)] public Type GetCSharpDataType() { return Column.Table.Database.Server.GetQuerySyntaxHelper().TypeTranslater.GetCSharpTypeForSQLDBType(SQLType); diff --git a/FAnsiSql/Discovery/TypeTranslation/ITypeTranslater.cs b/FAnsiSql/Discovery/TypeTranslation/ITypeTranslater.cs index 4fc655c3..941c3d99 100644 --- a/FAnsiSql/Discovery/TypeTranslation/ITypeTranslater.cs +++ b/FAnsiSql/Discovery/TypeTranslation/ITypeTranslater.cs @@ -1,5 +1,6 @@ using System; using System.Data; +using System.Diagnostics.CodeAnalysis; using TypeGuesser; namespace FAnsi.Discovery.TypeTranslation; @@ -36,6 +37,9 @@ public interface ITypeTranslater /// /// /// The C# Type which can be used to store values of this database type + [return: + DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | + DynamicallyAccessedMemberTypes.PublicFields)] Type GetCSharpTypeForSQLDBType(string sqlType); /// @@ -45,6 +49,9 @@ public interface ITypeTranslater /// /// /// The C# Type which can be used to store values of this database type + [return: + DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | + DynamicallyAccessedMemberTypes.PublicFields)] Type TryGetCSharpTypeForSQLDBType(string sqlType); /// diff --git a/FAnsiSql/Discovery/TypeTranslation/TypeTranslater.cs b/FAnsiSql/Discovery/TypeTranslation/TypeTranslater.cs index 3c53a3a6..33a3ffc6 100644 --- a/FAnsiSql/Discovery/TypeTranslation/TypeTranslater.cs +++ b/FAnsiSql/Discovery/TypeTranslation/TypeTranslater.cs @@ -1,5 +1,6 @@ using System; using System.Data; +using System.Diagnostics.CodeAnalysis; using System.Text.RegularExpressions; using TypeGuesser; @@ -181,6 +182,9 @@ protected string GetGuidDataType() } /// + [return: + DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | + DynamicallyAccessedMemberTypes.PublicFields)] public Type GetCSharpTypeForSQLDBType(string sqlType) { return TryGetCSharpTypeForSQLDBType(sqlType) ?? @@ -191,6 +195,9 @@ public Type GetCSharpTypeForSQLDBType(string sqlType) } /// + [return: + DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | + DynamicallyAccessedMemberTypes.PublicFields)] public Type TryGetCSharpTypeForSQLDBType(string sqlType) { if (IsBit(sqlType))