首页 > 解决方案 > 尝试使用 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();
}

标签: c#asp.net

解决方案


有一种方法可以将数据表中的数据导入 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 一起使用。


推荐阅读