首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将CsvReader转换为SqlDataReader

将CsvReader转换为SqlDataReader
EN

Stack Overflow用户
提问于 2021-03-30 18:02:04
回答 1查看 72关注 0票数 1

使用这个C#方法,我可以从.csv文件读取到一个契约列表,在这个列表中,CsvHelper通过其字段映射器工作得很好。

代码语言:javascript
复制
    public static List<Contract> readDataFile(string filePath)
    {
        List<Contract> contracts = new List<Contract> { };

        using var reader = new StreamReader(filePath);
        var config = new CsvConfiguration(CultureInfo.CurrentCulture) {
            Delimiter = ";",
            PrepareHeaderForMatch = args => args.Header.ToLowerInvariant()
        };

        using var csvReader = new CsvReader(reader, config);
        {
            csvReader.Context.RegisterClassMap<ContractMap>();
            IEnumerable<Contract> dataContracts = csvReader.GetRecords<Contract>();

            foreach (Contract c in dataContracts)
            {
                contracts.Add(c);
            }
        }
    }

就像这样,我想把它转换成一个SqlDataReader,但它没有一个带有<T>映射器的GetRecords。我是.NET核心的新手,并且一直在四处寻找。目前还不清楚什么是正确的方法。

因此,谢谢你的任何提示!

有没有什么通用的方法让SqlDataReader转换成一个给定的对象?

澄清

这段代码运行得很好!不需要改变。只是csv数据现在来自DB。查询数据库也能正常工作。我只是简单地搜索一种巧妙的方法,通过SQLReader将相同的数据读入相同的列表。

EN

回答 1

Stack Overflow用户

发布于 2021-03-30 18:43:24

你不能得到一个SqlDataReader,因为SqlDataReader的,特别是一个与SQL Server对话的SqlClient实现,而你不是。不过,您可以获得一个IDataReader:假设您谈论的是this CsvHelper,则有一个CsvDataReader在构造函数中接受一个CsvReader实例,并实现IDataReader。对于大多数常见场景,这应该足够了(尽管可以说,如果它是从DbDataReader派生而来的话会更好)。例如,它可以通过以下方式与Dapper一起使用:

代码语言:javascript
复制
using var dataReader = new CsvDataReader(csvReader);
var deserializer = SqlMapper.GetTypeDeserializer(typeof(Contract), dataReader);
while (dataReader.ReadNext())
{
    var c = (Contract)deserializer(dataReader);
    // whatever you want to do with that
}

如果你的意思是你只想使用像GetRecords<T>这样的东西,但是使用SqlDataReader而不是CsvHelper (完全去掉CsvHelper ):那么-几乎任何对象关系映射都可以。不过,您可能也会让ORM担心数据读取器部分;例如(同样,为了方便起见,我在这里使用Dapper ):

代码语言:javascript
复制
using var conn = // ... create a connection
string region = ...
var data = conn.Query<Contact>(
    "select * from Contacts where Region=@region", // sql
    new { region } // parameters
).AsList();

或者像EF这样的东西通过LINQ:

代码语言:javascript
复制
string region = ...
var data = dbContext.Contacts.Where(x => x.Region == region).ToList();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66868771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档