【问题标题】:Is there a way to pass a string array instead of separate parameters to an Entity Framework class?有没有办法将字符串数组而不是单独的参数传递给实体框架类?
【发布时间】:2020-05-27 16:08:10
【问题描述】:

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

在弥合 OleDb 和 EF 之间的差距时,我将 Excel 工作表中的数据推送到 DataTable,进入 DataTable 以获取单行中的所有数据,将其放入 StringBuilder 分隔用逗号,然后将 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();
        }
}

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

【问题讨论】:

  • CSV 似乎完全没有必要。您已经在遍历数据行,为什么不在创建 RVtoolsHealth 对象时直接访问列?名称 = 数据行 [“名称”]。见stackoverflow.com/questions/7119993/…。 Linq 适用于数据表,因此您可以直接选择 RvtoolsVHealth 对象列表,然后对您的上下文执行 AddMany。

标签: c# .net class entity-framework-core oledb


【解决方案1】:

不是以内置方式。您可以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();
}

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

【讨论】:

  • 这很有意义,我是使用 DataRow 的新手,所以我不知道这是一个选项!感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2022-01-03
相关资源
最近更新 更多