有没有办法将字符串数组而不是单独的参数传递给 Entity Framework class?
Is there a way to pass a string array instead of separate parameters to an Entity Framework class?
目前,我有一个程序使用 OleDb 从 Excel sheet 中获取数据并使用 Entity Framework 将其导入 SQL 服务器数据库。
为了弥补OleDb和EF之间的差距,我将数据从Excel sheet推入DataTable
,进入DataTable
获取所有一行中的数据,将其放入以逗号分隔的 StringBuilder
中,然后将该 StringBuilder
对象转换为以逗号分隔的字符串数组。然后,我调用 Add
函数以使用 EF 将数据导入数据库。
在下面显示的代码中,您可以看到我必须调用
Name = data[0], Message = data[1]
等将数据推送到数据库中。有没有一种方法可以将字符串数组传递给 class 而不是每个单独的参数并在那里处理数据?
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();
}
}
任何指点都很好,谢谢!
不是以内置方式。您 可以 为 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
目前,我有一个程序使用 OleDb 从 Excel sheet 中获取数据并使用 Entity Framework 将其导入 SQL 服务器数据库。
为了弥补OleDb和EF之间的差距,我将数据从Excel sheet推入DataTable
,进入DataTable
获取所有一行中的数据,将其放入以逗号分隔的 StringBuilder
中,然后将该 StringBuilder
对象转换为以逗号分隔的字符串数组。然后,我调用 Add
函数以使用 EF 将数据导入数据库。
在下面显示的代码中,您可以看到我必须调用
Name = data[0], Message = data[1]
等将数据推送到数据库中。有没有一种方法可以将字符串数组传递给 class 而不是每个单独的参数并在那里处理数据?
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();
}
}
任何指点都很好,谢谢!
不是以内置方式。您 可以 为 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