尝试使用c# / ASP.NET将数据从电子表格迁移到数据库



我有一个Excel电子表格,我收到,我需要导入到我们的数据库表。我以前问过关于从电子表格中提取单个单元格的数据(使用c#和ASP.NET从Excel中读取单个单元格到字符串),我正试图以此为基础将整个电子表格移动到数据库中。

信息格式为:第一列=姓名,第二列=工资,第三列=部门

现有代码如下:

#region Initialize Connection
var Class_Connection = new SQL_Connection();
var sql = new SQL_Statements();
Class_Connection.cnn.Close();
#endregion
string properties = String.Format(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = \HeraPublicLumberPriceslbr_ems.xls; Extended Properties = 'Excel 8.0; HDR = NO;'");
string Price = "";
using (OleDbConnection conn = new OleDbConnection(properties))
{
string sqlpull = "SELECT * FROM [" + worksheet + "$" + Cell1 + ":" + Cell2 + "]";
conn.Open();
DataSet ds = new DataSet();
//string columns = String.Join(",", columnNames.ToArray());
using (OleDbDataAdapter da = new OleDbDataAdapter(sqlpull, properties))
{
string temp2 = "";
var dt = new DataTable();
da.Fill(dt);
for (int i = 0; i < dt.Columns.Count; i++)
{
temp2 = dt.Columns[i].ColumnName.ToString();
}
foreach (DataRow dr in dt.Rows)
{
Price = dr[temp2].ToString();
}
}
}
int Freight = GetFreight(LumbDesc);
int price1 = Convert.ToInt32(Price);
int addon = Convert.ToInt32(AddTo);
int Total = price1 + addon + Freight;
//TODO: insert into TLumberprice
string sqlStatement = "insert table([LumberCode], [Price], [PriceDate], [UserName], [Factor], [Op])" +
"values ('" + LumbDesc + "', '" + Total + "', '" + DateTime.Now + "', '" + LoginSession.userName.Remove(LoginSession.userName.Length - 1) + "', '" + Factor + "', '" + OP + "')";
#region Insert Lumber Prices
Class_Connection.cnn.Open();
SqlCommand InsertLumberPrices = new SqlCommand(sqlStatement, Class_Connection.cnn);
InsertLumberPrices.ExecuteNonQuery();
Class_Connection.cnn.Close();
#endregion

按预期工作。但我有问题。

我可以直接读取DataTable(dt)到数据库中,还是我必须使用下面的东西?

for (int i = 0; i < dt.Columns.Count; i++)
{
SName = dt.Columns[0].ColumnName.ToString();
SWage = dt.Columns[1].ColumnName.ToString();
SDept = dt.Columns[2].ColumnName.ToString();
}
foreach (DataRow dr in dt.Rows)
{
Name = dr[SName].tostring();
Wage = dr[SWage].tostring();
Dept = dr[SDept].tostring();
}

有一种方法可以将数据表中的数据导入SQL表。你需要使用SqlBulkCopy

var sqlBulkCopy = new SqlBulkCopy(conn);

你甚至可以映射哪个数据表列到哪个SQL表列。

下面是一个例子。

using(var sqlBulkCopy = new SqlBulkCopy(conn))
{
sqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Column 1", "Name"));
sqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Column 2", "Wage"));
sqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Column 3", "Department"));
sqlBulkCopy.DestinationTableName = "table" // table name in SQL
conn.Open();
sqlBulkCopy.WriteToServer(dt);
conn.Close();
}

其中conn是你的SqlConnection。

如果你不想使用数据表,你可以直接去BulkImport。

只需将OleDbDataAdapter更改为OleDbCommand并将值放入IDataReader变量中,然后您可以在上面的代码中使用该值而不是dt。

对于最后一部分,我过去只在两个没有相互链接的SQL服务器之间做过。我不能100%确定它是否能与OleDb一起工作。

最新更新