当前,我有一个使用OleDb从Excel工作表中获取数据并将其导入到使用Entity Framework的SQL Server数据库中的程序。
在缩小OleDb和EF之间的距离时,我将数据从Excel工作表推送到DataTable
,进入DataTable
以将所有数据收集到一行中,然后将其放入StringBuilder
用逗号隔开,然后将那个StringBuilder
对象变成一个用逗号隔开的字符串数组。这样,我然后调用Add
函数以使用EF将数据导入数据库。
在下面显示的代码中,您可以看到我必须致电
Name = data[0], Message = data[1]
etc将数据推送到数据库中。有没有办法我可以将字符串数组而不是每个单独的参数传递给类,并在那里处理数据?
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();
}
}
任何指针都很好,谢谢!
答案 0 :(得分: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