c# - 尝试使用 C#/ASP.NET 将数据从电子表格迁移到数据库
问题描述
我收到了一个 Excel 电子表格,需要将其导入到我们数据库中的表格中。我之前曾询问过从电子表格中提取单个数据单元格(使用 C# 和 ASP.NET 从 Excel 中读取单个单元格到字符串),我试图以此为基础,以便将整个电子表格移动到数据库中.
信息的格式为第 1 列 = 姓名,第 2 列 = 工资,第 3 列 = 部门
现有代码如下:
#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 = \\Hera\Public\LumberPrices\lbr_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 一起使用。
推荐阅读
- sql-update - 使用子选择的 Exasol 更新表
- delphi - 如何停止我的嵌套循环?它一遍又一遍地循环。我只想要 18 个结果而不是 81
- spring-mvc - 带有 Jaxb2RootElementHttpMessageConverter 的 Spring RestTemplate 无法识别 JAXB 注释
- node.js - 如何在 nosql 上进行多条件查询
- windows - 为什么 CMD 会忽略字符 `;`?
- reactjs - 无法从 npm 构建反应应用程序
- android - 如何在 Room Db 中插入重复行?
- actionscript-3 - adobe animate - 发布到 I Phone
- mysql - mysql最后5条记录处于计数状态
- postfix-mta - Python smtplib.SMTP('localhost') 永远挂起