首页 > 解决方案 > 有没有办法将字符串数组而不是单独的参数传递给实体框架类?

问题描述

目前,我有一个程序使用 OleDb 从 Excel 工作表中获取数据并使用实体框架将其导入 SQL Server 数据库。

在弥合 OleDb 和 EF 之间的差距时,我将 Excel 工作表中的数据推送到 aDataTable中,进入DataTable获取单行中的所有数据,将其放入StringBuilder以逗号分隔的 a 中,然后将该StringBuilder对象转换为字符串数组被逗号隔开。然后,我调用该Add函数以使用 EF 将数据导入数据库。

在下面显示的代码中,您可以看到我必须调用

Name = data[0], Message = data[1]

等将数据推送到数据库中。有没有一种方法可以将字符串数组传递给类而不是每个单独的参数并在那里处理数据?

public static void Insert(string Sheet, OleDbConnection conn)
{
        OleDbCommand command = new OleDbCommand("SELECT Name, Message, Message type FROM [" + Sheet + "$]", conn); //Selects everything inside excel file
        DataTable Data = new DataTable();

        OleDbDataAdapter adapter = new OleDbDataAdapter(command);
        adapter.Fill(Data); //Puts all data inside a DataSet

        StringBuilder sb = new StringBuilder();
        var context = new DataWarehouseContext();

        // Prints out DataSet
        foreach (DataRow dataRow in Data.Rows)
        {
            foreach (var item in dataRow.ItemArray)
            {
                sb.Append(item);
                sb.Append(",");
            }

            string[] data = sb.ToString().Split(','); //Gets data for each item in vHealth Insert method
            context.RvtoolsVHealth.Add(new RvtoolsVHealth { Name = data[0], Message = data[1], MessageType = data[2] });
            context.SaveChanges();
        }
}

任何指针都会很棒,谢谢!

标签: c#.netclassentity-framework-coreoledb

解决方案


不是以内置方式。您可以为其创建一个构造函数,RvtoolsVHealth该构造函数接受一个字符串数组并设置属性,但在我看来,这是一个糟糕的 API,因为无法确保将属性映射到正确的数组值。如果数组按顺序包含消息类型、消息和名称怎么办?

您正在做的是实例化对象的规范方法。

我会说你似乎浪费了一些能量,连接一个字符串只是为了把它分开。为什么不直接从以下位置提取值dataRow

foreach (DataRow dataRow in Data.Rows)
{
    context.RvtoolsVHealth.Add(new RvtoolsVHealth { 
        Name        = dataRow[0].ToString(), 
        Message     = dataRow[1].ToString(), 
        MessageType = dataRow[2].ToString() 
        });
    context.SaveChanges();
}

您甚至可以更进一步,使用 aOleDbDataReader来读取值,而不是花时间填写 aDataTable


推荐阅读