Skip to content

Malfunctioning with SqlKata.KeyAttribute #2337

@kwon0408

Description

@kwon0408

Describe the bug
I have used SqlKata's [Key] attribute without the name specified for years without any errors complaining about it, even with SqlKata.Execution.

However CsvHelper seems to be not happy with these nameless keys. When used together, some exceptions are thrown:

Unhandled exception. CsvHelper.WriterException: An unexpected error occurred. See inner exception for details.
IWriter state:
   Row: 1
   Index: 0
   HeaderRecord:
1

 ---> System.ArgumentNullException: Value cannot be null. (Parameter 'name')
   at SqlKata.ColumnAttribute..ctor(String name)
   at SqlKata.KeyAttribute..ctor(String name)
   at System.Reflection.CustomAttribute._CreateCaObject(RuntimeModule pModule, RuntimeType type, IRuntimeMethodInfo pCtor, Byte** ppBlob, Byte* pEndBlob, Int32* pcNamedArgs)
   at System.Reflection.CustomAttribute.AddCustomAttributes(ListBuilder`1& attributes, RuntimeModule decoratedModule, Int32 decoratedMetadataToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, ListBuilder`1 derivedAttributes)
   at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType)
   at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeFieldInfo field, RuntimeType caType)
   at System.Attribute.GetCustomAttributes(MemberInfo element, Boolean inherit)
   at CsvHelper.Configuration.ClassMap.ApplyAttributes(MemberMap memberMap)
   at CsvHelper.Configuration.ClassMap.AutoMapMembers(ClassMap map, CsvContext context, LinkedList`1 mapParents, Int32 indexStart)
   at CsvHelper.Configuration.ClassMap.AutoMap(CsvContext context)
   at CsvHelper.CsvContext.AutoMap(Type type)
   at CsvHelper.CsvWriter.WriteHeader(Type type)
   at CsvHelper.CsvWriter.WriteHeaderFromType[T]()
   at CsvHelper.CsvWriter.WriteRecords[T](IEnumerable`1 records)
   --- End of inner exception stack trace ---
   at CsvHelper.CsvWriter.WriteRecords[T](IEnumerable`1 records)
   at Program.<<Main>$>g__WriteCsv|0_0[T](IEnumerable`1 values) in C:\Users\user\source\repos\sln1\proj1\Program.cs:line 26
   at Program.<Main>$(String[] args) in C:\Users\user\source\repos\sln1\proj1\Program.cs:line 13

To Reproduce

using CsvHelper;
using CsvHelper.Configuration;
using System.Globalization;

MyRecord[] records =
[
    new() { Id = 1, Value = "A" },
    new() { Id = 2, Value = "B" },
];

var csv = WriteCsv(records);
Console.WriteLine(csv);

static string WriteCsv<T>(IEnumerable<T> values)
{
    using var writer = new StringWriter();
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        MemberTypes = MemberTypes.Properties | MemberTypes.Fields
    };
    using var csv = new CsvWriter(writer, config);

    csv.WriteRecords(values);
    return writer.ToString();
}

struct MyRecord
{
    [SqlKata.Key] // Error! 
    // [SqlKata.Key(nameof(Id))] or any other value for `name` is REQUIRED, when using with CsvHelper
    public int Id;

    public string Value;
}

Expected behavior

Id,Value
1,A
2,B

Screenshots
N/A

Additional context
An issue for the same bug is also created in SqlKata's issue tracker.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions